| var common = require('./common'); |
| var os = require('os'); |
| var fs = require('fs'); |
| |
| // Returns false if 'dir' is not a writeable directory, 'dir' otherwise |
| function writeableDir(dir) { |
| if (!dir || !fs.existsSync(dir)) |
| return false; |
| |
| if (!fs.statSync(dir).isDirectory()) |
| return false; |
| |
| var testFile = dir+'/'+common.randomFileName(); |
| try { |
| fs.writeFileSync(testFile, ' '); |
| common.unlinkSync(testFile); |
| return dir; |
| } catch (e) { |
| return false; |
| } |
| } |
| |
| |
| //@ |
| //@ ### tempdir() |
| //@ |
| //@ Examples: |
| //@ |
| //@ ```javascript |
| //@ var tmp = tempdir(); // "/tmp" for most *nix platforms |
| //@ ``` |
| //@ |
| //@ Searches and returns string containing a writeable, platform-dependent temporary directory. |
| //@ Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). |
| function _tempDir() { |
| var state = common.state; |
| if (state.tempDir) |
| return state.tempDir; // from cache |
| |
| state.tempDir = writeableDir(os.tempDir && os.tempDir()) || // node 0.8+ |
| writeableDir(process.env['TMPDIR']) || |
| writeableDir(process.env['TEMP']) || |
| writeableDir(process.env['TMP']) || |
| writeableDir(process.env['Wimp$ScrapDir']) || // RiscOS |
| writeableDir('C:\\TEMP') || // Windows |
| writeableDir('C:\\TMP') || // Windows |
| writeableDir('\\TEMP') || // Windows |
| writeableDir('\\TMP') || // Windows |
| writeableDir('/tmp') || |
| writeableDir('/var/tmp') || |
| writeableDir('/usr/tmp') || |
| writeableDir('.'); // last resort |
| |
| return state.tempDir; |
| } |
| module.exports = _tempDir; |