mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.4 KiB
103 lines
2.4 KiB
'use strict';
|
|
|
|
const Buffer = require('buffer').Buffer;
|
|
const Writable = require('stream').Writable;
|
|
const errors = require('internal/errors');
|
|
const fs = require('fs');
|
|
const util = require('util');
|
|
|
|
const {
|
|
O_APPEND,
|
|
O_CREAT,
|
|
O_EXCL,
|
|
O_RDONLY,
|
|
O_RDWR,
|
|
O_SYNC,
|
|
O_TRUNC,
|
|
O_WRONLY
|
|
} = process.binding('constants').fs;
|
|
|
|
function assertEncoding(encoding) {
|
|
if (encoding && !Buffer.isEncoding(encoding)) {
|
|
throw new errors.TypeError('ERR_INVALID_OPT_VALUE_ENCODING', encoding);
|
|
}
|
|
}
|
|
|
|
function stringToFlags(flags) {
|
|
if (typeof flags === 'number') {
|
|
return flags;
|
|
}
|
|
|
|
switch (flags) {
|
|
case 'r' : return O_RDONLY;
|
|
case 'rs' : // Fall through.
|
|
case 'sr' : return O_RDONLY | O_SYNC;
|
|
case 'r+' : return O_RDWR;
|
|
case 'rs+' : // Fall through.
|
|
case 'sr+' : return O_RDWR | O_SYNC;
|
|
|
|
case 'w' : return O_TRUNC | O_CREAT | O_WRONLY;
|
|
case 'wx' : // Fall through.
|
|
case 'xw' : return O_TRUNC | O_CREAT | O_WRONLY | O_EXCL;
|
|
|
|
case 'w+' : return O_TRUNC | O_CREAT | O_RDWR;
|
|
case 'wx+': // Fall through.
|
|
case 'xw+': return O_TRUNC | O_CREAT | O_RDWR | O_EXCL;
|
|
|
|
case 'a' : return O_APPEND | O_CREAT | O_WRONLY;
|
|
case 'ax' : // Fall through.
|
|
case 'xa' : return O_APPEND | O_CREAT | O_WRONLY | O_EXCL;
|
|
|
|
case 'a+' : return O_APPEND | O_CREAT | O_RDWR;
|
|
case 'ax+': // Fall through.
|
|
case 'xa+': return O_APPEND | O_CREAT | O_RDWR | O_EXCL;
|
|
}
|
|
|
|
throw new errors.TypeError('ERR_INVALID_OPT_VALUE', 'flags', flags);
|
|
}
|
|
|
|
// Temporary hack for process.stdout and process.stderr when piped to files.
|
|
function SyncWriteStream(fd, options) {
|
|
Writable.call(this);
|
|
|
|
options = options || {};
|
|
|
|
this.fd = fd;
|
|
this.readable = false;
|
|
this.autoClose = options.autoClose === undefined ? true : options.autoClose;
|
|
|
|
this.on('end', () => this._destroy());
|
|
}
|
|
|
|
util.inherits(SyncWriteStream, Writable);
|
|
|
|
SyncWriteStream.prototype._write = function(chunk, encoding, cb) {
|
|
fs.writeSync(this.fd, chunk, 0, chunk.length);
|
|
cb();
|
|
return true;
|
|
};
|
|
|
|
SyncWriteStream.prototype._destroy = function() {
|
|
if (this.fd === null) // already destroy()ed
|
|
return;
|
|
|
|
if (this.autoClose)
|
|
fs.closeSync(this.fd);
|
|
|
|
this.fd = null;
|
|
return true;
|
|
};
|
|
|
|
SyncWriteStream.prototype.destroySoon =
|
|
SyncWriteStream.prototype.destroy = function() {
|
|
this._destroy();
|
|
this.emit('close');
|
|
return true;
|
|
};
|
|
|
|
module.exports = {
|
|
assertEncoding,
|
|
stringToFlags,
|
|
SyncWriteStream,
|
|
realpathCacheKey: Symbol('realpathCacheKey')
|
|
};
|
|
|