fs: properly handle fd passed to truncate()
authorBruno Jouhier <bjouhier@gmail.com>
Sat, 7 Feb 2015 18:27:20 +0000 (19:27 +0100)
committercjihrig <cjihrig@gmail.com>
Sat, 21 Feb 2015 17:13:21 +0000 (12:13 -0500)
Currently, fs.truncate() silently fails when a file descriptor
is passed as the first argument. This commit changes this
behavior to properly call fs.ftruncate().

PR-URL: https://github.com/joyent/node/pull/9161
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Timothy J Fontaine <tjfontaine@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Conflicts:
lib/fs.js

doc/api/fs.markdown
lib/fs.js
test/parallel/test-fs-truncate-fd.js [new file with mode: 0644]

index fe78082..9b824b1 100644 (file)
@@ -106,7 +106,8 @@ Synchronous ftruncate(2).
 ## fs.truncate(path, len, callback)
 
 Asynchronous truncate(2). No arguments other than a possible exception are
-given to the completion callback.
+given to the completion callback. A file descriptor can also be passed as the
+first argument. In this case, `fs.ftruncate()` is called.
 
 ## fs.truncateSync(path, len)
 
index 7a89362..d4f7708 100644 (file)
--- a/lib/fs.js
+++ b/lib/fs.js
@@ -679,9 +679,7 @@ fs.renameSync = function(oldPath, newPath) {
 
 fs.truncate = function(path, len, callback) {
   if (typeof path === 'number') {
-    var req = new FSReqWrap();
-    req.oncomplete = callback;
-    return fs.ftruncate(path, len, req);
+    return fs.ftruncate(path, len, callback);
   }
   if (typeof len === 'function') {
     callback = len;
diff --git a/test/parallel/test-fs-truncate-fd.js b/test/parallel/test-fs-truncate-fd.js
new file mode 100644 (file)
index 0000000..6e9628d
--- /dev/null
@@ -0,0 +1,25 @@
+var common = require('../common');
+var assert = require('assert');
+var path = require('path');
+var fs = require('fs');
+var tmp = common.tmpDir;
+if (!fs.existsSync(tmp))
+  fs.mkdirSync(tmp);
+var filename = path.resolve(tmp, 'truncate-file.txt');
+
+var success = 0;
+
+fs.writeFileSync(filename, 'hello world', 'utf8');
+var fd = fs.openSync(filename, 'r+');
+fs.truncate(fd, 5, function(err) {
+  assert.ok(!err);
+  assert.equal(fs.readFileSync(filename, 'utf8'), 'hello');
+  success++;
+});
+
+process.on('exit', function() {
+  fs.closeSync(fd);
+  fs.unlinkSync(filename);
+  assert.equal(success, 1);
+  console.log('ok');
+});