diff --git a/index.js b/index.js index 47e9d1c..8ee9796 100644 --- a/index.js +++ b/index.js @@ -4,6 +4,7 @@ *==========================================================================*/ var ffi = require('ffi'); +var fs = require('fs'); var libc = ffi.Library(null, { // FILE* popen(char* cmd, char* mode); @@ -55,9 +56,63 @@ function stdout(cmd) { return result; } +var uniqIdK = 0; + +uniqId = function() { + var prefix; + prefix = 'tmp'; + return prefix + (new Date()).getTime() + '' + (uniqIdK++) + ('' + Math.random()).split('.').join(''); +}; + +tmpDir = function() { + var dir, name, _i, _len, _ref; + _ref = ['TMPDIR', 'TMP', 'TEMP']; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + name = _ref[_i]; + if (process.env[name] != null) { + dir = process.env[name]; + if (dir.charAt(dir.length - 1) === '/') { + return dir.substr(0, dir.length - 1); + } + return dir; + } + } + return '/tmp'; +}; + +getOutput = function(path) { + var output; + output = fs.readFileSync(path); + fs.unlinkSync(path); + output = "" + output; + if (output.charAt(output.length - 1) === "\n") { + output = output.substr(0, output.length - 1); + } + return output; +}; + +function exec(cmd) { + var code, dir, error, id, result, stderr, stdout; + + id = uniqId(); + stdout = id + '.stdout'; + stderr = id + '.stderr'; + dir = tmpDir(); + cmd = "" + cmd + " > " + dir + "/" + stdout + " 2> " + dir + "/" + stderr; + code = libc.system(cmd); + result = getOutput("" + dir + "/" + stdout); + error = getOutput("" + dir + "/" + stderr); + + return { + code: code, + stdout: result, + stderr: error + } +} module.exports = { code: code, - stdout: stdout + stdout: stdout, + exec: exec }; diff --git a/test/execSyncSpec.js b/test/execSyncSpec.js index 6c24931..deb26ac 100644 --- a/test/execSyncSpec.js +++ b/test/execSyncSpec.js @@ -21,11 +21,12 @@ describe('execSync', function() { assert.equal(code, 0); }); - // it('should get code, stdout and stderr', function() { - // var result = execSync.exec('echo foo; echo oops 1>&2; exit 42') - // assert.equal(result.stdout, 'foo'); - // assert.equal(result.stderr, 'oops'); - // assert.equal(result.code, 42); - // }); + it('should get code, stdout and stderr', function() { + var result = execSync.exec('echo foo; echo oops 1>&2; exit 42'); + console.log('result', result); + assert.equal(result.stdout, 'foo'); + assert.equal(result.stderr, 'oops'); + assert.equal(result.code, 42); + }); }); \ No newline at end of file