aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2003-09-11 04:47:23 +0000
committerChristopher Faylor <me@cgf.cx>2003-09-11 04:47:23 +0000
commit0292b97d791876ee53c0e0eb719d94db62c37eb6 (patch)
tree5fee26924afd47f480a0a68ca40dce1513a9f097
parent8b193160f465a6691ff18e30d0fd85c985384236 (diff)
downloadnewlib-0292b97d791876ee53c0e0eb719d94db62c37eb6.zip
newlib-0292b97d791876ee53c0e0eb719d94db62c37eb6.tar.gz
newlib-0292b97d791876ee53c0e0eb719d94db62c37eb6.tar.bz2
merge from trunk
-rw-r--r--winsup/cygwin/ChangeLog301
-rw-r--r--winsup/cygwin/Makefile.in20
-rw-r--r--winsup/cygwin/cygheap.h1
-rw-r--r--winsup/cygwin/cygwin.din11
-rw-r--r--winsup/cygwin/dir.cc2
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc27
-rw-r--r--winsup/cygwin/include/cygwin/version.h4
-rw-r--r--winsup/cygwin/include/getopt.h12
-rw-r--r--winsup/cygwin/lib/getopt.c503
-rw-r--r--winsup/cygwin/lib/iruserok.c319
-rw-r--r--winsup/cygwin/registry.cc4
-rw-r--r--winsup/cygwin/security.h6
-rw-r--r--winsup/cygwin/shared.cc93
-rw-r--r--winsup/cygwin/shared_info.h10
-rw-r--r--winsup/cygwin/spawn.cc3
-rw-r--r--winsup/cygwin/syscalls.cc21
-rw-r--r--winsup/cygwin/uinfo.cc80
-rw-r--r--winsup/cygwin/winsup.h8
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