X-Git-Url: http://git.chise.org/gitweb/?p=chise%2Fxemacs-chise.git.1;a=blobdiff_plain;f=src%2Fnt.c;h=4b21a119588525c1036134338f0ba9ca4d9ded41;hp=45e9ae5bdf72e7d125a093851816c40153b2d38c;hb=2bf45e07013c281a55bc509b24f5e83568f3d0fd;hpb=41e784bb39d67f3906871511cb30805a71a6d6b3 diff --git a/src/nt.c b/src/nt.c index 45e9ae5..4b21a11 100644 --- a/src/nt.c +++ b/src/nt.c @@ -74,7 +74,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 ]; @@ -133,17 +133,14 @@ static struct passwd the_passwd = 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 @@ 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 * @@ -184,6 +185,12 @@ getpwnam (const char *name) 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 @@ 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 +290,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 +299,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 +355,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 +371,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 +548,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; @@ -1204,9 +1211,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 +1248,77 @@ convert_time (FILETIME ft) 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 +1396,15 @@ 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 */ +#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; @@ -1383,7 +1470,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 +1588,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 +1626,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; @@ -1917,7 +2003,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 +2025,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 +2043,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 */