Mercurial > hg > xemacs-beta
diff src/nt.c @ 440:8de8e3f6228a r21-2-28
Import from CVS: tag r21-2-28
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:33:38 +0200 |
parents | 080151679be2 |
children | abe6d1db359e |
line wrap: on
line diff
--- a/src/nt.c Mon Aug 13 11:32:27 2007 +0200 +++ b/src/nt.c Mon Aug 13 11:33:38 2007 +0200 @@ -74,7 +74,7 @@ #endif extern Lisp_Object Vmswindows_get_true_file_attributes; -extern char *get_home_directory(void); +int nt_fake_unix_uid; static char startup_dir[ MAXPATHLEN ]; @@ -133,17 +133,14 @@ uid_t getuid () -{ - return the_passwd.pw_uid; +{ + return nt_fake_unix_uid; } uid_t geteuid () { - /* I could imagine arguing for checking to see whether the user is - in the Administrators group and returning a UID of 0 for that - case, but I don't know how wise that would be in the long run. */ - return getuid (); + return nt_fake_unix_uid; } gid_t @@ -161,9 +158,13 @@ struct passwd * getpwuid (uid_t uid) { - if (uid == the_passwd.pw_uid) - return &the_passwd; - return NULL; + if (uid == nt_fake_unix_uid) + { + the_passwd.pw_gid = the_passwd.pw_uid = uid; + return &the_passwd; + } + else + return NULL; } struct passwd * @@ -184,6 +185,12 @@ void init_user_info () { + /* This code is pretty much of ad hoc nature. There is no unix-like + UIDs under Windows NT. There is no concept of root user, because + all security is ACL-based. Instead, let's use a simple variable, + nt-fake-unix-uid, which would allow the user to have a uid of + choice. --kkm, 02/03/2000 */ +#if 0 /* Find the user's real name by opening the process token and looking up the name associated with the user-sid in that token. @@ -259,6 +266,18 @@ the_passwd.pw_gid = 123; } + if (token) + CloseHandle (token); +#else + /* Obtain only logon id here, uid part is moved to getuid */ + char name[256]; + DWORD length = sizeof (name); + if (GetUserName (name, &length)) + strcpy (the_passwd.pw_name, name); + else + strcpy (the_passwd.pw_name, "unknown"); +#endif + /* Ensure HOME and SHELL are defined. */ #if 0 /* @@ -273,9 +292,6 @@ /* Set dir and shell from environment variables. */ strcpy (the_passwd.pw_dir, get_home_directory()); strcpy (the_passwd.pw_shell, getenv ("SHELL")); - - if (token) - CloseHandle (token); } /* Normalize filename by converting all path separators to @@ -1204,8 +1220,11 @@ #endif /* 0 */ static FILETIME utc_base_ft; +static int init = 0; + +#if 0 + static long double utc_base; -static int init = 0; time_t convert_time (FILETIME ft) @@ -1238,6 +1257,77 @@ ret -= utc_base; return (time_t) (ret * 1e-7); } +#else + +static LARGE_INTEGER utc_base_li; + +time_t +convert_time (FILETIME uft) +{ + time_t ret; +#ifndef MAXLONGLONG + SYSTEMTIME st; + struct tm t; + FILETIME ft; + TIME_ZONE_INFORMATION tzi; + DWORD tzid; +#else + LARGE_INTEGER lft; +#endif + + if (!init) + { + /* Determine the delta between 1-Jan-1601 and 1-Jan-1970. */ + SYSTEMTIME st; + + st.wYear = 1970; + st.wMonth = 1; + st.wDay = 1; + st.wHour = 0; + st.wMinute = 0; + st.wSecond = 0; + st.wMilliseconds = 0; + + SystemTimeToFileTime (&st, &utc_base_ft); + + utc_base_li.LowPart = utc_base_ft.dwLowDateTime; + utc_base_li.HighPart = utc_base_ft.dwHighDateTime; + + init = 1; + } + +#ifdef MAXLONGLONG + + /* On a compiler that supports long integers, do it the easy way */ + lft.LowPart = uft.dwLowDateTime; + lft.HighPart = uft.dwHighDateTime; + ret = (time_t) ((lft.QuadPart - utc_base_li.QuadPart) / 10000000); + +#else + + /* Do it the hard way using mktime. */ + FileTimeToLocalFileTime(&uft, &ft); + FileTimeToSystemTime (&ft, &st); + tzid = GetTimeZoneInformation (&tzi); + t.tm_year = st.wYear - 1900; + t.tm_mon = st.wMonth - 1; + t.tm_mday = st.wDay; + t.tm_hour = st.wHour; + t.tm_min = st.wMinute; + t.tm_sec = st.wSecond; + t.tm_isdst = (tzid == TIME_ZONE_ID_DAYLIGHT); + /* st.wMilliseconds not applicable */ + ret = mktime(&t); + if (ret == -1) + { + ret = 0; + } + +#endif + + return ret; +} +#endif #if 0 /* in case we ever have need of this */ @@ -1315,9 +1405,15 @@ #endif +/* stat has been fixed since MSVC 5.0. + Oh, and do not encapsulater stat for non-MS compilers, too */ +/* #### popineau@ese-metz.fr says they still might be broken. + Oh well... Let's add that `1 ||' condition.... --kkm */ +#if 1 || defined(_MSC_VER) && _MSC_VER < 1100 + /* Since stat is encapsulated on Windows NT, we need to encapsulate the equally broken fstat as well. */ -int +int _cdecl fstat (int handle, struct stat *buffer) { int ret; @@ -1501,14 +1597,12 @@ buf->st_ino = (unsigned short) (fake_inode ^ (fake_inode >> 16)); /* consider files to belong to current user */ - buf->st_uid = the_passwd.pw_uid; - buf->st_gid = the_passwd.pw_gid; + buf->st_uid = buf->st_gid = nt_fake_unix_uid; /* volume_info is set indirectly by map_win32_filename */ buf->st_dev = volume_info.serialnum; buf->st_rdev = volume_info.serialnum; - buf->st_size = wfd.nFileSizeLow; /* Convert timestamps to Unix format. */ @@ -1541,6 +1635,7 @@ return 0; } +#endif /* defined(_MSC_VER) && _MSC_VER < 1100 */ /* From callproc.c */ extern Lisp_Object Vbinary_process_input; @@ -1957,4 +2052,16 @@ CloseHandle (p_file->file); } +void +vars_of_nt (void) +{ + DEFVAR_INT ("nt-fake-unix-uid", &nt_fake_unix_uid /* +*Set uid returned by `user-uid' and `user-real-uid'. +Under NT and 9x, there is no uids, and even no almighty user called root. +By setting this variable, you can have any uid of choice. Default is 0. +Changes to this variable take effect immediately. +*/ ); + nt_fake_unix_uid = 0; +} + /* end of nt.c */