#endif
}
+#ifdef _LARGEFILE_SOURCE
+static inline int IsInt64(double x) {
+ return x == static_cast<double>(static_cast<int64_t>(x));
+}
+#endif
+
static int After(eio_req *req) {
HandleScope scope;
}
}
+#ifndef _LARGEFILE_SOURCE
+#define ASSERT_TRUNCATE_LENGTH(a) \
+ if (!(a)->IsUndefined() && !(a)->IsNull() && !(a)->IsUInt32()) { \
+ return ThrowException(Exception::TypeError(String::New("Not an integer"))); \
+ }
+#define GET_TRUNCATE_LENGTH(a) ((a)->UInt32Value())
+#else
+#define ASSERT_TRUNCATE_LENGTH(a) \
+ if (!(a)->IsUndefined() && !(a)->IsNull() && !IsInt64((a)->NumberValue())) { \
+ return ThrowException(Exception::TypeError(String::New("Not an integer"))); \
+ }
+#define GET_TRUNCATE_LENGTH(a) ((a)->IntegerValue())
+#endif
+
static Handle<Value> Truncate(const Arguments& args) {
HandleScope scope;
}
int fd = args[0]->Int32Value();
- off_t len = args[1]->Uint32Value();
+
+ ASSERT_TRUNCATE_LENGTH(args[1]);
+ off_t len = GET_TRUNCATE_LENGTH(args[1]);
if (args[2]->IsFunction()) {
ASYNC_CALL(ftruncate, args[2], fd, len)
}
}
-#define GET_OFFSET(a) (a)->IsInt32() ? (a)->IntegerValue() : -1;
+#ifndef _LARGEFILE_SOURCE
+#define ASSERT_OFFSET(a) \
+ if (!(a)->IsUndefined() && !(a)->IsNull() && !(a)->IsInt32()) { \
+ return ThrowException(Exception::TypeError(String::New("Not an integer"))); \
+ }
+#define GET_OFFSET(a) ((a)->IsNumber() ? (a)->Int32Value() : -1)
+#else
+#define ASSERT_OFFSET(a) \
+ if (!(a)->IsUndefined() && !(a)->IsNull() && !IsInt64((a)->NumberValue())) { \
+ return ThrowException(Exception::TypeError(String::New("Not an integer"))); \
+ }
+#define GET_OFFSET(a) ((a)->IsNumber() ? (a)->IntegerValue() : -1)
+#endif
// bytesWritten = write(fd, data, position, enc, callback)
// Wrapper for write(2).
String::New("Length is extends beyond buffer")));
}
+ ASSERT_OFFSET(args[4]);
off_t pos = GET_OFFSET(args[4]);
char * buf = (char*)buffer_data + off;
--- /dev/null
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+var path = require('path'),
+ fs = require('fs'),
+ filepath = path.join(common.tmpDir, 'large.txt'),
+ fd = fs.openSync(filepath, 'w+'),
+ offset = 5 * 1024 * 1024 * 1024, // 5GB
+ message = 'Large File';
+
+fs.truncateSync(fd, offset);
+assert.equal(fs.statSync(filepath).size, offset);
+var writeBuf = new Buffer(message);
+fs.writeSync(fd, writeBuf, 0, writeBuf.length, offset);
+var readBuf = new Buffer(writeBuf.length);
+fs.readSync(fd, readBuf, 0, readBuf.length, offset);
+assert.equal(readBuf.toString(), message);
+fs.readSync(fd, readBuf, 0, 1, 0);
+assert.equal(readBuf[0], 0);
+
+var exceptionRaised = false;
+try {
+ fs.writeSync(fd, writeBuf, 0, writeBuf.length, 42.000001);
+} catch (err) {
+ console.log(err);
+ exceptionRaised = true;
+ assert.equal(err.message, 'Not an integer');
+}
+assert.ok(exceptionRaised);
+fs.close(fd);
+
+process.on('exit', function() {
+ fs.unlink(filepath);
+});
+