1 /* vim: set syntax=javascript ts=8 sts=8 sw=8 noet: */ 2 3 var BINDING = require('./lockfd_binding'); 4 5 function 6 check_arg(pos, name, value, type) 7 { 8 if (typeof (value) !== type) { 9 throw (new Error('argument #' + pos + ' (' + name + 10 ') must be of type ' + type)); 11 } 12 } 13 14 function 15 lockfd(fd, callback) 16 { 17 check_arg(1, 'fd', fd, 'number'); 18 check_arg(2, 'callback', callback, 'function'); 19 20 BINDING.lock_fd(fd, "write", false, function (ret, errno, errmsg) { 21 if (ret === -1) { 22 var err = new Error('File Locking Error: ' + errmsg); 23 err.__errno = errno; 24 25 callback(err); 26 return; 27 } 28 29 callback(null); 30 }); 31 } 32 33 function 34 lockfdSync(fd) 35 { 36 var cb_fired = false; 37 var err; 38 39 check_arg(1, 'fd', fd, 'number'); 40 41 BINDING.lock_fd(fd, "write", true, function (ret, errno, errmsg) { 42 cb_fired = true; 43 44 if (ret === -1) { 45 err = new Error('File Locking Error: ' + errmsg); 46 err.__errno = errno; 47 return; 48 } 49 }); 50 51 if (!cb_fired) { 52 throw (new Error('lockfdSync: CALLBACK NOT FIRED')); 53 } else if (err) { 54 throw (err); 55 } 56 57 return (null); 58 } 59 60 module.exports = { 61 lockfd: lockfd, 62 lockfdSync: lockfdSync 63 };