X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fnt.c;h=bd14ddcfe829ea3096b77e1049b4a89cd75f7fad;hb=ced41746a0d554e40ec3b760134cbe11efa61c16;hp=0c99c25fc4de453e809dc9eea5871954689d79dd;hpb=ea21eb75bbf90355514d65686bd53bea579f8e23;p=chise%2Fxemacs-chise.git- diff --git a/src/nt.c b/src/nt.c index 0c99c25..bd14ddc 100644 --- a/src/nt.c +++ b/src/nt.c @@ -48,20 +48,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA #include #include -#ifndef __MINGW32__ #include -#else -typedef void (CALLBACK TIMECALLBACK)(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2); - -typedef TIMECALLBACK FAR *LPTIMECALLBACK; -DWORD WINAPI timeGetTime(void); -MMRESULT WINAPI timeSetEvent(UINT uDelay, UINT uResolution, - LPTIMECALLBACK fptc, DWORD dwUser, UINT fuEvent); -MMRESULT WINAPI timeKillEvent(UINT uTimerID); -MMRESULT WINAPI timeGetDevCaps(TIMECAPS* ptc, UINT cbtc); -MMRESULT WINAPI timeBeginPeriod(UINT uPeriod); -MMRESULT WINAPI timeEndPeriod(UINT uPeriod); -#endif #include "nt.h" #include @@ -74,7 +61,7 @@ extern Lisp_Object Vwin32_generate_fake_inodes; #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 ]; @@ -132,28 +119,25 @@ static struct passwd the_passwd = }; uid_t -getuid () -{ - return the_passwd.pw_uid; +getuid (void) +{ + return nt_fake_unix_uid; } uid_t -geteuid () +geteuid (void) { - /* 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 -getgid () +getgid (void) { return the_passwd.pw_gid; } gid_t -getegid () +getegid (void) { return getgid (); } @@ -161,9 +145,13 @@ getegid () 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 * @@ -182,8 +170,14 @@ getpwnam (const char *name) } void -init_user_info () +init_user_info (void) { + /* 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 +253,18 @@ init_user_info () 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 /* @@ -271,11 +277,8 @@ init_user_info () putenv ((GetVersion () & 0x80000000) ? "SHELL=command" : "SHELL=cmd"); /* Set dir and shell from environment variables. */ - strcpy (the_passwd.pw_dir, get_home_directory()); + strcpy (the_passwd.pw_dir, (char *)get_home_directory()); strcpy (the_passwd.pw_shell, getenv ("SHELL")); - - if (token) - CloseHandle (token); } /* Normalize filename by converting all path separators to @@ -283,9 +286,7 @@ init_user_info () case path name components to lower case. */ static void -normalize_filename (fp, path_sep) - REGISTER char *fp; - char path_sep; +normalize_filename (char *fp, char path_sep) { char sep; char *elem; @@ -341,16 +342,14 @@ normalize_filename (fp, path_sep) /* Destructively turn backslashes into slashes. */ void -dostounix_filename (p) - REGISTER char *p; +dostounix_filename (char *p) { normalize_filename (p, '/'); } /* Destructively turn slashes into backslashes. */ void -unixtodos_filename (p) - REGISTER char *p; +unixtodos_filename (char *p) { normalize_filename (p, '\\'); } @@ -359,10 +358,7 @@ unixtodos_filename (p) (From msdos.c...probably should figure out a way to share it, although this code isn't going to ever change.) */ int -crlf_to_lf (n, buf, lf_count) - REGISTER int n; - REGISTER unsigned char *buf; - REGISTER unsigned *lf_count; +crlf_to_lf (int n, unsigned char *buf, unsigned *lf_count) { unsigned char *np = buf; unsigned char *startp = buf; @@ -539,9 +535,7 @@ request_sigio (void) #define REG_ROOT "SOFTWARE\\GNU\\XEmacs" LPBYTE -nt_get_resource (key, lpdwtype) - char *key; - LPDWORD lpdwtype; +nt_get_resource (char *key, LPDWORD lpdwtype) { LPBYTE lpvalue; HKEY hrootkey = NULL; @@ -586,7 +580,7 @@ nt_get_resource (key, lpdwtype) } void -init_environment () +init_environment (void) { /* Check for environment variables and use registry if they don't exist */ { @@ -608,7 +602,7 @@ init_environment () "EMACSLOCKDIR", "INFOPATH" }; -#ifdef HEAP_IN_DATA +#if defined (HEAP_IN_DATA) && !defined(PDUMP) cache_system_info (); #endif for (i = 0; i < countof (env_vars); i++) @@ -1204,9 +1198,12 @@ sys_rename (const char * oldname, const char * newname) #endif /* 0 */ static FILETIME utc_base_ft; -static long double utc_base; static int init = 0; +#if 0 + +static long double utc_base; + time_t convert_time (FILETIME ft) { @@ -1238,6 +1235,86 @@ convert_time (FILETIME ft) ret -= utc_base; return (time_t) (ret * 1e-7); } +#else + +#if defined(__MINGW32__) && CYGWIN_VERSION_DLL_MAJOR <= 21 +#define LowPart u.LowPart +#define HighPart u.HighPart +#endif + +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 defined(__MINGW32__) && CYGWIN_VERSION_DLL_MAJOR <= 21 +#undef LowPart +#undef HighPart +#endif #if 0 /* in case we ever have need of this */ @@ -1315,9 +1392,21 @@ generate_inode_val (const char * name) #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 */ +/* #### aichner@ecf.teradyne.com reported that with the library + provided stat/fstat, (file-exist "d:\\tmp\\") =>> nil, + (file-exist "d:\\tmp") =>> t, when d:\tmp exists. Whenever + we opt to use non-encapsulated stat(), this should serve as + a compatibility test. --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; @@ -1331,7 +1420,7 @@ fstat (int handle, struct stat *buffer) buffer->st_ctime = 0; buffer->st_mtime = 0; buffer->st_nlink = 0; - ret = GetFileInformationByHandle((HANDLE) handle, &lpFileInfo); + ret = GetFileInformationByHandle((HANDLE) _get_osfhandle(handle), &lpFileInfo); if (!ret) { return -1; @@ -1383,7 +1472,7 @@ stat (const char * path, struct stat * buf) len = strlen (name); rootdir = (path >= name + len - 1 && (IS_DIRECTORY_SEP (*path) || *path == 0)); - name = strcpy (alloca (len + 2), name); + name = strcpy ((char *)alloca (len + 2), name); if (rootdir) { @@ -1501,14 +1590,12 @@ stat (const char * path, struct stat * buf) 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 +1628,7 @@ stat (const char * path, struct stat * buf) return 0; } +#endif /* defined(_MSC_VER) && _MSC_VER < 1100 */ /* From callproc.c */ extern Lisp_Object Vbinary_process_input; @@ -1581,7 +1669,7 @@ term_ntproc (int unused) } void -init_ntproc () +init_ntproc (void) { /* Initial preparation for subprocess support: replace our standard handles with non-inheritable versions. */ @@ -1917,7 +2005,7 @@ int setitimer (int kind, const struct itimerval* itnew, } int -open_input_file (file_data *p_file, CONST char *filename) +open_input_file (file_data *p_file, const char *filename) { HANDLE file; HANDLE file_mapping; @@ -1939,11 +2027,11 @@ open_input_file (file_data *p_file, CONST char *filename) if (file_base == 0) return FALSE; - p_file->name = (char*)filename; + p_file->name = (char *)filename; p_file->size = size; p_file->file = file; p_file->file_mapping = file_mapping; - p_file->file_base = file_base; + p_file->file_base = (char *)file_base; return TRUE; } @@ -1957,4 +2045,16 @@ close_file_data (file_data *p_file) 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 */