Browse Source

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 <cjihrig@gmail.com>
Reviewed-By: Timothy J Fontaine <tjfontaine@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>

Conflicts:
	lib/fs.js
v1.8.0-commit
Bruno Jouhier 10 years ago
committed by cjihrig
parent
commit
c82e580a50
  1. 3
      doc/api/fs.markdown
  2. 4
      lib/fs.js
  3. 25
      test/parallel/test-fs-truncate-fd.js

3
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)

4
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;

25
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');
});
Loading…
Cancel
Save