From c82e580a5019b460350457198054e41dfaa5fc0c Mon Sep 17 00:00:00 2001 From: Bruno Jouhier Date: Sat, 7 Feb 2015 19:27:20 +0100 Subject: [PATCH] fs: properly handle fd passed to truncate() 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 Reviewed-By: Timothy J Fontaine Reviewed-By: Ben Noordhuis Conflicts: lib/fs.js --- doc/api/fs.markdown | 3 ++- lib/fs.js | 4 +--- test/parallel/test-fs-truncate-fd.js | 25 +++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 test/parallel/test-fs-truncate-fd.js diff --git a/doc/api/fs.markdown b/doc/api/fs.markdown index fe78082..9b824b1 100644 --- a/doc/api/fs.markdown +++ b/doc/api/fs.markdown @@ -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) diff --git a/lib/fs.js b/lib/fs.js index 7a89362..d4f7708 100644 --- 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 index 0000000..6e9628d --- /dev/null +++ b/test/parallel/test-fs-truncate-fd.js @@ -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'); +}); -- 2.7.4