diff options
author | Christopher Faylor <me@cgf.cx> | 2003-09-11 04:47:23 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2003-09-11 04:47:23 +0000 |
commit | 0292b97d791876ee53c0e0eb719d94db62c37eb6 (patch) | |
tree | 5fee26924afd47f480a0a68ca40dce1513a9f097 | |
parent | 8b193160f465a6691ff18e30d0fd85c985384236 (diff) | |
download | newlib-0292b97d791876ee53c0e0eb719d94db62c37eb6.zip newlib-0292b97d791876ee53c0e0eb719d94db62c37eb6.tar.gz newlib-0292b97d791876ee53c0e0eb719d94db62c37eb6.tar.bz2 |
merge from trunk
-rw-r--r-- | winsup/cygwin/ChangeLog | 301 | ||||
-rw-r--r-- | winsup/cygwin/Makefile.in | 20 | ||||
-rw-r--r-- | winsup/cygwin/cygheap.h | 1 | ||||
-rw-r--r-- | winsup/cygwin/cygwin.din | 11 | ||||
-rw-r--r-- | winsup/cygwin/dir.cc | 2 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_disk_file.cc | 27 | ||||
-rw-r--r-- | winsup/cygwin/include/cygwin/version.h | 4 | ||||
-rw-r--r-- | winsup/cygwin/include/getopt.h | 12 | ||||
-rw-r--r-- | winsup/cygwin/lib/getopt.c | 503 | ||||
-rw-r--r-- | winsup/cygwin/lib/iruserok.c | 319 | ||||
-rw-r--r-- | winsup/cygwin/registry.cc | 4 | ||||
-rw-r--r-- | winsup/cygwin/security.h | 6 | ||||
-rw-r--r-- | winsup/cygwin/shared.cc | 93 | ||||
-rw-r--r-- | winsup/cygwin/shared_info.h | 10 | ||||
-rw-r--r-- | winsup/cygwin/spawn.cc | 3 | ||||
-rw-r--r-- | winsup/cygwin/syscalls.cc | 21 | ||||
-rw-r--r-- | winsup/cygwin/uinfo.cc | 80 | ||||
-rw-r--r-- | winsup/cygwin/winsup.h | 8 |
18 files changed, 488 insertions, 937 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index a1e8650..6522e51 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,304 @@ +2003-09-10 Pierre Humblet <pierre.humblet@ieee.org> + + * shared_info.h (shared_info::initialize): Remove argument. + * cygheap.h (cygheap_user::init): New declaration. + * uinfo.cc (cygheap_user::init): New. + (internal_getlogin): Move functionality to cygheap_user::init. Open + the process token to update the group sid. + * shared.cc (user_shared_initialize): Get the user information from + cygheap->user. + (shared_info::initialize): Remove argument. Call cygheap->user.init + instead of cygheap->user.set_name. + (memory_init): Do not get the user name and do not pass it to + shared_info::initialize. + * registry.cc (get_registry_hive_path): Make csid a cygpsid. + (load_registry_hive): Ditto. + +2003-09-10 Christopher Faylor <cgf@redhat.com> + + * fhandler_disk_file.cc (num_entries): Take . and .. into account if + they do not exist since cygwin simulates them. + (fhandler_cygdrive::fstat): Ditto. + (fhandler_cygdrive::readdir): Don't do any specific tests on + __d_position when seeing if a drive exists. + +2003-09-10 Corinna Vinschen <corinna@vinschen.de> + + * Makefile.in (DLL_OFILES): Add getopt.o and iruserok.o. + * cygwin.din: Export __check_rhosts_file, __rcmd_errstr, optarg, + opterr, optind, optopt, optreset, getopt, getopt_long, iruserok + and ruserok. + * getopt.c: Moved from lib to here. Define opt* variables as + dllexport. + * iruserok.c: Moved from lib to here. Rearrange function order. + Prefer using 64/32 bit functions. + * syscalls.cc (shell_fp): Define as struct __sFILE64. + (getusershell): Use fopen64 instead of fopen. + * winsup.h: Add declarations for seteuid32, fopen64, + cygwin_gethostbyname and cygwin_inet_addr. + * include/getopt.h: Declare opt* variables dllimport. + * include/cygwin/version.h: Bump API minor number. + +2003-09-10 Christopher Faylor <cgf@redhat.com> + + * exceptions.cc (sig_handle_tty_stop): Check parent PID_NOCLDSTOP + rather than erroneously checking *my own* sigtodo. + +2003-09-10 Christopher Faylor <cgf@redhat.com> + + * Makefile.in: Add some more -fomit-frame-pointer files. + + * path.cc (conv_path_list_buf_size): Free normalized_path or suffer + memory leak. + * syscalls.cc (chroot): Ditto. + +2003-09-10 Corinna Vinschen <corinna@vinschen.de> + + * Makefile.in (DLL_OFILES): Add bsdlib.o. + * autoload.cc (RegisterServiceProcess): Add. + * bsdlib.cc: New file. + (daemon): New function. + (login_tty): Ditto. + (openpty): Ditto. + (forkpty): Ditto. + * cygwin.din: Export daemon, forkpty, login_tty, logwtmp, updwtmp, + openpty and revoke. + * syscalls.cc (updwtmp): New function, writing to wtmp exclusively. + (logwtmp): Ditto. + (login): Call updwtmp instead of writing to wtmp by itself. + (logout): Ditto. + * tty.cc (revoke): New funtion. + * include/paths.h: Define _PATH_DEVNULL. + * include/pty.h: New header. + * include/cygwin/version.h: Bump API minor number. + * include/sys/utmp.h: Declare logwtmp with const arguments. + Declare updwtmp. + * lib/iruserok.c: New file. + (ruserok): New function. + (iruserok): Ditto. + (__ivaliduser): Ditto. + (__icheckhost): Ditto. + +2003-09-10 Corinna Vinschen <corinna@vinschen.de> + + * fhandler_socket.cc (fhandler_socket::fstat): Don't use PC_POSIX. + +2003-09-09 Pierre Humblet <pierre.humblet@ieee.org> + + * shared_info.h: Include security.h. + (open_shared): Add psa argument. + (user_shared_initialize): New declaration. + * security.h: Add _SECURITY_H guard. + (sec_user): Use sec_none in the no ntsec case. + * spawn.cc (spawn_guts): Remove call to load_registry_hive. + * syscalls (seteuid32): If warranted, call load_registry_hive, + user_shared_initialize and RegCloseKey(HKEY_CURRENT_USER). + * shared.cc (user_shared_initialize): New. + (open_shared): Add and use psa argument. + (memory_init): Move mount table initialization to + user_shared_initialize. Call it. + +2003-09-09 Corinna Vinschen <corinna@vinschen.de> + + * mmap.cc (mmap64): Change address types from caddr_t to void * + according to SUSv3. + (mmap): Ditto. + (munmap): Ditto. + (msync): Ditto. + (mprotect): Ditto. Move to before the fhandler methods. + * include/sys/mman.h: Change prototypes accordingly. + +2003-09-08 Christopher Faylor <cgf@redhat.com> + + * dcrt0.cc (dlL_crt0_1): Set __argc_safe after __argc is absolutely + know to be set. + * exceptions.cc (sig_handle_tty_stop): Don't reset sigCONT event since + it is reset automatically. + * fork.cc (fork): Remove obsolete usage of PID_SPLIT_HEAP. + * include/sys/cygwin.h: Ditto. + * sigproc.cc (sig_send): Use sigframe init method to set frame since it + checks for previous ownership of the frame. + * sigproc.h (sigframe::init): Accept an "is_exception" argument. + +2003-09-08 Christopher Faylor <cgf@redhat.com> + + * dir.cc (readdir): Reinstate setting of old ino field for legacy + applications. + * dirent.h (dirent): Rename unused field to __ino32. + +2003-09-08 Christopher Faylor <cgf@redhat.com> + + * passwd.cc (getpwnam_r): Initialize pw_comment field. + +2003-09-08 Christopher Faylor <cgf@redhat.com> + + * passwd.cc (getpwuid_r32): Initialize pw_comment field. + +2003-09-08 Christopher Faylor <cgf@redhat.com> + + * sigproc.cc (wait_sig_inited): Remove assertion since it is racy. + +2003-09-08 Corinna Vinschen <corinna@vinschen.de> + + * cygwin.din: Export endusershell, getusershell and setusershell. + * syscalls.cc (getusershell): New function. + (setusershell): Ditto. + (endusershell): Ditto. + * include/cygwin/version.h: Bump API minor number. + +2003-09-08 Nicholas Wourms <nwourms@netscape.net> + + * cygwin.din: Export argz_add argz_add_sep argz_append argz_count + argz_create argz_create_sep argz_delete argz_extract argz_insert + argz_next argz_replace argz_stringify envz_add envz_entry envz_get + envz_merge envz_remove envz_strip + * include/cygwin/version.h: Bump api minor number. + +2003-09-07 Christopher Faylor <cgf@redhat.com> + + Throughout, remove __d_u.__d_data fields from DIR structure. + * include/sys/dirent.h (dirent): Remvoe old_d_ino. + (DIR): Make __d_dirhash a 64 bit value. Remove __d_data and __d_u. + Add __flags. + * dir.cc (opendir_states): New enum. + (opendir): Clear new DIR __flags field. + (readdir): Fill in '.' and '..' entries if we hit EOF and we haven't + seen them already. Nuke setting of old_d_ino. + (rewinddir): Reset DIR __flags field. + (seekdir64): Ditto. + * fhandler_disk_file.cc (fhandler_cygdrive::fhandler_cygdrive): Remove + special handling of "." and ".." since they are now handled + automatically. + +2003-09-07 Christopher Faylor <cgf@redhat.com> + + * include/cygwin/in.h: Don't define ipv6 stuff unless we call for it + specifically since it isn't really implemented yet. + +2003-09-07 Christopher Faylor <cgf@redhat.com> + + * cygheap.cc (_csbrk): More left coercion cleanup. + * fhandler_tty.cc (fhandler_tty_slave::read): Ditto. + (fhandler_tty_slave::write): Ditto. + * fhandler_windows.cc (fhandler_windows::read): Ditto. + * heap.cc (sbrk): Ditto. + +2003-09-07 Pierre Humblet <pierre.humblet@ieee.org> + + * signal.cc (nanosleep): Improve test for valid values. Round delay up + to resolution. Fix test for negative remainder. Use timeGetTime + through gtod. + (sleep): Round up return value. + +2003-09-07 Pierre Humblet <pierre.humblet@ieee.org> + Christopher Faylor <cgf@redhat.com> + + * hires.h (HIRES_DELAY_MAX): Define. + (hires_ms::minperiod): Declare static. + (hires_ms::resolution): New. + (hires_ms::dmsecs): New. + (hires_ms::prime): Return UINT. + (gtod): Declare. + * times.cc (hires_ms::prime): Always calculate minperiod and set it to + 1 in case of failure. Return minperiod. + (hires_ms::resolution): Define. + (hires_ms::~hires_ms): Delete. + (hires_ms::usecs): Check minperiod to prime. + (gtod) Define as global. + +2003-09-06 Christopher Faylor <cgf@redhat.com> + + Remove left coercion throughout. + +2003-09-04 Pierre Humblet <pierre.humblet@ieee.org> + + * hires.h (hires_ms::~hires_ms): Delete declaration. + * times.cc (hires_ms::~hires_ms): Delete definition.. + +2003-09-04 Christopher Faylor <cgf@redhat.com> + + * dcrt0.cc (__argc_safe): New variable. + (dll_crt0_1): Store argc in __argc_safe, which will theoretically + remain untouched by the user. + * fhandler_console.cc (fhandler_console::read): Silence some compiler + warnings. + * fhandler_raw.cc (fhandler_dev_raw::raw_read): Ditto. + * pinfo.cc (_pinfo::commune_recv): Carefully bound argv scan and check + for potentially bad pointers since user could have set argv cell to + anythinw. + * cygheap.h (CYGHEAPSIZE): Bump up size. + +2003-09-04 Corinna Vinschen <corinna@vinschen.de> + + * sysconf.cc (sysconf): Return more accurate value for _SC_AVPHYS_PAGES. + +2003-09-04 Corinna Vinschen <corinna@vinschen.de> + + * mmap.cc: Restructure. Add, remove and rewrite comments throughout + for better readability. Change function names for better + understanding. + (MAP_SET): Accomodate name change from map_map_ to page_map_. + (MAP_CLR): Ditto. + (MAP_ISSET): Ditto. + (mmap_record::page_map_): Rename from page_map_. + (mmap_record::get_map): Remove. + (mmap_record::alloc_page_map): Rename from alloc_map. Return bool + indicating success of cygheap memory allocation. + (mmap_record::free_page_map): Rename from free_map. + (mmap_record::fixup_page_map): Rename from fixup_map. + (mmap_record::find_unused_pages): Rename from find_empty. + (mmap_record::map_pages): Rename from map_map. + (mmap_record::unmap_pages): Rename from unmap_map. + (class list): Make all class members private. + (list::list): Remove. + (list::~list): Remove. + (list::get_fd): New attribute reader. + (list::get_hash): Ditto. + (list::get_record): Ditto. + (list::add_record): Manage all allocation for mmap_records. Check + for failed memory allocation and return NULL if so. + (list::set): New function. + (list::del_record): Rename from erase. Return true if last mmap_record + has been deleted, false otherwise. Check for legal incoming index + value. + (list::erase): Remove erase/0. + (list::search_record): Rename from match. + (map::map): Remove. + (map::~map): Remove. + (map::add_list): Manage all allocation for lists. Check for failed + memory allocation and return NULL if so. + (map::get_list): New method. + (map::del_list): Rename from erase. Check for legal incoming index + value. + (mmap64): Check for failed mmap_record memory allocation. Return + with MAP_FAILED and errno set to ENOMEM if so. + (munmap): Rearrange loop using new list and mmap_record accessor + functions. Rename loop index variables for better understanding. + Check if list can be deleted after last mmap_record in it has been + deleted. + (msync): Rearrange loop using new list and mmap_record accessor + functions. Rename loop index variables for better understanding. + (fixup_mmaps_after_fork): Ditto. + +2003-09-03 Christopher Faylor <cgf@redhat.com> + + * cxx.cc (new): Fix formatting. Just return result of ccalloc rather + than calling memset explicitly. + +2003-09-03 Christopher Faylor <cgf@redhat.com> + + * exceptions.cc (set_process_mask): Set pending signals only when + signals become unmasked. + * sigproc.cc (pending_signals): Flip back to a global. + (wait_sig): Don't set pending signals when there is an armed semaphore + or signal is blocked. + + * shared.cc (shared_info::initialize): Add a username parameter for + user-mode mounts. Reorganize to try to avoid startup race. + (memory_init): Move some stuff into shared_info::initialize. + * shared_info.h (shared_info::initialize): Change declaration. + (CURR_SHARED_MAGIC): Update. + 2003-09-01 Christopher Faylor <cgf@redhat.com> * include/cygwin/version.h: Bump DLL minor number to 4. diff --git a/winsup/cygwin/Makefile.in b/winsup/cygwin/Makefile.in index 30a7522..a0611c8 100644 --- a/winsup/cygwin/Makefile.in +++ b/winsup/cygwin/Makefile.in @@ -148,7 +148,7 @@ DLL_IMPORTS:=$(w32api_lib)/libkernel32.a MT_SAFE_OBJECTS:= # Please maintain this list in sorted order, with maximum files per 80 col line -DLL_OFILES:=assert.o autoload.o cxx.o bsdlib.o cygheap.o cygthread.o dcrt0.o \ +DLL_OFILES:=assert.o autoload.o bsdlib.o cxx.o cygheap.o cygthread.o dcrt0.o \ debug.o delqueue.o devices.o dir.o dlfcn.o dll_init.o dtable.o environ.o \ errno.o exceptions.o exec.o external.o fcntl.o fhandler.o \ fhandler_clipboard.o fhandler_console.o fhandler_disk_file.o \ @@ -157,15 +157,15 @@ DLL_OFILES:=assert.o autoload.o cxx.o bsdlib.o cygheap.o cygthread.o dcrt0.o \ fhandler_random.o fhandler_raw.o fhandler_registry.o fhandler_serial.o \ fhandler_socket.o fhandler_tape.o fhandler_termios.o \ fhandler_tty.o fhandler_virtual.o fhandler_windows.o \ - fhandler_zero.o fnmatch.o fork.o glob.o grp.o heap.o init.o ioctl.o \ - ipc.o localtime.o malloc_wrapper.o miscfuncs.o mmap.o msg.o \ - net.o netdb.o ntea.o passwd.o path.o pinfo.o pipe.o poll.o pthread.o \ - regcomp.o regerror.o regexec.o regfree.o registry.o resource.o \ - scandir.o sched.o sec_acl.o sec_helper.o security.o select.o sem.o \ - shared.o shm.o signal.o sigproc.o smallprint.o spawn.o strace.o \ - strsep.o sync.o syscalls.o sysconf.o syslog.o termios.o thread.o \ - times.o tty.o uinfo.o uname.o v8_regexp.o v8_regerror.o v8_regsub.o \ - wait.o wincap.o window.o \ + fhandler_zero.o fnmatch.o fork.o getopt.o glob.o grp.o heap.o init.o \ + ioctl.o ipc.o iruserok.o localtime.o malloc_wrapper.o miscfuncs.o \ + mmap.o msg.o net.o netdb.o ntea.o passwd.o path.o pinfo.o pipe.o \ + poll.o pthread.o regcomp.o regerror.o regexec.o regfree.o registry.o \ + resource.o scandir.o sched.o sec_acl.o sec_helper.o security.o \ + select.o sem.o shared.o shm.o signal.o sigproc.o smallprint.o spawn.o \ + strace.o strsep.o sync.o syscalls.o sysconf.o syslog.o termios.o \ + thread.o times.o tty.o uinfo.o uname.o v8_regexp.o v8_regerror.o \ + v8_regsub.o wait.o wincap.o window.o \ $(EXTRA_DLL_OFILES) $(EXTRA_OFILES) $(MALLOC_OFILES) $(MT_SAFE_OBJECTS) GMON_OFILES:=gmon.o mcount.o profil.o diff --git a/winsup/cygwin/cygheap.h b/winsup/cygwin/cygheap.h index a06ee92..84d983e 100644 --- a/winsup/cygwin/cygheap.h +++ b/winsup/cygwin/cygheap.h @@ -134,6 +134,7 @@ public: ~cygheap_user (); + void init (); void set_name (const char *new_name); const char *name () const { return pname; } diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din index 227d135..a61edbd 100644 --- a/winsup/cygwin/cygwin.din +++ b/winsup/cygwin/cygwin.din @@ -3,10 +3,12 @@ LIBRARY "cygwin1.dll" BASE=0x61000000 EXPORTS __argc DATA __argv DATA +__check_rhosts_file DATA __cygwin_environ DATA __cygwin_user_data DATA __mb_cur_max DATA __progname DATA +__rcmd_errstr DATA _check_for_executable DATA _ctype_ DATA _daylight DATA @@ -17,6 +19,11 @@ sys_nerr = _sys_nerr DATA _timezone DATA _tzname DATA h_errno DATA +optarg DATA +opterr DATA +optind DATA +optopt DATA +optreset DATA reent_data DATA @ALLOCA@ @DEF_DLL_ENTRY@ @@ -617,6 +624,8 @@ getmntent _getmntent = getmntent getmode _getmode = getmode +getopt +getopt_long getpagesize _getpagesize = getpagesize getpass @@ -704,6 +713,8 @@ ioctl _ioctl = ioctl iprintf _iprintf = iprintf +iruserok +ruserok isalnum _isalnum = isalnum isalpha diff --git a/winsup/cygwin/dir.cc b/winsup/cygwin/dir.cc index 902746e..36cabbd 100644 --- a/winsup/cygwin/dir.cc +++ b/winsup/cygwin/dir.cc @@ -127,12 +127,14 @@ readdir (DIR *dir) res = dir->__d_dirent; strcpy (res->d_name, "."); dir->__flags |= opendir_saw_dot; + dir->__d_position++; } else if (!(dir->__flags & opendir_saw_dot_dot)) { res = dir->__d_dirent; strcpy (res->d_name, ".."); dir->__flags |= opendir_saw_dot_dot; + dir->__d_position++; } } diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index b034e1f..93b0606 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -53,14 +53,18 @@ num_entries (const char *win32_name) if (handle == INVALID_HANDLE_VALUE) return 2; /* 2 is the minimum number of links to a dir, so... */ - count ++; + int saw_dot = 2; while (FindNextFileA (handle, &buf)) { - if ((buf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) - count ++; + if (buf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + count++; + if (buf.cFileName[0] == '.' + && (buf.cFileName[1] == '\0' + || (buf.cFileName[1] == '.' && buf.cFileName[2] == '\0'))) + saw_dot--; } FindClose (handle); - return count; + return count + saw_dot; } int __stdcall @@ -761,7 +765,7 @@ fhandler_cygdrive::fstat (struct __stat64 *buf) buf->st_mode = S_IFDIR | 0555; if (!ndrives) set_drives (); - buf->st_nlink = ndrives; + buf->st_nlink = ndrives + 2; return 0; } @@ -784,19 +788,14 @@ fhandler_cygdrive::readdir (DIR *dir) return fhandler_disk_file::readdir (dir); if (!pdrive || !*pdrive) return NULL; - else if (dir->__d_position > 1 - && GetFileAttributes (pdrive) == INVALID_FILE_ATTRIBUTES) + if (GetFileAttributes (pdrive) == INVALID_FILE_ATTRIBUTES) { pdrive = strchr (pdrive, '\0') + 1; return readdir (dir); } - else if (*pdrive == '.') - strcpy (dir->__d_dirent->d_name, pdrive); - else - { - *dir->__d_dirent->d_name = cyg_tolower (*pdrive); - dir->__d_dirent->d_name[1] = '\0'; - } + + *dir->__d_dirent->d_name = cyg_tolower (*pdrive); + dir->__d_dirent->d_name[1] = '\0'; dir->__d_position++; pdrive = strchr (pdrive, '\0') + 1; syscall_printf ("%p = readdir (%p) (%s)", &dir->__d_dirent, dir, diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index c37f529..1c92343 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -217,13 +217,15 @@ details. */ 92: Export getusershell, setusershell, endusershell 93: Export daemon, forkpty, openpty, iruserok, ruserok, login_tty, openpty, forkpty, revoke, logwtmp, updwtmp + 94: Export getopt, getopt_long, optarg, opterr, optind, optopt, + optreset, __check_rhosts_file, __rcmd_errstr. */ /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ #define CYGWIN_VERSION_API_MAJOR 0 -#define CYGWIN_VERSION_API_MINOR 93 +#define CYGWIN_VERSION_API_MINOR 94 /* There is also a compatibity version number associated with the shared memory regions. It is incremented when incompatible diff --git a/winsup/cygwin/include/getopt.h b/winsup/cygwin/include/getopt.h index 6b6f643..ba095ba 100644 --- a/winsup/cygwin/include/getopt.h +++ b/winsup/cygwin/include/getopt.h @@ -38,11 +38,13 @@ extern "C" { #endif -extern int opterr; /* if error message should be printed */ -extern int optind; /* index into parent argv vector */ -extern int optopt; /* character checked for validity */ -extern int optreset; /* reset getopt */ -extern char *optarg; /* argument associated with option */ +#ifndef __INSIDE_CYGWIN__ +extern int __declspec(dllimport) opterr; /* if error message should be printed */ +extern int __declspec(dllimport) optind; /* index into parent argv vector */ +extern int __declspec(dllimport) optopt; /* character checked for validity */ +extern int __declspec(dllimport) optreset; /* reset getopt */ +extern char __declspec(dllimport) *optarg; /* argument associated with option */ +#endif int getopt (int, char * const *, const char *); diff --git a/winsup/cygwin/lib/getopt.c b/winsup/cygwin/lib/getopt.c deleted file mode 100644 index b5d5a23..0000000 --- a/winsup/cygwin/lib/getopt.c +++ /dev/null @@ -1,503 +0,0 @@ -/* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ - -/*- - * Copyright (c) 2000 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Dieter Baron and Thomas Klausner. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <assert.h> -#include <errno.h> -#include <stdlib.h> -#include <string.h> -#include <getopt.h> -#include <stdarg.h> -#include <stdio.h> - -#define REPLACE_GETOPT - -#define _DIAGASSERT(x) do {} while (0) - -#ifdef REPLACE_GETOPT -#ifdef __weak_alias -__weak_alias(getopt,_getopt) -#endif -int opterr = 1; /* if error message should be printed */ -int optind = 1; /* index into parent argv vector */ -int optopt = '?'; /* character checked for validity */ -int optreset; /* reset getopt */ -char *optarg; /* argument associated with option */ -#endif - -#ifdef __weak_alias -__weak_alias(getopt_long,_getopt_long) -#endif - -#ifndef __CYGWIN__ -#define __progname __argv[0] -#else -extern char __declspec(dllimport) *__progname; -#endif - -#define IGNORE_FIRST (*options == '-' || *options == '+') -#define PRINT_ERROR ((opterr) && ((*options != ':') \ - || (IGNORE_FIRST && options[1] != ':'))) - -#define IS_POSIXLY_CORRECT (getenv("POSIXLY_INCORRECT_GETOPT") == NULL) - -#define PERMUTE (!IS_POSIXLY_CORRECT && !IGNORE_FIRST) -/* XXX: GNU ignores PC if *options == '-' */ -#define IN_ORDER (!IS_POSIXLY_CORRECT && *options == '-') - -/* return values */ -#define BADCH (int)'?' -#define BADARG ((IGNORE_FIRST && options[1] == ':') \ - || (*options == ':') ? (int)':' : (int)'?') -#define INORDER (int)1 - -static char EMSG[1]; - -static int getopt_internal (int, char * const *, const char *); -static int gcd (int, int); -static void permute_args (int, int, int, char * const *); - -static char *place = EMSG; /* option letter processing */ - -/* XXX: set optreset to 1 rather than these two */ -static int nonopt_start = -1; /* first non option argument (for permute) */ -static int nonopt_end = -1; /* first option after non options (for permute) */ - -/* Error messages */ -static const char recargchar[] = "option requires an argument -- %c"; -static const char recargstring[] = "option requires an argument -- %s"; -static const char ambig[] = "ambiguous option -- %.*s"; -static const char noarg[] = "option doesn't take an argument -- %.*s"; -static const char illoptchar[] = "unknown option -- %c"; -static const char illoptstring[] = "unknown option -- %s"; - -static void -_vwarnx(const char *fmt, va_list ap) -{ - (void)fprintf(stderr, "%s: ", __progname); - if (fmt != NULL) - (void)vfprintf(stderr, fmt, ap); - (void)fprintf(stderr, "\n"); -} - -static void -warnx(const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - _vwarnx(fmt, ap); - va_end(ap); -} - -/* - * Compute the greatest common divisor of a and b. - */ -static int -gcd(a, b) - int a; - int b; -{ - int c; - - c = a % b; - while (c != 0) { - a = b; - b = c; - c = a % b; - } - - return b; -} - -/* - * Exchange the block from nonopt_start to nonopt_end with the block - * from nonopt_end to opt_end (keeping the same order of arguments - * in each block). - */ -static void -permute_args(panonopt_start, panonopt_end, opt_end, nargv) - int panonopt_start; - int panonopt_end; - int opt_end; - char * const *nargv; -{ - int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos; - char *swap; - - _DIAGASSERT(nargv != NULL); - - /* - * compute lengths of blocks and number and size of cycles - */ - nnonopts = panonopt_end - panonopt_start; - nopts = opt_end - panonopt_end; - ncycle = gcd(nnonopts, nopts); - cyclelen = (opt_end - panonopt_start) / ncycle; - - for (i = 0; i < ncycle; i++) { - cstart = panonopt_end+i; - pos = cstart; - for (j = 0; j < cyclelen; j++) { - if (pos >= panonopt_end) - pos -= nnonopts; - else - pos += nopts; - swap = nargv[pos]; - /* LINTED const cast */ - ((char **) nargv)[pos] = nargv[cstart]; - /* LINTED const cast */ - ((char **)nargv)[cstart] = swap; - } - } -} - -/* - * getopt_internal -- - * Parse argc/argv argument vector. Called by user level routines. - * Returns -2 if -- is found (can be long option or end of options marker). - */ -static int -getopt_internal(nargc, nargv, options) - int nargc; - char * const *nargv; - const char *options; -{ - char *oli; /* option letter list index */ - int optchar; - - _DIAGASSERT(nargv != NULL); - _DIAGASSERT(options != NULL); - - optarg = NULL; - - /* - * XXX Some programs (like rsyncd) expect to be able to - * XXX re-initialize optind to 0 and have getopt_long(3) - * XXX properly function again. Work around this braindamage. - */ - if (optind == 0) - optind = 1; - - if (optreset) - nonopt_start = nonopt_end = -1; -start: - if (optreset || !*place) { /* update scanning pointer */ - optreset = 0; - if (optind >= nargc) { /* end of argument vector */ - place = EMSG; - if (nonopt_end != -1) { - /* do permutation, if we have to */ - permute_args(nonopt_start, nonopt_end, - optind, nargv); - optind -= nonopt_end - nonopt_start; - } - else if (nonopt_start != -1) { - /* - * If we skipped non-options, set optind - * to the first of them. - */ - optind = nonopt_start; - } - nonopt_start = nonopt_end = -1; - return -1; - } - if ((*(place = nargv[optind]) != '-') - || (place[1] == '\0')) { /* found non-option */ - place = EMSG; - if (IN_ORDER) { - /* - * GNU extension: - * return non-option as argument to option 1 - */ - optarg = nargv[optind++]; - return INORDER; - } - if (!PERMUTE) { - /* - * if no permutation wanted, stop parsing - * at first non-option - */ - return -1; - } - /* do permutation */ - if (nonopt_start == -1) - nonopt_start = optind; - else if (nonopt_end != -1) { - permute_args(nonopt_start, nonopt_end, - optind, nargv); - nonopt_start = optind - - (nonopt_end - nonopt_start); - nonopt_end = -1; - } - optind++; - /* process next argument */ - goto start; - } - if (nonopt_start != -1 && nonopt_end == -1) - nonopt_end = optind; - if (place[1] && *++place == '-') { /* found "--" */ - place++; - return -2; - } - } - if ((optchar = (int)*place++) == (int)':' || - (oli = strchr(options + (IGNORE_FIRST ? 1 : 0), optchar)) == NULL) { - /* option letter unknown or ':' */ - if (!*place) - ++optind; - if (PRINT_ERROR) - warnx(illoptchar, optchar); - optopt = optchar; - return BADCH; - } - if (optchar == 'W' && oli[1] == ';') { /* -W long-option */ - /* XXX: what if no long options provided (called by getopt)? */ - if (*place) - return -2; - - if (++optind >= nargc) { /* no arg */ - place = EMSG; - if (PRINT_ERROR) - warnx(recargchar, optchar); - optopt = optchar; - return BADARG; - } else /* white space */ - place = nargv[optind]; - /* - * Handle -W arg the same as --arg (which causes getopt to - * stop parsing). - */ - return -2; - } - if (*++oli != ':') { /* doesn't take argument */ - if (!*place) - ++optind; - } else { /* takes (optional) argument */ - optarg = NULL; - if (*place) /* no white space */ - optarg = place; - /* XXX: disable test for :: if PC? (GNU doesn't) */ - else if (oli[1] != ':') { /* arg not optional */ - if (++optind >= nargc) { /* no arg */ - place = EMSG; - if (PRINT_ERROR) - warnx(recargchar, optchar); - optopt = optchar; - return BADARG; - } else - optarg = nargv[optind]; - } - place = EMSG; - ++optind; - } - /* dump back option letter */ - return optchar; -} - -#ifdef REPLACE_GETOPT -/* - * getopt -- - * Parse argc/argv argument vector. - * - * [eventually this will replace the real getopt] - */ -int -getopt(nargc, nargv, options) - int nargc; - char * const *nargv; - const char *options; -{ - int retval; - - _DIAGASSERT(nargv != NULL); - _DIAGASSERT(options != NULL); - - if ((retval = getopt_internal(nargc, nargv, options)) == -2) { - ++optind; - /* - * We found an option (--), so if we skipped non-options, - * we have to permute. - */ - if (nonopt_end != -1) { - permute_args(nonopt_start, nonopt_end, optind, - nargv); - optind -= nonopt_end - nonopt_start; - } - nonopt_start = nonopt_end = -1; - retval = -1; - } - return retval; -} -#endif - -/* - * getopt_long -- - * Parse argc/argv argument vector. - */ -int -getopt_long(nargc, nargv, options, long_options, idx) - int nargc; - char * const *nargv; - const char *options; - const struct option *long_options; - int *idx; -{ - int retval; - - _DIAGASSERT(nargv != NULL); - _DIAGASSERT(options != NULL); - _DIAGASSERT(long_options != NULL); - /* idx may be NULL */ - - if ((retval = getopt_internal(nargc, nargv, options)) == -2) { - char *current_argv, *has_equal; - size_t current_argv_len; - int i, match; - - current_argv = place; - match = -1; - - optind++; - place = EMSG; - - if (*current_argv == '\0') { /* found "--" */ - /* - * We found an option (--), so if we skipped - * non-options, we have to permute. - */ - if (nonopt_end != -1) { - permute_args(nonopt_start, nonopt_end, - optind, nargv); - optind -= nonopt_end - nonopt_start; - } - nonopt_start = nonopt_end = -1; - return -1; - } - if ((has_equal = strchr(current_argv, '=')) != NULL) { - /* argument found (--option=arg) */ - current_argv_len = has_equal - current_argv; - has_equal++; - } else - current_argv_len = strlen(current_argv); - - for (i = 0; long_options[i].name; i++) { - /* find matching long option */ - if (strncmp(current_argv, long_options[i].name, - current_argv_len)) - continue; - - if (strlen(long_options[i].name) == - (unsigned)current_argv_len) { - /* exact match */ - match = i; - break; - } - if (match == -1) /* partial match */ - match = i; - else { - /* ambiguous abbreviation */ - if (PRINT_ERROR) - warnx(ambig, (int)current_argv_len, - current_argv); - optopt = 0; - return BADCH; - } - } - if (match != -1) { /* option found */ - if (long_options[match].has_arg == no_argument - && has_equal) { - if (PRINT_ERROR) - warnx(noarg, (int)current_argv_len, - current_argv); - /* - * XXX: GNU sets optopt to val regardless of - * flag - */ - if (long_options[match].flag == NULL) - optopt = long_options[match].val; - else - optopt = 0; - return BADARG; - } - if (long_options[match].has_arg == required_argument || - long_options[match].has_arg == optional_argument) { - if (has_equal) - optarg = has_equal; - else if (long_options[match].has_arg == - required_argument) { - /* - * optional argument doesn't use - * next nargv - */ - optarg = nargv[optind++]; - } - } - if ((long_options[match].has_arg == required_argument) - && (optarg == NULL)) { - /* - * Missing argument; leading ':' - * indicates no error should be generated - */ - if (PRINT_ERROR) - warnx(recargstring, current_argv); - /* - * XXX: GNU sets optopt to val regardless - * of flag - */ - if (long_options[match].flag == NULL) - optopt = long_options[match].val; - else - optopt = 0; - --optind; - return BADARG; - } - } else { /* unknown option */ - if (PRINT_ERROR) - warnx(illoptstring, current_argv); - optopt = 0; - return BADCH; - } - if (long_options[match].flag) { - *long_options[match].flag = long_options[match].val; - retval = 0; - } else - retval = long_options[match].val; - if (idx) - *idx = match; - } - return retval; -} diff --git a/winsup/cygwin/lib/iruserok.c b/winsup/cygwin/lib/iruserok.c deleted file mode 100644 index 5e95718..0000000 --- a/winsup/cygwin/lib/iruserok.c +++ /dev/null @@ -1,319 +0,0 @@ -/* Based on the rcmd.c.new file distributed with linux libc 5.4.19 - Adapted to inetutils by Bernhard Rosenkraenzer <bero@startrek.in-trier.de> - - Note that a lot in this file is superfluous; hopefully it won't be a - problem for systems that need it for iruserok &c.... */ -/* - * Copyright (c) 1983, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef __CYGWIN__ -#define HAVE_MALLOC_H -#define HAVE_STDLIB_H -#define HAVE_STRING_H -#define TIME_WITH_SYS_TIME -#define PATH_HEQUIV "/etc/hosts.equiv" - -static int __ivaliduser(); -static int __icheckhost(); - -struct hostent *cygwin_gethostbyname (const char *name); -unsigned long cygwin_inet_addr (const char *cp); - -#define gethostbyname cygwin_gethostbyname -#define inet_addr cygwin_inet_addr -#endif - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif -#include <pwd.h> -#include <sys/file.h> -#include <sys/signal.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <sys/uio.h> -#include <sys/param.h> -#include <sys/socket.h> -#ifdef HAVE_MALLOC_H -#include <malloc.h> -#endif -#if defined(STDC_HEADERS) || defined(HAVE_STDLIB_H) -#include <stdlib.h> -#endif -#ifdef HAVE_STRING_H -# include <string.h> -#endif -#include <netinet/in.h> -#ifdef HAVE_ARPA_NAMESER_H -# include <arpa/nameser.h> -#endif -#include <netdb.h> -#include <unistd.h> -#include <ctype.h> -#include <stdio.h> -#include <errno.h> -#ifdef TIME_WITH_SYS_TIME -# include <sys/time.h> -# include <time.h> -#else -# ifdef HAVE_SYS_TIME_H -# include <sys/time.h> -# else -# include <time.h> -# endif -#endif -#ifndef __CYGWIN__ -#include <resolv.h> -#endif - -int __check_rhosts_file = 1; -const char *__rcmd_errstr; - -int -ruserok(rhost, superuser, ruser, luser) - const char *rhost; - int superuser; - const char *ruser; - const char *luser; -{ - struct hostent *hp; - u_long addr; - char **ap; - - if ((hp = gethostbyname(rhost)) == NULL) - return (-1); - for (ap = hp->h_addr_list; *ap; ++ap) { - bcopy(*ap, &addr, sizeof(addr)); - if (iruserok(addr, superuser, ruser, luser) == 0) - return (0); - } - return (-1); -} - -/* - * New .rhosts strategy: We are passed an ip address. We spin through - * hosts.equiv and .rhosts looking for a match. When the .rhosts only - * has ip addresses, we don't have to trust a nameserver. When it - * contains hostnames, we spin through the list of addresses the nameserver - * gives us and look for a match. - * - * Returns 0 if ok, -1 if not ok. - */ -int -iruserok(raddr, superuser, ruser, luser) - u_long raddr; - int superuser; - const char *ruser; - const char *luser; -{ - register const char *cp; - struct stat sbuf; - struct passwd *pwd; - FILE *hostf; - uid_t uid; - int first = 1; - char *pbuf; - - first = 1; - hostf = superuser ? NULL : fopen(PATH_HEQUIV, "r"); -again: - if (hostf) { - if (__ivaliduser(hostf, raddr, luser, ruser) == 0) { - (void) fclose(hostf); - return(0); - } - (void) fclose(hostf); - } - if (first == 1 && (__check_rhosts_file || superuser)) { - first = 0; - if ((pwd = getpwnam(luser)) == NULL) - return(-1); - - pbuf = malloc (strlen (pwd->pw_dir) + sizeof "/.rhosts"); - if (! pbuf) - { - errno = ENOMEM; - return -1; - } - strcpy (pbuf, pwd->pw_dir); - strcat (pbuf, "/.rhosts"); - - /* - * Change effective uid while opening .rhosts. If root and - * reading an NFS mounted file system, can't read files that - * are protected read/write owner only. - */ - uid = geteuid(); - (void)seteuid(pwd->pw_uid); - hostf = fopen(pbuf, "r"); - (void)seteuid(uid); - - if (hostf == NULL) - return(-1); - /* - * If not a regular file, or is owned by someone other than - * user or root or if writeable by anyone but the owner, quit. - */ - cp = NULL; - if (lstat(pbuf, &sbuf) < 0) - cp = ".rhosts not regular file"; - else if (!S_ISREG(sbuf.st_mode)) - cp = ".rhosts not regular file"; - else if (fstat(fileno(hostf), &sbuf) < 0) - cp = ".rhosts fstat failed"; - else if (sbuf.st_uid && sbuf.st_uid != pwd->pw_uid) - cp = "bad .rhosts owner"; - else if (sbuf.st_mode & (S_IWGRP|S_IWOTH)) - cp = ".rhosts writeable by other than owner"; - /* If there were any problems, quit. */ - if (cp) { - __rcmd_errstr = (char *) cp; - fclose(hostf); - return(-1); - } - goto again; - } - return (-1); -} - -/* - * XXX - * Don't make static, used by lpd(8). - * - * Returns 0 if ok, -1 if not ok. - */ -#ifdef __CYGWIN__ -static -#endif -int -__ivaliduser(hostf, raddr, luser, ruser) - FILE *hostf; - u_long raddr; - const char *luser; - const char *ruser; -{ - size_t buf_offs = 0; - size_t buf_len = 256; - char *buf = malloc (buf_len); - - if (! buf) - return -1; - - while (fgets(buf + buf_offs, buf_len - buf_offs, hostf)) { - /*int ch;*/ - register char *user, *p; - - if (strchr(buf + buf_offs, '\n') == NULL) { - /* No newline yet, read some more. */ - buf_offs += strlen (buf + buf_offs); - - if (buf_offs >= buf_len - 1) { - /* Make more room in BUF. */ - char *new_buf; - - buf_len += buf_len; - new_buf = realloc (buf, buf_len); - - if (! new_buf) { - free (buf); - return -1; - } - - buf = new_buf; - } - - continue; - } - - buf_offs = 0; /* Start at beginning next time around. */ - - p = buf; - while (*p != '\n' && *p != ' ' && *p != '\t' && *p != '\0') { - /* *p = isupper(*p) ? tolower(*p) : *p; -- Uli */ - *p = tolower(*p); /* works for linux libc */ - p++; - } - if (*p == ' ' || *p == '\t') { - *p++ = '\0'; - while (*p == ' ' || *p == '\t') - p++; - user = p; - while (*p != '\n' && *p != ' ' && - *p != '\t' && *p != '\0') - p++; - } else - user = p; - *p = '\0'; - - if (__icheckhost(raddr, buf) && !strcmp(ruser, *user ? user : luser)) { - free (buf); - return (0); - } - } - - free (buf); - - return (-1); -} - -/* - * Returns "true" if match, 0 if no match. - */ -#ifdef __CYGWIN__ -static -#endif -int -__icheckhost(raddr, lhost) - u_long raddr; - register char *lhost; -{ - register struct hostent *hp; - register u_long laddr; - register char **pp; - - /* Try for raw ip address first. */ - if (isdigit(*lhost) && (long)(laddr = inet_addr(lhost)) != -1) - return (raddr == laddr); - - /* Better be a hostname. */ - if ((hp = gethostbyname(lhost)) == NULL) - return (0); - - /* Spin through ip addresses. */ - for (pp = hp->h_addr_list; *pp; ++pp) - if (!bcmp(&raddr, *pp, sizeof(u_long))) - return (1); - - /* No match. */ - return (0); -} diff --git a/winsup/cygwin/registry.cc b/winsup/cygwin/registry.cc index 22fa511..d1443ee 100644 --- a/winsup/cygwin/registry.cc +++ b/winsup/cygwin/registry.cc @@ -202,7 +202,7 @@ get_registry_hive_path (const PSID psid, char *path) if (!psid || !path) return NULL; - cygsid csid (psid); + cygpsid csid (psid); csid.string (sid); strcpy (key,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\"); strcat (key, sid); @@ -233,7 +233,7 @@ load_registry_hive (PSID psid) if (!psid) return; /* Check if user hive is already loaded. */ - cygsid csid (psid); + cygpsid csid (psid); csid.string (sid); if (!RegOpenKeyExA (HKEY_USERS, sid, 0, KEY_READ, &hkey)) { diff --git a/winsup/cygwin/security.h b/winsup/cygwin/security.h index 71ffe4c..0112341 100644 --- a/winsup/cygwin/security.h +++ b/winsup/cygwin/security.h @@ -8,6 +8,9 @@ This software is a copyrighted work licensed under the terms of the Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */ +#ifndef _SECURITY_H +#define _SECURITY_H + #include <accctrl.h> #define DEFAULT_UID DOMAIN_USER_RID_ADMIN @@ -271,5 +274,6 @@ sec_user_nih (char sa_buf[], PSID sid = NULL) extern inline SECURITY_ATTRIBUTES * sec_user (char sa_buf[], PSID sid = NULL) { - return allow_ntsec ? __sec_user (sa_buf, sid, TRUE) : &sec_none_nih; + return allow_ntsec ? __sec_user (sa_buf, sid, TRUE) : &sec_none; } +#endif /*_SECURITY_H*/ diff --git a/winsup/cygwin/shared.cc b/winsup/cygwin/shared.cc index 997e0f6..0862ef7 100644 --- a/winsup/cygwin/shared.cc +++ b/winsup/cygwin/shared.cc @@ -1,6 +1,6 @@ /* shared.cc: shared data area support. - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. + Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc. This file is part of Cygwin. @@ -67,7 +67,8 @@ static char *offsets[] = }; void * __stdcall -open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, shared_locations m) +open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, + shared_locations m, PSECURITY_ATTRIBUTES psa) { void *shared; @@ -96,7 +97,7 @@ open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, shared_locat TRUE, mapname); } if (!shared_h && - !(shared_h = CreateFileMapping (INVALID_HANDLE_VALUE, &sec_all, + !(shared_h = CreateFileMapping (INVALID_HANDLE_VALUE, psa, PAGE_READWRITE, 0, size, mapname))) api_fatal ("CreateFileMapping, %E. Terminating."); } @@ -145,7 +146,54 @@ open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, shared_locat } void -shared_info::initialize (const char *user_name) +user_shared_initialize () +{ + char name[UNLEN > 127 ? UNLEN + 1 : 128] = ""; + + if (wincap.has_security ()) + { + cygsid tu (cygheap->user.sid ()); + tu.string (name); + } + else + strcpy (name, cygheap->user.name ()); + + if (cygwin_mount_h) /* Reinit */ + { + if (!UnmapViewOfFile (mount_table)) + debug_printf("UnmapViewOfFile %E"); + if (!ForceCloseHandle (cygwin_mount_h)) + debug_printf("CloseHandle %E"); + cygwin_mount_h = NULL; + } + + mount_table = (mount_info *) open_shared (name, MOUNT_VERSION, + cygwin_mount_h, sizeof (mount_info), + SH_MOUNT_TABLE, &sec_none); + debug_printf ("opening mount table for '%s' at %p", name, + mount_table); + ProtectHandleINH (cygwin_mount_h); + debug_printf ("mount table version %x at %p", mount_table->version, mount_table); + + /* Initialize the Cygwin per-user mount table, if necessary */ + if (!mount_table->version) + { + mount_table->version = MOUNT_VERSION_MAGIC; + debug_printf ("initializing mount table"); + mount_table->cb = sizeof (*mount_table); + if (mount_table->cb != MOUNT_INFO_CB) + system_printf ("size of mount table region changed from %u to %u", + MOUNT_INFO_CB, mount_table->cb); + mount_table->init (); /* Initialize the mount table. */ + } + else if (mount_table->version != MOUNT_VERSION_MAGIC) + multiple_cygwin_problem ("mount", mount_table->version, MOUNT_VERSION); + else if (mount_table->cb != MOUNT_INFO_CB) + multiple_cygwin_problem ("mount table size", mount_table->cb, MOUNT_INFO_CB); +} + +void +shared_info::initialize () { DWORD sversion = (DWORD) InterlockedExchange ((LONG *) &version, SHARED_VERSION_MAGIC); if (!sversion) @@ -171,7 +219,7 @@ shared_info::initialize (const char *user_name) if (!cygheap) { cygheap_init (); - cygheap->user.set_name (user_name); + cygheap->user.init (); } heap_init (); @@ -189,12 +237,6 @@ memory_init () { getpagesize (); - char user_name[UNLEN + 1]; - DWORD user_name_len = UNLEN + 1; - - if (!GetUserName (user_name, &user_name_len)) - strcpy (user_name, "unknown"); - /* Initialize general shared memory */ HANDLE shared_h = cygheap ? cygheap->shared_h : NULL; cygwin_shared = (shared_info *) open_shared ("shared", @@ -203,36 +245,11 @@ memory_init () sizeof (*cygwin_shared), SH_CYGWIN_SHARED); - cygwin_shared->initialize (user_name); - + cygwin_shared->initialize (); cygheap->shared_h = shared_h; ProtectHandleINH (cygheap->shared_h); - /* Allocate memory for the per-user mount table */ - mount_table = (mount_info *) open_shared (user_name, MOUNT_VERSION, - cygwin_mount_h, sizeof (mount_info), - SH_MOUNT_TABLE); - debug_printf ("opening mount table for '%s' at %p", cygheap->user.name (), - mount_table); - ProtectHandleINH (cygwin_mount_h); - debug_printf ("mount table version %x at %p", mount_table->version, mount_table); - - /* Initialize the Cygwin per-user mount table, if necessary */ - if (!mount_table->version) - { - mount_table->version = MOUNT_VERSION_MAGIC; - debug_printf ("initializing mount table"); - mount_table->cb = sizeof (*mount_table); - if (mount_table->cb != MOUNT_INFO_CB) - system_printf ("size of mount table region changed from %u to %u", - MOUNT_INFO_CB, mount_table->cb); - mount_table->init (); /* Initialize the mount table. */ - } - else if (mount_table->version != MOUNT_VERSION_MAGIC) - multiple_cygwin_problem ("mount", mount_table->version, MOUNT_VERSION); - else if (mount_table->cb != MOUNT_INFO_CB) - multiple_cygwin_problem ("mount table size", mount_table->cb, MOUNT_INFO_CB); - + user_shared_initialize (); } unsigned diff --git a/winsup/cygwin/shared_info.h b/winsup/cygwin/shared_info.h index b11ecb3..4ae79de 100644 --- a/winsup/cygwin/shared_info.h +++ b/winsup/cygwin/shared_info.h @@ -9,6 +9,7 @@ Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */ #include "tty.h" +#include "security.h" /* Mount table entry */ @@ -141,7 +142,7 @@ public: #define SHARED_INFO_CB 47112 -#define CURR_SHARED_MAGIC 0x53f1a7f4U +#define CURR_SHARED_MAGIC 0x359218a2U /* NOTE: Do not make gratuitous changes to the names or organization of the below class. The layout is checksummed to determine compatibility between @@ -156,7 +157,7 @@ class shared_info tty_list tty; delqueue_list delqueue; - void initialize (const char *); + void initialize (); unsigned heap_chunk_size (); }; @@ -190,4 +191,7 @@ struct console_state #endif char *__stdcall shared_name (char *, const char *, int); -void *__stdcall open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, shared_locations); +void *__stdcall open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, + shared_locations, PSECURITY_ATTRIBUTES psa = &sec_all); +extern void user_shared_initialize (); + diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index fe4efba..402dd07 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -654,9 +654,6 @@ spawn_guts (const char * prog_arg, const char *const *argv, /* Set security attributes with sid */ PSECURITY_ATTRIBUTES sec_attribs = sec_user_nih (sa_buf, sid); - /* Load users registry hive. */ - load_registry_hive (sid); - /* allow the child to interact with our window station/desktop */ HANDLE hwst, hdsk; SECURITY_INFORMATION dsi = DACL_SECURITY_INFORMATION; diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index a3d7a81..54116ca 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -2141,9 +2141,9 @@ seteuid32 (__uid32_t uid) user_groups &groups = cygheap->user.groups; HANDLE ptok, new_token = INVALID_HANDLE_VALUE; struct passwd * pw_new; - PSID origpsid, psid2 = NO_SID; - BOOL token_is_internal; - + cygpsid origpsid, psid2 (NO_SID); + BOOL token_is_internal, issamesid; + pw_new = internal_getpwuid (uid); if (!wincap.has_security () && pw_new) goto success_9x; @@ -2219,6 +2219,9 @@ seteuid32 (__uid32_t uid) } else if (new_token != ptok) { + /* Avoid having HKCU use default user */ + load_registry_hive (usersid); + /* Try setting owner to same value as user. */ if (!SetTokenInformation (new_token, TokenOwner, &usersid, sizeof usersid)) @@ -2233,10 +2236,16 @@ seteuid32 (__uid32_t uid) } CloseHandle (ptok); + issamesid = (usersid == (psid2 = cygheap->user.sid ())); cygheap->user.set_sid (usersid); cygheap->user.current_token = new_token == ptok ? INVALID_HANDLE_VALUE - : new_token; + : new_token; + if (!issamesid) /* MS KB 199190 */ + RegCloseKey(HKEY_CURRENT_USER); cygheap->user.reimpersonate (); + if (!issamesid) + user_shared_initialize (); + success_9x: cygheap->user.set_name (pw_new->pw_name); myself->uid = uid; @@ -2975,7 +2984,7 @@ long gethostid(void) #define ETC_SHELLS "/etc/shells" static int shell_index; -static FILE *shell_fp; +static struct __sFILE64 *shell_fp; extern "C" char * getusershell () @@ -2994,7 +3003,7 @@ getusershell () static char buf[MAX_PATH]; int ch, buf_idx; - if (!shell_fp && !(shell_fp = fopen (ETC_SHELLS, "rt"))) + if (!shell_fp && !(shell_fp = fopen64 (ETC_SHELLS, "rt"))) { if (def_shells[shell_index]) return strcpy (buf, def_shells[shell_index++]); diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc index 29daca1..8cd1a42 100644 --- a/winsup/cygwin/uinfo.cc +++ b/winsup/cygwin/uinfo.cc @@ -30,42 +30,55 @@ details. */ #include "environ.h" #include "pwdgrp.h" +/* Initialize the part of cygheap_user that does not depend on files. + The information is used in shared.cc for the user shared. + Final initialization occurs in uinfo_init */ void -internal_getlogin (cygheap_user &user) +cygheap_user::init() { - struct passwd *pw = NULL; - HANDLE ptok = INVALID_HANDLE_VALUE; + char user_name[UNLEN + 1]; + DWORD user_name_len = UNLEN + 1; + + set_name (GetUserName (user_name, &user_name_len) ? user_name : "unknown"); - myself->gid = UNKNOWN_GID; if (wincap.has_security ()) { - DWORD siz; + HANDLE ptok = NULL; + DWORD siz, ret; cygsid tu; - DWORD ret = 0; - /* Try to get the SID either from current process and - store it in user.psid */ + /* Get the SID from current process and store it in user.psid */ if (!OpenProcessToken (hMainProc, TOKEN_ADJUST_DEFAULT | TOKEN_QUERY, &ptok)) system_printf ("OpenProcessToken(): %E"); - else if (!GetTokenInformation (ptok, TokenUser, &tu, sizeof tu, &siz)) - system_printf ("GetTokenInformation (TokenUser): %E"); - else if (!(ret = user.set_sid (tu))) - system_printf ("Couldn't retrieve SID from access token!"); - else if (!GetTokenInformation (ptok, TokenPrimaryGroup, - &user.groups.pgsid, sizeof tu, &siz)) - system_printf ("GetTokenInformation (TokenPrimaryGroup): %E"); - /* We must set the user name, uid and gid. - If we have a SID, try to get the corresponding Cygwin - password entry. Set user name which can be different - from the Windows user name */ - if (ret) + else { - pw = internal_getpwsid (tu); + if (!GetTokenInformation (ptok, TokenUser, &tu, sizeof tu, &siz)) + system_printf ("GetTokenInformation (TokenUser): %E"); + else if (!(ret = set_sid (tu))) + system_printf ("Couldn't retrieve SID from access token!"); /* Set token owner to the same value as token user */ - if (!SetTokenInformation (ptok, TokenOwner, &tu, sizeof tu)) + else if (!SetTokenInformation (ptok, TokenOwner, &tu, sizeof tu)) debug_printf ("SetTokenInformation(TokenOwner): %E"); - } + if (!GetTokenInformation (ptok, TokenPrimaryGroup, + &groups.pgsid, sizeof tu, &siz)) + system_printf ("GetTokenInformation (TokenPrimaryGroup): %E"); + CloseHandle (ptok); + } + } +} + +void +internal_getlogin (cygheap_user &user) +{ + struct passwd *pw = NULL; + + myself->gid = UNKNOWN_GID; + + if (wincap.has_security ()) + { + cygpsid psid = user.sid (); + pw = internal_getpwsid (psid); } if (!pw && !(pw = internal_getpwnam (user.name ())) @@ -81,19 +94,24 @@ internal_getlogin (cygheap_user &user) cygsid gsid; if (gsid.getfromgr (internal_getgrgid (pw->pw_gid))) { - /* Set primary group to the group in /etc/passwd. */ - if (!SetTokenInformation (ptok, TokenPrimaryGroup, - &gsid, sizeof gsid)) - debug_printf ("SetTokenInformation(TokenPrimaryGroup): %E"); - else - user.groups.pgsid = gsid; + HANDLE ptok; + if (gsid != user.groups.pgsid + && OpenProcessToken (hMainProc, TOKEN_ADJUST_DEFAULT | TOKEN_QUERY, + &ptok)) + { + /* Set primary group to the group in /etc/passwd. */ + if (!SetTokenInformation (ptok, TokenPrimaryGroup, + &gsid, sizeof gsid)) + debug_printf ("SetTokenInformation(TokenPrimaryGroup): %E"); + else + user.groups.pgsid = gsid; + CloseHandle (ptok); + } } else debug_printf ("gsid not found in augmented /etc/group"); } } - if (ptok != INVALID_HANDLE_VALUE) - CloseHandle (ptok); (void) cygheap->user.ontherange (CH_HOME, pw); return; diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h index fc9de77..677d498 100644 --- a/winsup/cygwin/winsup.h +++ b/winsup/cygwin/winsup.h @@ -37,14 +37,20 @@ details. */ #include <sys/types.h> #include <sys/strace.h> +/* Declarations for functions used in C and C++ code. */ #ifdef __cplusplus extern "C" { #endif extern __uid32_t getuid32 (void); extern __uid32_t geteuid32 (void); +extern int seteuid32 (__uid32_t); extern __gid32_t getegid32 (void); extern struct passwd *getpwuid32 (__uid32_t); -struct passwd *getpwnam (const char *); +extern struct passwd *getpwnam (const char *); +extern struct __sFILE64 *fopen64 (const char *, const char *); +extern struct hostent *cygwin_gethostbyname (const char *name); +extern unsigned long cygwin_inet_addr (const char *cp); + #ifdef __cplusplus } #endif |