|
|
- 'use strict';
-
- var fs = require('fs');
- var parse = require('parse-passwd');
-
- function homedir() {
- // The following logic is from looking at logic used in the different platform
- // versions of the uv_os_homedir function found in https://github.com/libuv/libuv
- // This is the function used in modern versions of node.js
-
- if (process.platform === 'win32') {
- // check the USERPROFILE first
- if (process.env.USERPROFILE) {
- return process.env.USERPROFILE;
- }
-
- // check HOMEDRIVE and HOMEPATH
- if (process.env.HOMEDRIVE && process.env.HOMEPATH) {
- return process.env.HOMEDRIVE + process.env.HOMEPATH;
- }
-
- // fallback to HOME
- if (process.env.HOME) {
- return process.env.HOME;
- }
-
- return null;
- }
-
- // check HOME environment variable first
- if (process.env.HOME) {
- return process.env.HOME;
- }
-
- // on linux platforms (including OSX) find the current user and get their homedir from the /etc/passwd file
- var passwd = tryReadFileSync('/etc/passwd');
- var home = find(parse(passwd), getuid());
- if (home) {
- return home;
- }
-
- // fallback to using user environment variables
- var user = process.env.LOGNAME || process.env.USER || process.env.LNAME || process.env.USERNAME;
-
- if (!user) {
- return null;
- }
-
- if (process.platform === 'darwin') {
- return '/Users/' + user;
- }
-
- return '/home/' + user;
- }
-
- function find(arr, uid) {
- var len = arr.length;
- for (var i = 0; i < len; i++) {
- if (+arr[i].uid === uid) {
- return arr[i].homedir;
- }
- }
- }
-
- function getuid() {
- if (typeof process.geteuid === 'function') {
- return process.geteuid();
- }
- return process.getuid();
- }
-
- function tryReadFileSync(fp) {
- try {
- return fs.readFileSync(fp, 'utf8');
- } catch (err) {
- return '';
- }
- }
-
- module.exports = homedir;
-
|