aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2003-08-06 03:58:58 +0000
committerChristopher Faylor <me@cgf.cx>2003-08-06 03:58:58 +0000
commitbe17afe626370e38c5731da291fd835ae38dbf47 (patch)
tree0408409e88fff57343e172a7d1305c624eea4d19
parent3efd26f715ca5c57c1dea5831aa785db9ed1bc2e (diff)
downloadnewlib-be17afe626370e38c5731da291fd835ae38dbf47.zip
newlib-be17afe626370e38c5731da291fd835ae38dbf47.tar.gz
newlib-be17afe626370e38c5731da291fd835ae38dbf47.tar.bz2
merge from trunk
-rw-r--r--winsup/cygwin/ChangeLog159
-rw-r--r--winsup/cygwin/Makefile.in28
-rwxr-xr-xwinsup/cygwin/configure104
-rw-r--r--winsup/cygwin/configure.in2
-rw-r--r--winsup/cygwin/crt0.c2
-rw-r--r--winsup/cygwin/cygheap.h47
-rw-r--r--winsup/cygwin/cygwin.din2
-rw-r--r--winsup/cygwin/dcrt0.cc7
-rw-r--r--winsup/cygwin/environ.cc2
-rw-r--r--winsup/cygwin/exceptions.cc12
-rw-r--r--winsup/cygwin/fhandler.cc19
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc9
-rw-r--r--winsup/cygwin/fhandler_proc.cc85
-rw-r--r--winsup/cygwin/fhandler_process.cc5
-rw-r--r--winsup/cygwin/fhandler_registry.cc3
-rw-r--r--winsup/cygwin/fhandler_socket.cc6
-rw-r--r--winsup/cygwin/fhandler_tty.cc51
-rw-r--r--winsup/cygwin/include/cygwin/socket.h4
-rw-r--r--winsup/cygwin/include/cygwin/version.h6
-rw-r--r--winsup/cygwin/ipc.cc22
-rw-r--r--winsup/cygwin/mmap.cc22
-rw-r--r--winsup/cygwin/net.cc16
-rw-r--r--winsup/cygwin/ntdll.h1
-rw-r--r--winsup/cygwin/path.cc101
-rw-r--r--winsup/cygwin/pinfo.cc2
-rw-r--r--winsup/cygwin/security.cc80
-rwxr-xr-xwinsup/cygwin/speclib34
-rw-r--r--winsup/cygwin/syscalls.cc304
-rw-r--r--winsup/cygwin/sysconf.cc4
-rw-r--r--winsup/cygwin/thread.cc100
-rw-r--r--winsup/cygwin/times.cc2
-rw-r--r--winsup/cygwin/uinfo.cc4
-rw-r--r--winsup/cygwin/wincap.cc2
33 files changed, 702 insertions, 545 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 3e664b8..f796140 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,9 +1,167 @@
+2003-08-05 Christopher Faylor <cgf@redhat.com>
+
+ * Makefile.in: Rework to accommodate new speclib arguments.
+ * speclib: Rework to extract everything from libcygwin.a rather than
+ building things from existing object files.
+
+2003-08-05 Pavel Tsekov <ptsekov@gmx.net>
+
+ * path.cc (cygdrive_getmntent): Do not skip over drives of type
+ DRIVE_REMOVABLE.
+
+2003-08-05 Christopher Faylor <cgf@redhat.com>
+
+ * fhandler.cc (fhandler_base::lseek): Be more paranoid when
+ constructing offsets from 64 bit value.
+ * syscalls.cc (logout): Avoid temp buffer memcpy since new scheme does
+ not require it.
+ (utmp_data): Rework as a macro which returns a pointer into a buffer.
+ (getutent): Use new buffer allocation mechanism to grab a utmp buffer.
+ (getutid): Ditto.
+ (pututline): Ditto.
+
+2003-08-05 Pavel Tsekov <ptsekov@gmx.net>
+
+ * fhandler_disk_file.cc (fhandler_cygdrive::readdir): Do not change
+ 'errno' if end of directory condition is encountered as per SUSv2.
+ * fhandler_proc.cc (fhandler_proc::readdir): Ditto.
+ * fhandler_process (fhandler_process::readdir): Ditto.
+ * fhandler_registry (fhandler_registry::readdir): Ditto.
+
+2003-07-30 Christopher Faylor <cgf@redhat.com>
+
+ * dcrt0.cc (_dll_crt0): Move strace.microseconds initialization to
+ after pthread initialization.
+ (dll_crt0_1): i.e., here.
+
+2003-07-28 Christopher Faylor <cgf@redhat.com>
+
+ * fhandler_base.cc (fhandler_base::readv): Rework to properly return
+ number of bytes from read.
+
+2003-07-28 Christopher Faylor <cgf@redhat.com>
+
+ * include/cygwin/version.h: Bump DLL minor number to 2.
+
+2003-07-26 Christopher Faylor <cgf@redhat.com>
+
+ * exceptions.cc (ctrl_c_handler): Send SIGHUP when events occur only if
+ there is a tty associated with the process. Send SIGHUP on
+ CTRL_LOGOFF_EVENT.
+
+ * fhandler_tty.cc (fhandler_tty_slave::open): Adjust console open
+ handle counter regardless of whether this is a pty or tty.
+ (fhandler_tty_slave::open): Ditto.
+ (fhandler_tty_slave::dup): Ditto.
+ (fhandler_tty_common::set_close_on_exec): Ditto.
+ (fhandler_tty_master::init_console): Decrement console open handle
+ counter after init since it will now be handled by all tty open.
+ * syscalls.cc (setsid): Rework debugging output slightly.
+
+2003-07-25 Christopher Faylor <cgf@redhat.com>
+
+ * configure.in: Use 'install-sh -c'.
+ * configure: Regenerate.
+
+2003-07-25 Christopher Faylor <cgf@redhat.com>
+
+ * configure.in: Always use install-sh.
+ * configure: Regenerate.
+
+2003-07-25 Christopher Faylor <cgf@redhat.com>
+
+ * include/cygwin/socket.h: Conditionalize [AP]F_INET6 define.
+
+2003-07-25 Christopher Faylor <cgf@redhat.com>
+
+ * Makefile.in (OBSOLETE_FUNCTION): Add fdopen.
+
+2003-07-25 Christopher Faylor <cgf@redhat.com>
+
+ * cygwin.din: Export _fdopen64
+ * Makefile.in (NEW_FUNCTIONS): Add _fdopen64 -> fdopen translation.
+ * include/cygwin/version.h: Bump api minor number.
+
+ * ntdll.h: Remove (now) duplicate FILE_SYNCHRONOUS_IO_NONALERT
+ definition.
+
+2003-07-24 Christopher Faylor <cgf@redhat.com>
+
+ * environ.cc (check_case_init): Use strncasematch.
+
+ * cygwin.din: Export __mempcpy.
+ * cygwin/version.h: Bump api minor number.
+
+2003-07-21 Pavel Tsekov <ptsekov@gmx.net>
+
+ * mmap.cc: Use proper format specifiers for _off64_t and size_t in
+ format strings passed to syscall_printf () and debug_printf ()
+ throughout.
+
+2003-07-18 Pierre Humblet <pierre.humblet@ieee.org>
+
+ * security.cc (verify_token): Fix white space and style.
+ Use type bool instead of BOOL and char. Use alloca
+ instead of malloc and free for my_grps.
+
+2003-07-17 Corinna Vinschen <corinna@vinschen.de>
+
+ * sysconf.cc (sysconf): Fix OPEN_MAX patch. Return page size on
+ _SC_PAGESIZE again.
+
+2003-07-14 Corinna Vinschen <corinna@vinschen.de>
+
+ * cygheap.h (class cygheap_user): Use INVALID_HANDLE_VALUE as invalid
+ value for tokens.
+ * syscalls.cc (seteuid32): Ditto. Set new_token to process token if
+ process token is suitable.
+ * uinfo.cc (uinfo_init): Initialize tokens in cygheap user info
+ to INVALID_HANDLE_VALUE.
+
+2003-07-14 Pierre Humblet <pierre.humblet@ieee.org>
+
+ * cygheap.h (enum impersonation): Delete.
+ (cygheap_user::impersonation_state): Delete.
+ (cygheap_user::current_token): New.
+ (cygheap_user::issetuid): Modify to use current_token.
+ (cygheap_user::token): Ditto.
+ (cygheap_user::deimpersonate): Ditto.
+ (cygheap_user::reimpersonate): Ditto.
+ (cygheap_user::has_impersonation_tokens): Ditto.
+ (cygheap_user::close_impersonation_tokens): Ditto.
+ * security.cc (cygwin_set_impersonation_token): Always set the token.
+ (verify_token): Change type of gsid to cygpsid.
+ (get_file_attribute): Use the effective ids.
+ * syscalls.cc (seteuid32): Modify to use cygheap_user::current_token.
+ * uinfo.cc (uinfo_init) Do not set cygheap->user.impersonation_state.
+
+2003-07-12 Christopher Faylor <cgf@redhat.com>
+
+ * pinfo.cc (_pinfo::commune_send): Fix bounds test so that poll of
+ communicating pid actually stops eventually.
+
+2003-07-10 Christopher Faylor <cgf@redhat.com>
+
+ * path.cc (get_device_number): Remove special com? consideration.
+ (special_chars): Make static.
+ (special_introducers): New.
+ (special_char): Allow specified valid_chars args.
+ (fnunmunge): Handle aux-like filenames correctly.
+ (special_name): Add con, conin$, conout$.
+ (mount_item::fnmunge): Use __small_sprintf return value to calculate
+ increments.
+
2003-07-09 Christopher Faylor <cgf@redhat.com>
* include/cygwin/version.h: Bump DLL minor number to 1.
2003-07-09 Christopher Faylor <cgf@redhat.com>
+ * fhandler_proc.cc (format_proc_stat): Use correctly sized constants
+ for filling in zeros on 98.
+
+2003-07-09 Christopher Faylor <cgf@redhat.com>
+
* fhandler_proc.cc (fhandler_proc::fill_filebuf): Allocate more space
for stat buffer.
(format_proc_stat): Reorganize to accumulate and report on all cpus.
@@ -2804,4 +2962,3 @@
* passwd.cc (getpwuid_r32): Add uid/gid fields to size check
calculation.
-
diff --git a/winsup/cygwin/Makefile.in b/winsup/cygwin/Makefile.in
index 4346027..11c1d40 100644
--- a/winsup/cygwin/Makefile.in
+++ b/winsup/cygwin/Makefile.in
@@ -38,8 +38,9 @@ datadir:=@datadir@
infodir:=@infodir@
includedir:=@includedir@
-INSTALL:=@INSTALL@
-INSTALL_PROGRAM:=@INSTALL_PROGRAM@
+override INSTALL:=@INSTALL@
+override INSTALL_PROGRAM:=@INSTALL_PROGRAM@
+override INSTALL_DATA:=@INSTALL_DATA@
#
# --enable options from configure
@@ -97,8 +98,6 @@ LDSCRIPT:=cygwin.sc
#
include $(srcdir)/../Makefile.common
-INSTALL_DATA:=$(SHELL) $(updir1)/install-sh -c
-
@SET_MAKE@
# Setup the testing framework, if you have one
@@ -118,7 +117,6 @@ RUNTESTFLAGS =
DLL_NAME:=cygwin1.dll
TEST_DLL_NAME:=cygwin0.dll
-LIB_NAME:=libcygwin.a
TEST_LIB_NAME:=libcygwin0.a
DEF_FILE:=cygwin.def
DLL_ENTRY:=@DLL_ENTRY@
@@ -171,7 +169,7 @@ GMON_OFILES:=gmon.o mcount.o profil.o
OBSOLETE_FUNCTIONS:=regcomp regerror regexec regfree regsub \
open acl aclcheck aclfrommode aclfrompbits \
aclfromtext aclsort acltomode acltopbits \
- acltotext chown facl fchown fgetpos fopen \
+ acltotext chown facl fchown fdopen fgetpos fopen \
freopen fseeko fsetpos fstat ftello ftruncate \
getegid geteuid getgid getgrent getgrgid getgrnam \
getgroups getpwuid getpwuid_r getuid initgroups \
@@ -196,6 +194,7 @@ NEW_FUNCTIONS:=regcomp posix_regcomp \
chown _chown32 \
facl _facl32 \
fchown _fchown32 \
+ fdopen _fdopen64 \
fgetpos _fgetpos64 \
fopen _fopen64 \
freopen _freopen64 \
@@ -235,10 +234,11 @@ NEW_FUNCTIONS:=regcomp posix_regcomp \
API_VER:=$(srcdir)/include/cygwin/version.h
PWD:=${shell pwd}
-SUBLIBS:=libpthread.a $(PWD)/libm.a libc.a
+LIB_NAME:=$(PWD)/libcygwin.a
+SUBLIBS:=$(PWD)/libpthread.a $(PWD)/libm.a $(PWD)/libc.a
EXTRALIBS:=libautomode.a libbinmode.a libtextmode.a
INSTOBJS:=automode.o binmode.o textmode.o
-TARGET_LIBS:=$(LIB_NAME) $(SUBLIBS) $(CYGWIN_START) $(GMON_START) $(LIBGMON_A) $(SUBLIBS) $(INSTOBJS) $(EXTRALIBS)
+TARGET_LIBS:=$(LIB_NAME) $(CYGWIN_START) $(GMON_START) $(LIBGMON_A) $(SUBLIBS) $(INSTOBJS) $(EXTRALIBS)
.PHONY: all force dll_ofiles install all_target install_target all_host install_host \
install install-libs install-headers -lgcc
@@ -378,14 +378,14 @@ dcrt0.o sigproc.o: child_info_magic.h
shared.o: shared_info_magic.h
-libpthread.a: speclib cygwin.def pthread.o thread.o
- /bin/sh ${word 1, $^} $@ "${NM}" "${DLLTOOL}" "${AS}" ${wordlist 2, 99, $^}
+$(PWD)/libpthread.a: speclib $(LIB_NAME) pthread.o thread.o
+ /bin/sh ${word 1, $^} $@ "${NM}" "$(AR)" ${wordlist 2, 99, $^}
-$(PWD)/libm.a: speclib cygwin.def $(LIBM)
- /bin/sh ${word 1, $^} $@ "${NM}" "${DLLTOOL}" "${AS}" ${wordlist 2, 99, $^}
+$(PWD)/libm.a: speclib $(LIB_NAME) $(LIBM)
+ /bin/sh ${word 1, $^} $@ "${NM}" "$(AR)" ${wordlist 2, 99, $^}
-$(PWD)/libc.a: speclib cygwin.def $(PWD)/libm.a libpthread.a
- /bin/sh ${word 1, $^} -v $@ "${NM}" "${DLLTOOL}" "${AS}" ${wordlist 2, 99, $^}
+$(PWD)/libc.a: speclib $(LIB_NAME) $(PWD)/libm.a libpthread.a
+ /bin/sh ${word 1, $^} -v $@ "${NM}" "$(AR)" ${wordlist 2, 99, $^}
lib%.a: %.o
$(AR) cru $@ $?
diff --git a/winsup/cygwin/configure b/winsup/cygwin/configure
index af5f3ca..e2f2230 100755
--- a/winsup/cygwin/configure
+++ b/winsup/cygwin/configure
@@ -533,6 +533,8 @@ fi
+INSTALL="/bin/sh "`cd $srcdir/../..; echo $(pwd)/install-sh -c`
+
ac_aux_dir=
for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
if test -f $ac_dir/install-sh; then
@@ -564,7 +566,7 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:568: checking for a BSD compatible install" >&5
+echo "configure:570: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -650,7 +652,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
fi
echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:654: checking host system type" >&5
+echo "configure:656: checking host system type" >&5
host_alias=$host
case "$host_alias" in
@@ -671,7 +673,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$host" 1>&6
echo $ac_n "checking target system type""... $ac_c" 1>&6
-echo "configure:675: checking target system type" >&5
+echo "configure:677: checking target system type" >&5
target_alias=$target
case "$target_alias" in
@@ -689,7 +691,7 @@ target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$target" 1>&6
echo $ac_n "checking build system type""... $ac_c" 1>&6
-echo "configure:693: checking build system type" >&5
+echo "configure:695: checking build system type" >&5
build_alias=$build
case "$build_alias" in
@@ -721,7 +723,7 @@ fi
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:725: checking for $ac_word" >&5
+echo "configure:727: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -753,7 +755,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:757: checking for $ac_word" >&5
+echo "configure:759: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -789,7 +791,7 @@ if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:793: checking for $ac_word" >&5
+echo "configure:795: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -838,7 +840,7 @@ fi
fi
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:842: checking whether we are using GNU C" >&5
+echo "configure:844: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -847,7 +849,7 @@ else
yes;
#endif
EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:851: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:853: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
@@ -862,7 +864,7 @@ if test $ac_cv_prog_gcc = yes; then
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:866: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:868: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -892,7 +894,7 @@ fi
# Extract the first word of "${ac_tool_prefix}g++", so it can be a program name with args.
set dummy ${ac_tool_prefix}g++; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:896: checking for $ac_word" >&5
+echo "configure:898: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -924,7 +926,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "g++", so it can be a program name with args.
set dummy g++; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:928: checking for $ac_word" >&5
+echo "configure:930: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -960,7 +962,7 @@ if test -z "$CXX"; then
# Extract the first word of "c++", so it can be a program name with args.
set dummy c++; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:964: checking for $ac_word" >&5
+echo "configure:966: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1009,7 +1011,7 @@ esac
# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
set dummy ${ac_tool_prefix}ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1013: checking for $ac_word" >&5
+echo "configure:1015: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1041,7 +1043,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1045: checking for $ac_word" >&5
+echo "configure:1047: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1076,7 +1078,7 @@ fi
# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
set dummy ${ac_tool_prefix}as; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1080: checking for $ac_word" >&5
+echo "configure:1082: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1108,7 +1110,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "as", so it can be a program name with args.
set dummy as; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1112: checking for $ac_word" >&5
+echo "configure:1114: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1143,7 +1145,7 @@ fi
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1147: checking for $ac_word" >&5
+echo "configure:1149: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1175,7 +1177,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1179: checking for $ac_word" >&5
+echo "configure:1181: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1210,7 +1212,7 @@ fi
# Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
set dummy ${ac_tool_prefix}ld; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1214: checking for $ac_word" >&5
+echo "configure:1216: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1242,7 +1244,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "ld", so it can be a program name with args.
set dummy ld; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1246: checking for $ac_word" >&5
+echo "configure:1248: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1277,7 +1279,7 @@ fi
# Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args.
set dummy ${ac_tool_prefix}nm; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1281: checking for $ac_word" >&5
+echo "configure:1283: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_NM'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1309,7 +1311,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "nm", so it can be a program name with args.
set dummy nm; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1313: checking for $ac_word" >&5
+echo "configure:1315: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_NM'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1344,7 +1346,7 @@ fi
# Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
set dummy ${ac_tool_prefix}dlltool; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1348: checking for $ac_word" >&5
+echo "configure:1350: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1376,7 +1378,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "dlltool", so it can be a program name with args.
set dummy dlltool; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1380: checking for $ac_word" >&5
+echo "configure:1382: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1411,7 +1413,7 @@ fi
# Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args.
set dummy ${ac_tool_prefix}windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1415: checking for $ac_word" >&5
+echo "configure:1417: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1443,7 +1445,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "windres", so it can be a program name with args.
set dummy windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1447: checking for $ac_word" >&5
+echo "configure:1449: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1477,7 +1479,7 @@ fi
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1481: checking how to run the C preprocessor" >&5
+echo "configure:1483: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
@@ -1492,13 +1494,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
-#line 1496 "configure"
+#line 1498 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1502: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1504: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1509,13 +1511,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
-#line 1513 "configure"
+#line 1515 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1519: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1521: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1526,13 +1528,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF
-#line 1530 "configure"
+#line 1532 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1536: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1538: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1559,19 +1561,19 @@ echo "$ac_t""$CPP" 1>&6
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
# for constant arguments. Useless!
echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:1563: checking for working alloca.h" >&5
+echo "configure:1565: checking for working alloca.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1568 "configure"
+#line 1570 "configure"
#include "confdefs.h"
#include <alloca.h>
int main() {
char *p = alloca(2 * sizeof(int));
; return 0; }
EOF
-if { (eval echo configure:1575: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1577: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_header_alloca_h=yes
else
@@ -1592,12 +1594,12 @@ EOF
fi
echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:1596: checking for alloca" >&5
+echo "configure:1598: checking for alloca" >&5
if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1601 "configure"
+#line 1603 "configure"
#include "confdefs.h"
#ifdef __GNUC__
@@ -1625,7 +1627,7 @@ int main() {
char *p = (char *) alloca(1);
; return 0; }
EOF
-if { (eval echo configure:1629: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1631: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_func_alloca_works=yes
else
@@ -1657,12 +1659,12 @@ EOF
echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:1661: checking whether alloca needs Cray hooks" >&5
+echo "configure:1663: checking whether alloca needs Cray hooks" >&5
if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1666 "configure"
+#line 1668 "configure"
#include "confdefs.h"
#if defined(CRAY) && ! defined(CRAY2)
webecray
@@ -1687,12 +1689,12 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
if test $ac_cv_os_cray = yes; then
for ac_func in _getb67 GETB67 getb67; do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1691: checking for $ac_func" >&5
+echo "configure:1693: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1696 "configure"
+#line 1698 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -1715,7 +1717,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:1719: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1721: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -1742,7 +1744,7 @@ done
fi
echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:1746: checking stack direction for C alloca" >&5
+echo "configure:1748: checking stack direction for C alloca" >&5
if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1750,7 +1752,7 @@ else
ac_cv_c_stack_direction=0
else
cat > conftest.$ac_ext <<EOF
-#line 1754 "configure"
+#line 1756 "configure"
#include "confdefs.h"
find_stack_direction ()
{
@@ -1769,7 +1771,7 @@ main ()
exit (find_stack_direction() < 0);
}
EOF
-if { (eval echo configure:1773: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1775: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_c_stack_direction=1
else
@@ -1791,7 +1793,7 @@ EOF
fi
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:1795: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:1797: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1828,7 +1830,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 1832 "configure"
+#line 1834 "configure"
#include "confdefs.h"
#include <string.h>
@@ -1841,7 +1843,7 @@ int main() {
; return 0; }
EOF
-if { (eval echo configure:1845: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1847: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
use_builtin_memset=yes
else
diff --git a/winsup/cygwin/configure.in b/winsup/cygwin/configure.in
index c192221..2c26d4d 100644
--- a/winsup/cygwin/configure.in
+++ b/winsup/cygwin/configure.in
@@ -13,6 +13,8 @@ AC_PREREQ(2.12)dnl
AC_INIT(init.cc)
AC_CONFIG_HEADER(config.h)
+INSTALL="/bin/sh "`cd $srcdir/../..; echo $(pwd)/install-sh -c`
+
AC_PROG_INSTALL
dnl FIXME: We temporarily define our own version of AC_PROG_CC. This is
diff --git a/winsup/cygwin/crt0.c b/winsup/cygwin/crt0.c
index 2837a54..52ba7bd 100644
--- a/winsup/cygwin/crt0.c
+++ b/winsup/cygwin/crt0.c
@@ -30,6 +30,8 @@ int __cygwin_crt0_bp = 0;
extern int main (int argc, char **argv);
+void cygwin_crt0 (int (*main) (int, char **));
+
void
mainCRTStartup ()
{
diff --git a/winsup/cygwin/cygheap.h b/winsup/cygwin/cygheap.h
index 215d202..6ff20d5 100644
--- a/winsup/cygwin/cygheap.h
+++ b/winsup/cygwin/cygheap.h
@@ -92,14 +92,6 @@ enum homebodies
CH_HOME
};
-enum impersonation
-{
- IMP_BAD = -1,
- IMP_NONE = 0,
- IMP_EXTERNAL,
- IMP_INTERNAL
-};
-
class cygheap_user
{
/* Extendend user information.
@@ -125,7 +117,7 @@ public:
to `set_impersonation_token()'. */
HANDLE external_token;
HANDLE internal_token;
- enum impersonation impersonation_state;
+ HANDLE current_token;
/* CGF 2002-06-27. I removed the initializaton from this constructor
since this class is always allocated statically. That means that everything
@@ -170,41 +162,40 @@ public:
PSID sid () const { return psid; }
PSID orig_sid () const { return orig_psid; }
const char *ontherange (homebodies what, struct passwd * = NULL);
- bool issetuid () const
- {
- return impersonation_state > IMP_NONE;
- }
- HANDLE token ()
- {
- if (impersonation_state == IMP_EXTERNAL)
- return external_token;
- if (impersonation_state == IMP_INTERNAL)
- return internal_token;
- return INVALID_HANDLE_VALUE;
- }
+ bool issetuid () const { return current_token != INVALID_HANDLE_VALUE; }
+ HANDLE token () { return current_token; }
void deimpersonate ()
{
- if (impersonation_state > IMP_NONE)
+ if (issetuid ())
RevertToSelf ();
}
void reimpersonate ()
{
- if (impersonation_state > IMP_NONE
+ if (issetuid ()
&& !ImpersonateLoggedOnUser (token ()))
system_printf ("ImpersonateLoggedOnUser: %E");
}
- bool has_impersonation_tokens () { return external_token || internal_token; }
+ bool has_impersonation_tokens ()
+ { return external_token != INVALID_HANDLE_VALUE
+ || internal_token != INVALID_HANDLE_VALUE
+ || current_token != INVALID_HANDLE_VALUE; }
void close_impersonation_tokens ()
{
- if (external_token)
+ if (current_token != INVALID_HANDLE_VALUE)
+ {
+ if( current_token != external_token && current_token != internal_token)
+ CloseHandle (current_token);
+ current_token = INVALID_HANDLE_VALUE;
+ }
+ if (external_token != INVALID_HANDLE_VALUE)
{
CloseHandle (external_token);
- external_token = 0;
+ external_token = INVALID_HANDLE_VALUE;
}
- if (internal_token)
+ if (internal_token != INVALID_HANDLE_VALUE)
{
CloseHandle (internal_token);
- internal_token = 0;
+ internal_token = INVALID_HANDLE_VALUE;
}
}
const char *cygheap_user::test_uid (char *&, const char *, size_t)
diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din
index 107dc00..ab8786d 100644
--- a/winsup/cygwin/cygwin.din
+++ b/winsup/cygwin/cygwin.din
@@ -425,6 +425,7 @@ fdim
fdimf
fdopen
_fdopen = fdopen
+_fdopen64 = fdopen64
feof
_feof = feof
ferror
@@ -820,6 +821,7 @@ _memcpy = memcpy
memmove
_memmove = memmove
mempcpy
+__mempcpy = mempcpy
memset
_memset = memset
mkdir
diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc
index 04449b2..afaeff0 100644
--- a/winsup/cygwin/dcrt0.cc
+++ b/winsup/cygwin/dcrt0.cc
@@ -634,6 +634,10 @@ dll_crt0_1 ()
if (!user_data->forkee)
pthread::init_mainthread ();
+#ifdef DEBUGGING
+ strace.microseconds ();
+#endif
+
/* Initialize debug muto, if DLL is built with --enable-debugging.
Need to do this before any helper threads start. */
debug_init ();
@@ -848,9 +852,6 @@ _dll_crt0 ()
initial_env ();
char zeros[sizeof (fork_info->zero)] = {0};
static NO_COPY STARTUPINFO si;
-#ifdef DEBUGGING
- strace.microseconds ();
-#endif
main_environ = user_data->envptr;
*main_environ = NULL;
diff --git a/winsup/cygwin/environ.cc b/winsup/cygwin/environ.cc
index 6c75f98..de50770 100644
--- a/winsup/cygwin/environ.cc
+++ b/winsup/cygwin/environ.cc
@@ -405,7 +405,7 @@ check_case_init (const char *buf)
if (!buf || !*buf)
return;
- if (strncmp (buf, "relax", 5)== 0)
+ if (strncasematch (buf, "relax", 5))
{
pcheck_case = PCHECK_RELAXED;
debug_printf ("File case checking set to RELAXED");
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index 3c8bf39..e7c3041 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -923,25 +923,29 @@ setup_handler (int sig, void *handler, struct sigaction& siga)
static BOOL WINAPI
ctrl_c_handler (DWORD type)
{
- if (type == CTRL_LOGOFF_EVENT)
- return TRUE;
+ static bool saw_close;
/* Return FALSE to prevent an "End task" dialog box from appearing
for each Cygwin process window that's open when the computer
is shut down or console window is closed. */
+
if (type == CTRL_SHUTDOWN_EVENT)
{
#if 0
/* Don't send a signal. Only NT service applications and their child
- processes will receive this event and the services typically already
+ processes will receive this event and the services typically already
handle the shutdown action when getting the SERVICE_CONTROL_SHUTDOWN
control message. */
sig_send (NULL, SIGTERM);
#endif
return FALSE;
}
- if (type == CTRL_CLOSE_EVENT)
+
+ if (myself->ctty != -1
+ && (type == CTRL_CLOSE_EVENT || (!saw_close && type == CTRL_LOGOFF_EVENT)))
{
+ if (type == CTRL_CLOSE_EVENT)
+ saw_close = true;
sig_send (NULL, SIGHUP);
return FALSE;
}
diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc
index 253fca6..f9b8225 100644
--- a/winsup/cygwin/fhandler.cc
+++ b/winsup/cygwin/fhandler.cc
@@ -723,28 +723,29 @@ fhandler_base::readv (const struct iovec *const iov, const int iovcnt,
assert (iov);
assert (iovcnt >= 1);
+ size_t len = tot;
if (iovcnt == 1)
{
- size_t len = iov->iov_len;
+ len = iov->iov_len;
read (iov->iov_base, len);
return len;
}
if (tot == -1) // i.e. if not pre-calculated by the caller.
{
- tot = 0;
+ len = 0;
const struct iovec *iovptr = iov + iovcnt;
do
{
iovptr -= 1;
- tot += iovptr->iov_len;
+ len += iovptr->iov_len;
}
while (iovptr != iov);
}
assert (tot >= 0);
- if (tot == 0)
+ if (!len)
return 0;
char *buf = (char *) alloca (tot);
@@ -755,10 +756,10 @@ fhandler_base::readv (const struct iovec *const iov, const int iovcnt,
return -1;
}
- read (buf, (size_t) tot);
+ read (buf, len);
+ ssize_t nbytes = (ssize_t) len;
const struct iovec *iovptr = iov;
- int nbytes = tot;
while (nbytes > 0)
{
@@ -769,7 +770,7 @@ fhandler_base::readv (const struct iovec *const iov, const int iovcnt,
nbytes -= frag;
}
- return tot;
+ return len;
}
ssize_t
@@ -855,13 +856,13 @@ fhandler_base::lseek (_off64_t offset, int whence)
DWORD win32_whence = whence == SEEK_SET ? FILE_BEGIN
: (whence == SEEK_CUR ? FILE_CURRENT : FILE_END);
- LONG off_low = offset & 0xffffffff;
+ LONG off_low = ((__uint64_t) offset) & 0xffffffffLL;
LONG *poff_high, off_high;
if (!wincap.has_64bit_file_access ())
poff_high = NULL;
else
{
- off_high = offset >> 32;
+ off_high = ((__uint64_t) offset) >> 32LL;
poff_high = &off_high;
}
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc
index 49aae6c..5495e88 100644
--- a/winsup/cygwin/fhandler_disk_file.cc
+++ b/winsup/cygwin/fhandler_disk_file.cc
@@ -128,7 +128,7 @@ fhandler_base::fstat_by_name (struct __stat64 *buf)
FILETIME ft = {};
res = fstat_helper (buf, ft, ft, ft, 0, 0);
}
- else
+ else
{
debug_printf ("FindFirstFile failed for '%s', %E", (char *) pc);
__seterrno ();
@@ -232,7 +232,7 @@ fhandler_base::fstat_helper (struct __stat64 *buf,
/* Although the documentation indicates otherwise, it seems like
"inodes" on these devices are persistent, at least across reboots. */
buf->st_ino = (((__ino64_t) nFileIndexHigh) << 32)
- | (__ino64_t) nFileIndexLow;
+ | (__ino64_t) nFileIndexLow;
break;
default:
/* Either the nFileIndex* fields are unreliable or unavailable. Use the
@@ -786,10 +786,7 @@ fhandler_cygdrive::readdir (DIR *dir)
if (!iscygdrive_root ())
return fhandler_disk_file::readdir (dir);
if (!pdrive || !*pdrive)
- {
- set_errno (ENMFILE);
- return NULL;
- }
+ return NULL;
else if (dir->__d_position > 1
&& GetFileAttributes (pdrive) == INVALID_FILE_ATTRIBUTES)
{
diff --git a/winsup/cygwin/fhandler_proc.cc b/winsup/cygwin/fhandler_proc.cc
index 6687317..42bd8e1 100644
--- a/winsup/cygwin/fhandler_proc.cc
+++ b/winsup/cygwin/fhandler_proc.cc
@@ -201,7 +201,6 @@ fhandler_proc::readdir (DIR * dir)
dir->__d_position++;
return dir->__d_dirent;
}
- set_errno (ENMFILE);
return NULL;
}
@@ -457,7 +456,7 @@ format_proc_stat (char *destbuf, size_t maxsize)
char *eobuf = destbuf;
if (!wincap.is_winnt ())
- eobuf += __small_sprintf (destbuf, "cpu %U %U %U %U\n", 0, 0, 0, 0);
+ eobuf += __small_sprintf (destbuf, "cpu %U %U %U %U\n", 0ULL, 0ULL, 0ULL, 0ULL);
else
{
NTSTATUS ret;
@@ -634,30 +633,30 @@ format_proc_cpuinfo (char *destbuf, size_t maxsize)
bufptr += __small_sprintf (bufptr, "vendor_id : %s\n", szBuffer);
read_value ("Identifier", REG_SZ);
bufptr += __small_sprintf (bufptr, "identifier : %s\n", szBuffer);
- if (wincap.is_winnt ())
- {
+ if (wincap.is_winnt ())
+ {
read_value ("~Mhz", REG_DWORD);
bufptr += __small_sprintf (bufptr, "cpu MHz : %u\n", *(DWORD *) szBuffer);
print ("flags :");
if (IsProcessorFeaturePresent (PF_3DNOW_INSTRUCTIONS_AVAILABLE))
- print (" 3dnow");
+ print (" 3dnow");
if (IsProcessorFeaturePresent (PF_COMPARE_EXCHANGE_DOUBLE))
- print (" cx8");
+ print (" cx8");
if (!IsProcessorFeaturePresent (PF_FLOATING_POINT_EMULATED))
- print (" fpu");
+ print (" fpu");
if (IsProcessorFeaturePresent (PF_MMX_INSTRUCTIONS_AVAILABLE))
- print (" mmx");
+ print (" mmx");
if (IsProcessorFeaturePresent (PF_PAE_ENABLED))
- print (" pae");
+ print (" pae");
if (IsProcessorFeaturePresent (PF_RDTSC_INSTRUCTION_AVAILABLE))
- print (" tsc");
+ print (" tsc");
if (IsProcessorFeaturePresent (PF_XMMI_INSTRUCTIONS_AVAILABLE))
- print (" sse");
+ print (" sse");
if (IsProcessorFeaturePresent (PF_XMMI64_INSTRUCTIONS_AVAILABLE))
- print (" sse2");
+ print (" sse2");
}
- }
+ }
else
{
bufptr += __small_sprintf (bufptr, "processor : %d\n", cpu_number);
@@ -666,12 +665,12 @@ format_proc_cpuinfo (char *destbuf, size_t maxsize)
maxf &= 0xffff;
vendor_id[3] = 0;
bufptr += __small_sprintf (bufptr, "vendor_id : %s\n", (char *)vendor_id);
- unsigned cpu_mhz = 0;
- if (wincap.is_winnt ())
- {
+ unsigned cpu_mhz = 0;
+ if (wincap.is_winnt ())
+ {
read_value ("~Mhz", REG_DWORD);
cpu_mhz = *(DWORD *)szBuffer;
- }
+ }
if (maxf >= 1)
{
unsigned features2, features1, extra_info, cpuid_sig;
@@ -717,10 +716,10 @@ format_proc_cpuinfo (char *destbuf, size_t maxsize)
// could implement a lookup table here if someone needs it
strcpy (szBuffer, "unknown");
}
- if (wincap.is_winnt ())
- {
- bufptr += __small_sprintf (bufptr, "type : %s\n"
- "cpu family : %d\n"
+ if (wincap.is_winnt ())
+ {
+ bufptr += __small_sprintf (bufptr, "type : %s\n"
+ "cpu family : %d\n"
"model : %d\n"
"model name : %s\n"
"stepping : %d\n"
@@ -739,28 +738,28 @@ format_proc_cpuinfo (char *destbuf, size_t maxsize)
apic_id,
cpu_mhz,
(features1 & (1 << 0)) ? "yes" : "no");
- }
- else
- {
- bufptr += __small_sprintf (bufptr, "type : %s\n"
- "cpu family : %d\n"
- "model : %d\n"
- "model name : %s\n"
- "stepping : %d\n"
- "brand id : %d\n"
- "cpu count : %d\n"
- "apic id : %d\n"
- "fpu : %s\n",
- type_str,
- family,
- model,
- szBuffer,
- stepping,
- brand_id,
- cpu_count,
- apic_id,
- (features1 & (1 << 0)) ? "yes" : "no");
- }
+ }
+ else
+ {
+ bufptr += __small_sprintf (bufptr, "type : %s\n"
+ "cpu family : %d\n"
+ "model : %d\n"
+ "model name : %s\n"
+ "stepping : %d\n"
+ "brand id : %d\n"
+ "cpu count : %d\n"
+ "apic id : %d\n"
+ "fpu : %s\n",
+ type_str,
+ family,
+ model,
+ szBuffer,
+ stepping,
+ brand_id,
+ cpu_count,
+ apic_id,
+ (features1 & (1 << 0)) ? "yes" : "no");
+ }
print ("flags :");
if (features1 & (1 << 0))
print (" fpu");
diff --git a/winsup/cygwin/fhandler_process.cc b/winsup/cygwin/fhandler_process.cc
index 92eb22a..3b61cd9 100644
--- a/winsup/cygwin/fhandler_process.cc
+++ b/winsup/cygwin/fhandler_process.cc
@@ -147,10 +147,7 @@ struct dirent *
fhandler_process::readdir (DIR * dir)
{
if (dir->__d_position >= PROCESS_LINK_COUNT)
- {
- set_errno (ENMFILE);
- return NULL;
- }
+ return NULL;
strcpy (dir->__d_dirent->d_name, process_listing[dir->__d_position++]);
syscall_printf ("%p = readdir (%p) (%s)", &dir->__d_dirent, dir,
dir->__d_dirent->d_name);
diff --git a/winsup/cygwin/fhandler_registry.cc b/winsup/cygwin/fhandler_registry.cc
index 9137014..42c87e3 100644
--- a/winsup/cygwin/fhandler_registry.cc
+++ b/winsup/cygwin/fhandler_registry.cc
@@ -331,7 +331,8 @@ retry:
{
RegCloseKey ((HKEY) dir->__d_u.__d_data.__handle);
dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE;
- seterrno_from_win_error (__FILE__, __LINE__, error);
+ if (error != ERROR_NO_MORE_ITEMS)
+ seterrno_from_win_error (__FILE__, __LINE__, error);
goto out;
}
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc
index 3dc1690..338ce27 100644
--- a/winsup/cygwin/fhandler_socket.cc
+++ b/winsup/cygwin/fhandler_socket.cc
@@ -47,7 +47,7 @@ secret_event_name (char *buf, short port, int *secret_ptr)
{
__small_sprintf (buf, "%scygwin.local_socket.secret.%d.%08x-%08x-%08x-%08x",
wincap.has_terminal_services () ? "Global\\" : "",
- port,
+ port,
secret_ptr [0], secret_ptr [1],
secret_ptr [2], secret_ptr [3]);
}
@@ -231,7 +231,7 @@ fhandler_socket::check_peer_secret_event (struct sockaddr_in* peer, int* secret)
{
char event_name[MAX_PATH];
-
+
secret_event_name (event_name, peer->sin_port, secret ?: connect_secret);
HANDLE ev = CreateEvent (&sec_all_nih, FALSE, FALSE, event_name);
if (!ev && GetLastError () == ERROR_ALREADY_EXISTS)
@@ -943,7 +943,7 @@ fhandler_socket::sendto (const void *ptr, size_t len, int flags,
res = ret;
/* Special handling for EPIPE and SIGPIPE.
-
+
EPIPE is generated if the local end has been shut down on a connection
oriented socket. In this case the process will also receive a SIGPIPE
unless MSG_NOSIGNAL is set. */
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index 3c88fcc..de5bae1 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -555,25 +555,22 @@ fhandler_tty_slave::open (int flags, mode_t)
set_output_handle (to_master_local);
set_open_status ();
- if (!output_done_event)
+ if (fhandler_console::open_fhs++ == 0 && !output_done_event
+ && wincap.pty_needs_alloc_console ())
{
- if (fhandler_console::open_fhs++ == 0
- && wincap.pty_needs_alloc_console ())
+ BOOL b;
+ HWINSTA h = CreateWindowStation (NULL, 0, GENERIC_READ | GENERIC_WRITE, &sec_none_nih);
+ termios_printf ("CreateWindowStation %p, %E", h);
+ if (h)
{
- BOOL b;
- HWINSTA h = CreateWindowStation (NULL, 0, GENERIC_READ | GENERIC_WRITE, &sec_none_nih);
- termios_printf ("CreateWindowStation %p, %E", h);
- if (h)
- {
- b = SetProcessWindowStation (h);
- termios_printf ("SetProcessWindowStation %d, %E", b);
- }
- b = AllocConsole (); // will cause flashing if workstation
- // stuff fails
- termios_printf ("%d = AllocConsole ()", b);
+ b = SetProcessWindowStation (h);
+ termios_printf ("SetProcessWindowStation %d, %E", b);
}
- termios_printf ("incremented open_fhs %d", fhandler_console::open_fhs);
+ b = AllocConsole (); // will cause flashing if workstation
+ // stuff fails
+ termios_printf ("%d = AllocConsole ()", b);
}
+ termios_printf ("incremented open_fhs %d", fhandler_console::open_fhs);
termios_printf ("tty%d opened", get_unit ());
return 1;
@@ -582,12 +579,9 @@ fhandler_tty_slave::open (int flags, mode_t)
int
fhandler_tty_slave::close ()
{
- if (!output_done_event)
- {
- if (!--fhandler_console::open_fhs && myself->ctty == -1)
- FreeConsole ();
- termios_printf ("decremented open_fhs %d", fhandler_console::open_fhs);
- }
+ if (!--fhandler_console::open_fhs && myself->ctty == -1)
+ FreeConsole ();
+ termios_printf ("decremented open_fhs %d", fhandler_console::open_fhs);
return fhandler_tty_common::close ();
}
@@ -855,11 +849,8 @@ fhandler_tty_slave::read (void *ptr, size_t& len)
int
fhandler_tty_slave::dup (fhandler_base *child)
{
- if (!output_done_event)
- {
- fhandler_console::open_fhs++;
- termios_printf ("incremented open_fhs %d", fhandler_console::open_fhs);
- }
+ fhandler_console::open_fhs++;
+ termios_printf ("incremented open_fhs %d", fhandler_console::open_fhs);
return fhandler_tty_common::dup (child);
}
@@ -1254,11 +1245,8 @@ fhandler_tty_common::set_close_on_exec (int val)
void
fhandler_tty_slave::fixup_after_fork (HANDLE parent)
{
- if (!output_done_event)
- {
- fhandler_console::open_fhs++;
- termios_printf ("incremented open_fhs %d", fhandler_console::open_fhs);
- }
+ fhandler_console::open_fhs++;
+ termios_printf ("incremented open_fhs %d", fhandler_console::open_fhs);
fhandler_tty_common::fixup_after_fork (parent);
}
@@ -1318,6 +1306,7 @@ fhandler_tty_master::init_console ()
return -1;
console->init (INVALID_HANDLE_VALUE, GENERIC_READ | GENERIC_WRITE, O_BINARY);
+ fhandler_console::open_fhs--; /* handled when individual fds are opened */
console->set_r_no_interrupt (1);
return 0;
}
diff --git a/winsup/cygwin/include/cygwin/socket.h b/winsup/cygwin/include/cygwin/socket.h
index f89a8ed..67e1345 100644
--- a/winsup/cygwin/include/cygwin/socket.h
+++ b/winsup/cygwin/include/cygwin/socket.h
@@ -75,7 +75,9 @@ struct msghdr
#define AF_HYLINK 15 /* NSC Hyperchannel */
#define AF_APPLETALK 16 /* AppleTalk */
#define AF_NETBIOS 17 /* NetBios-style addresses */
+#if 0 /* Not yet */
#define AF_INET6 23 /* IP version 6 */
+#endif
#define AF_MAX 32
/*
@@ -101,7 +103,9 @@ struct msghdr
#define PF_HYLINK AF_HYLINK
#define PF_APPLETALK AF_APPLETALK
#define PF_NETBIOS AF_NETBIOS
+#if 0
#define PF_INET6 AF_INET6
+#endif
#define PF_MAX AF_MAX
diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h
index 6954d09..05be44f 100644
--- a/winsup/cygwin/include/cygwin/version.h
+++ b/winsup/cygwin/include/cygwin/version.h
@@ -42,7 +42,7 @@ details. */
changes to the DLL and is mainly informative in nature. */
#define CYGWIN_VERSION_DLL_MAJOR 1005
-#define CYGWIN_VERSION_DLL_MINOR 1
+#define CYGWIN_VERSION_DLL_MINOR 2
/* Major numbers before CYGWIN_VERSION_DLL_EPOCH are
incompatible. */
@@ -208,12 +208,14 @@ details. */
86: Export ftok
87: Export vsyslog
88: Export _getreent
+ 89: Export __mempcpy
+ 90: Export _fopen64
*/
/* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
#define CYGWIN_VERSION_API_MAJOR 0
-#define CYGWIN_VERSION_API_MINOR 88
+#define CYGWIN_VERSION_API_MINOR 90
/* There is also a compatibity version number associated with the
shared memory regions. It is incremented when incompatible
diff --git a/winsup/cygwin/ipc.cc b/winsup/cygwin/ipc.cc
index d37f459..c89b23e 100644
--- a/winsup/cygwin/ipc.cc
+++ b/winsup/cygwin/ipc.cc
@@ -35,45 +35,45 @@ ftok (const char *path, int id)
We will have to alias; leaving open the possibility that the same
key will be returned for multiple files. This possibility exists
also on Linux; the question is, how to minimize this possibility.
-
+
How to solve? Well, based on C. Vinschen's research, the nFileIndex*
words vary as follows, on a partition with > 110,000 files
nFileIndexHigh: 564 values between 0x00010000 -- 0xffff0000
nFileIndexLow : 103812 values between 0x00000000 -- 0x0003ffff
- R. Collins suggests that these may represent a tree path,
+ R. Collins suggests that these may represent a tree path,
and that it would require ~2.9M files to force the tree depth
to increase and reveal more bit usage.
-
+
Implementation details: dev_t is 32bits, but is formed by
- device(32bits) << 16 | unit(32bits)
+ device(32bits) << 16 | unit(32bits)
But device is ACTUALLY == status & FH_DEVMASK, where FH_DEVMASK
is 0x00000fff --> 12 bits
-
- As it happens, the maximum number of devices is actually
+
+ As it happens, the maximum number of devices is actually
FH_NDEV, not FH_DEVMASK, where FH_NDEV is currently 0x0000001d.
However, FH_NDEV grows as new device types are added. So
currently the device number needs 5 bits, but later? Let's
take a cue from Linux, and use the lower 8 bits (instead of the
lower 12 or 16) for the device (major?) number.
-
+
Similarly, while 'units' is an int (32bits), it is unclear
how many of these are significant. For most devices, it seems that
'units' is equivalent to 'minor'. For FH_TAPE, it's obvious that
only 8 bits are important. However, for FH_SOCKET...it might be
as high as 16 significant bits.
-
+
Let's assume that we only need 8 bits from device (major) and
only 8 bits from unit (minor). (On linux, only 8 bits of minor
are used, and none from major).
---> so, we only need 0x00ff00ff (16 bits) of dev_t
-
+
---> we MUST have all 8 bits of id.
-
+
---> So, we only have 64 - 8 - 16 = 40 bits for ino_t. But, we
need 0xffff0000 for nFileIndexHigh and 0x0003ffff for nFileIndexLow
minimum, or 16 + 18 = 34 bits. Lucky us - we have 6 more bits
to distribute.
-
+
For lack of a better idea, we'll allocate 2 of the extra bits to
nFileIndexHigh and 4 to nFileIndexLow. */
diff --git a/winsup/cygwin/mmap.cc b/winsup/cygwin/mmap.cc
index 08f89c8..d4f9532 100644
--- a/winsup/cygwin/mmap.cc
+++ b/winsup/cygwin/mmap.cc
@@ -123,12 +123,12 @@ mmap_record::alloc_map (_off64_t off, DWORD len)
len = PAGE_CNT (len) * getpagesize ();
if (off > 0 &&
!VirtualProtect (base_address_, off, PAGE_NOACCESS, &old_prot))
- syscall_printf ("VirtualProtect(%x,%d) failed: %E", base_address_, off);
+ syscall_printf ("VirtualProtect(%x,%D) failed: %E", base_address_, off);
if (off + len < size_to_map_
&& !VirtualProtect (base_address_ + off + len,
size_to_map_ - len - off,
PAGE_NOACCESS, &old_prot))
- syscall_printf ("VirtualProtect(%x,%d) failed: %E",
+ syscall_printf ("VirtualProtect(%x,%D) failed: %E",
base_address_ + off + len, size_to_map_ - len - off);
off /= getpagesize ();
len /= getpagesize ();
@@ -158,7 +158,7 @@ mmap_record::map_map (_off64_t off, DWORD len)
break;
}
- debug_printf ("map_map (fd=%d, off=%D, len=%d)", fdesc_, off, len);
+ debug_printf ("map_map (fd=%d, off=%D, len=%u)", fdesc_, off, len);
len = PAGE_CNT (len);
if ((off = find_empty (len)) == (DWORD)-1)
@@ -333,7 +333,7 @@ list::match (caddr_t addr, DWORD len, caddr_t &m_addr, DWORD &m_len,
for (int i = start + 1; i < nrecs; ++i)
{
low = (addr >= recs[i].get_address ()) ? addr : recs[i].get_address ();
- high = recs[i].get_address ()
+ high = recs[i].get_address ()
+ (PAGE_CNT (recs[i].get_size ()) * getpagesize ());
high = (addr + len < high) ? addr + len : high;
if (low < high)
@@ -436,7 +436,7 @@ static map *mmapped_areas;
extern "C" caddr_t
mmap64 (caddr_t addr, size_t len, int prot, int flags, int fd, _off64_t off)
{
- syscall_printf ("addr %x, len %d, prot %x, flags %x, fd %d, off %D",
+ syscall_printf ("addr %x, len %u, prot %x, flags %x, fd %d, off %D",
addr, len, prot, flags, fd, off);
static DWORD granularity;
@@ -566,7 +566,7 @@ mmap64 (caddr_t addr, size_t len, int prot, int flags, int fd, _off64_t off)
The offset is re-added when evaluating the return value. */
if (base)
base -= off - gran_off;
-
+
HANDLE h = fh->mmap (&base, gran_len, access, flags, gran_off);
if (h == INVALID_HANDLE_VALUE)
@@ -619,7 +619,7 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, _off_t off)
extern "C" int
munmap (caddr_t addr, size_t len)
{
- syscall_printf ("munmap (addr %x, len %d)", addr, len);
+ syscall_printf ("munmap (addr %x, len %u)", addr, len);
/* Error conditions according to SUSv3 */
if (!addr || ((DWORD)addr % getpagesize ()) || !len
@@ -676,7 +676,7 @@ munmap (caddr_t addr, size_t len)
extern "C" int
msync (caddr_t addr, size_t len, int flags)
{
- syscall_printf ("addr = %x, len = %d, flags = %x",
+ syscall_printf ("addr = %x, len = %u, flags = %x",
addr, len, flags);
/* However, check flags for validity. */
@@ -844,7 +844,7 @@ fhandler_disk_file::mmap (caddr_t *addr, size_t len, DWORD access,
if (!base && !(flags & MAP_FIXED))
base = MapViewOfFileEx (h, access, high, low, len, NULL);
debug_printf ("%x = MapViewOfFileEx (h:%x, access:%x, 0, off:%D, "
- "len:%d, addr:%x)", base, h, access, off, len, *addr);
+ "len:%u, addr:%x)", base, h, access, off, len, *addr);
if (!base || ((flags & MAP_FIXED) && base != *addr))
{
if (!base)
@@ -908,7 +908,7 @@ mprotect (caddr_t addr, size_t len, int prot)
DWORD old_prot;
DWORD new_prot = 0;
- syscall_printf ("mprotect (addr %x, len %d, prot %x)", addr, len, prot);
+ syscall_printf ("mprotect (addr %x, len %u, prot %x)", addr, len, prot);
if (!wincap.virtual_protect_works_on_shared_pages ()
&& addr >= (caddr_t)0x80000000 && addr <= (caddr_t)0xBFFFFFFF)
@@ -986,7 +986,7 @@ fixup_mmaps_after_fork (HANDLE parent)
{
mmap_record *rec = map_list->recs + li;
- debug_printf ("fd %d, h %x, access %x, offset %d, size %d, address %p",
+ debug_printf ("fd %d, h %x, access %x, offset %D, size %u, address %p",
rec->get_fd (), rec->get_handle (), rec->get_access (),
rec->get_offset (), rec->get_size (), rec->get_address ());
diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc
index 1d1abab..c662325 100644
--- a/winsup/cygwin/net.cc
+++ b/winsup/cygwin/net.cc
@@ -527,7 +527,7 @@ fdsock (cygheap_fdmanip& fd, const device *dev, SOCKET soc)
fd->set_io_handle ((HANDLE) soc);
fd->set_flags (O_RDWR | O_BINARY);
fd->set_r_no_interrupt (winsock2_active);
- cygheap->fdtab.inc_need_fixup_before ();
+ // CORINNA - needed? // cygheap->fdtab.inc_need_fixup_before ();
debug_printf ("fd %d, name '%s', soc %p", (int) fd, dev->name, soc);
return true;
}
@@ -771,14 +771,14 @@ cygwin_connect (int fd, const struct sockaddr *name, int namelen)
{
bool was_blocking = false;
if (!fh->is_nonblocking ())
- {
+ {
int nonblocking = 1;
fh->ioctl (FIONBIO, &nonblocking);
was_blocking = true;
}
res = fh->connect (name, namelen);
if (was_blocking)
- {
+ {
if (res == -1 && get_errno () == EINPROGRESS)
{
size_t fds_size = howmany (fd + 1, NFDBITS) * sizeof (fd_mask);
@@ -790,7 +790,7 @@ cygwin_connect (int fd, const struct sockaddr *name, int namelen)
FD_SET (fd, except_fds);
res = cygwin_select (fd + 1, NULL, write_fds, except_fds, NULL);
if (res > 0 && FD_ISSET (fd, except_fds))
- {
+ {
res = -1;
for (;;)
{
@@ -799,7 +799,7 @@ cygwin_connect (int fd, const struct sockaddr *name, int namelen)
cygwin_getsockopt (fd, SOL_SOCKET, SO_ERROR,
(void *) &err, &len);
if (err)
- {
+ {
set_errno (err);
break;
}
@@ -807,9 +807,9 @@ cygwin_connect (int fd, const struct sockaddr *name, int namelen)
}
}
else if (res > 0)
- res = 0;
+ res = 0;
else
- {
+ {
WSASetLastError (WSAEINPROGRESS);
set_winsock_errno ();
}
@@ -1300,7 +1300,7 @@ getdomainname (char *domain, size_t len)
/* This is only used by Win95 and NT <= 4.0.
The registry names are language independent.
- FIXME: Handle DHCP on Win95. The DhcpDomain(s) may be available
+ FIXME: Handle DHCP on Win95. The DhcpDomain(s) may be available
in ..VxD\DHCP\DhcpInfoXX\OptionInfo, RFC 1533 format */
reg_key r (HKEY_LOCAL_MACHINE, KEY_READ,
diff --git a/winsup/cygwin/ntdll.h b/winsup/cygwin/ntdll.h
index 220cf3e..45739bf 100644
--- a/winsup/cygwin/ntdll.h
+++ b/winsup/cygwin/ntdll.h
@@ -9,7 +9,6 @@
details. */
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xc0000004)
-#define FILE_SYNCHRONOUS_IO_NONALERT 32
#define PDI_MODULES 0x01
#define PDI_HEAPS 0x04
#define LDRP_IMAGE_DLL 0x00000004
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 8947be7..440023d 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -892,8 +892,6 @@ digits (const char *name)
return p > name && !*p ? n : -1;
}
-
-
/* Return TRUE if src_path is a Win32 device name, filling out the device
name in win32_path */
@@ -1150,7 +1148,7 @@ set_flags (unsigned *flags, unsigned val)
}
}
-char special_chars[] =
+static char special_chars[] =
"\001" "\002" "\003" "\004" "\005" "\006" "\007" "\010"
"\011" "\012" "\013" "\014" "\015" "\016" "\017" "\020"
"\021" "\022" "\023" "\024" "\025" "\026" "\027" "\030"
@@ -1160,62 +1158,78 @@ char special_chars[] =
"I" "J" "K" "L" "M" "N" "O" "P"
"Q" "R" "S" "T" "U" "V" "W" "X"
"Y" "Z";
+static char special_introducers[] =
+ "anpcl";
-static inline char
-special_char (const char *s)
+static char
+special_char (const char *s, const char *valid_chars = special_chars)
{
- char *p = strechr (special_chars, *s);
- if (*p == '%' && strlen (p) >= 3)
- {
- char hex[] = {s[1], s[2], '\0'};
- unsigned char c = strtoul (hex, &p, 16);
- p = strechr (special_chars, c);
- }
- return *p;
-}
-
-bool
-fnunmunge (char *dst, const char *src)
-{
- bool converted = false;
- char c;
-
- while (*src)
- if (*src != '%' || !(c = special_char (src)))
- *dst++ = *src++;
- else
- {
- converted = true;
- *dst++ = c;
- src += 3;
- }
+ if (*s != '%' || strlen (s) < 3)
+ return 0;
- *dst = *src;
- return converted;
+ char *p;
+ char hex[] = {s[1], s[2], '\0'};
+ unsigned char c = strtoul (hex, &p, 16);
+ p = strechr (valid_chars, c);
+ return *p;
}
/* Determines if name is "special". Assumes that name is empty or "absolute" */
static int
-special_name (const char *s)
+special_name (const char *s, int inc = 1)
{
if (!*s)
return false;
- if (strpbrk (++s, special_chars))
+ s += inc;
+ if (strpbrk (s, special_chars))
return !strncasematch (s, "%2f", 3);
if (strcasematch (s, "nul")
|| strcasematch (s, "aux")
- || strcasematch (s, "prn"))
+ || strcasematch (s, "prn")
+ || strcasematch (s, "con")
+ || strcasematch (s, "conin$")
+ || strcasematch (s, "conout$"))
return -1;
if (!strncasematch (s, "com", 3)
&& !strncasematch (s, "lpt", 3))
return false;
char *p;
- (void) strtol (s, &p, 10);
+ (void) strtoul (s + 3, &p, 10);
return -(*p == '\0');
}
+bool
+fnunmunge (char *dst, const char *src)
+{
+ bool converted = false;
+ char c;
+
+ if ((c = special_char (src, special_introducers)))
+ {
+ __small_sprintf (dst, "%c%s", c, src + 3);
+ if (special_name (dst, 0))
+ {
+ *dst++ = c;
+ src += 3;
+ }
+ }
+
+ while (*src)
+ if (!(c = special_char (src)))
+ *dst++ = *src++;
+ else
+ {
+ converted = true;
+ *dst++ = c;
+ src += 3;
+ }
+
+ *dst = *src;
+ return converted;
+}
+
void
mount_item::fnmunge (char *dst, const char *src)
{
@@ -1227,19 +1241,13 @@ mount_item::fnmunge (char *dst, const char *src)
char *d = dst;
*d++ = *src++;
if (name_type < 0)
- {
- __small_sprintf (d, "%%%02x", (unsigned char) *src++);
- d += 3;
- }
+ d += __small_sprintf (d, "%%%02x", (unsigned char) *src++);
while (*src)
- if (!special_char (src))
+ if (!strchr (special_chars, *src) || (*src == '%' && !special_char (src)))
*d++ = *src++;
else
- {
- __small_sprintf (d, "%%%02x", (unsigned char) *src++);
- d += 3;
- }
+ d += __small_sprintf (d, "%%%02x", (unsigned char) *src++);
*d = *src;
}
@@ -2299,8 +2307,7 @@ cygdrive_getmntent ()
break;
__small_sprintf (native_path, "%c:\\", drive);
- if (GetDriveType (native_path) == DRIVE_REMOVABLE ||
- GetFileAttributes (native_path) == INVALID_FILE_ATTRIBUTES)
+ if (GetFileAttributes (native_path) == INVALID_FILE_ATTRIBUTES)
{
available_drives &= ~mask;
continue;
diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc
index 489a91e..9cb06c4 100644
--- a/winsup/cygwin/pinfo.cc
+++ b/winsup/cygwin/pinfo.cc
@@ -406,7 +406,7 @@ _pinfo::commune_send (DWORD code, ...)
/* FIXME: Need something better than an busy loop here */
bool isalive;
- for (int i = 0; (isalive = alive ()) || (i < 65536); i++)
+ for (int i = 0; (isalive = alive ()) && (i < 10000); i++)
if (myself->hello_pid <= 0)
break;
else
diff --git a/winsup/cygwin/security.cc b/winsup/cygwin/security.cc
index 47f7c33..8ceebdb 100644
--- a/winsup/cygwin/security.cc
+++ b/winsup/cygwin/security.cc
@@ -69,17 +69,8 @@ extern "C" void
cygwin_set_impersonation_token (const HANDLE hToken)
{
debug_printf ("set_impersonation_token (%d)", hToken);
- if (cygheap->user.impersonation_state == IMP_EXTERNAL
- && cygheap->user.external_token != hToken)
- {
- set_errno (EPERM);
- return;
- }
- else
- {
- cygheap->user.external_token = hToken;
- return;
- }
+ cygheap->user.external_token = hToken;
+ return;
}
void
@@ -741,42 +732,38 @@ verify_token (HANDLE token, cygsid &usersid, user_groups &groups, BOOL *pintern)
if (intern && !groups.issetgroups ())
{
char sd_buf[MAX_SID_LEN + sizeof (SECURITY_DESCRIPTOR)];
- PSID gsid = NO_SID;
+ cygpsid gsid (NO_SID);
if (!GetKernelObjectSecurity (token, GROUP_SECURITY_INFORMATION,
(PSECURITY_DESCRIPTOR) sd_buf,
sizeof sd_buf, &size))
debug_printf ("GetKernelObjectSecurity(): %E");
else if (!GetSecurityDescriptorGroup ((PSECURITY_DESCRIPTOR) sd_buf,
- &gsid, (BOOL *) &size))
+ (PSID *) &gsid, (BOOL *) &size))
debug_printf ("GetSecurityDescriptorGroup(): %E");
if (well_known_null_sid != gsid)
return gsid == groups.pgsid;
}
- PTOKEN_GROUPS my_grps = NULL;
- BOOL ret = FALSE;
- char saw_buf[NGROUPS_MAX] = {};
- char *saw = saw_buf, sawpg = FALSE;
+ PTOKEN_GROUPS my_grps;
+ bool saw_buf[NGROUPS_MAX] = {};
+ bool *saw = saw_buf, sawpg = false, ret = false;
if (!GetTokenInformation (token, TokenGroups, NULL, 0, &size) &&
GetLastError () != ERROR_INSUFFICIENT_BUFFER)
debug_printf ("GetTokenInformation(token, TokenGroups): %E");
- else if (!(my_grps = (PTOKEN_GROUPS) malloc (size)))
- debug_printf ("malloc (my_grps) failed.");
+ else if (!(my_grps = (PTOKEN_GROUPS) alloca (size)))
+ debug_printf ("alloca (my_grps) failed.");
else if (!GetTokenInformation (token, TokenGroups, my_grps, size, &size))
debug_printf ("GetTokenInformation(my_token, TokenGroups): %E");
else if (!groups.issetgroups ()) /* setgroups was never called */
- {
- ret = sid_in_token_groups (my_grps, groups.pgsid);
- if (ret == FALSE)
- ret = (groups.pgsid == tok_usersid);
- }
+ ret = sid_in_token_groups (my_grps, groups.pgsid)
+ || groups.pgsid == usersid;
else /* setgroups was called */
{
struct __group32 *gr;
cygsid gsid;
- if (groups.sgsids.count > (int) sizeof (saw_buf) &&
- !(saw = (char *) calloc (groups.sgsids.count, sizeof (char))))
+ if (groups.sgsids.count > (int) (sizeof (saw_buf) / sizeof (*saw_buf))
+ && !(saw = (bool *) calloc (groups.sgsids.count, sizeof (bool))))
goto done;
/* token groups found in /etc/group match the user.gsids ? */
@@ -785,24 +772,21 @@ verify_token (HANDLE token, cygsid &usersid, user_groups &groups, BOOL *pintern)
{
int pos = groups.sgsids.position (gsid);
if (pos >= 0)
- saw[pos] = TRUE;
+ saw[pos] = true;
else if (groups.pgsid == gsid)
- sawpg = TRUE;
- else if (gsid != well_known_world_sid &&
- gsid != usersid)
+ sawpg = true;
+ else if (gsid != well_known_world_sid
+ && gsid != usersid)
goto done;
}
for (int gidx = 0; gidx < groups.sgsids.count; gidx++)
if (!saw[gidx])
goto done;
- if (sawpg ||
- groups.sgsids.contains (groups.pgsid) ||
- groups.pgsid == usersid)
- ret = TRUE;
+ ret = sawpg
+ || groups.sgsids.contains (groups.pgsid)
+ || groups.pgsid == usersid;
}
done:
- if (my_grps)
- free (my_grps);
if (saw != saw_buf)
free (saw);
return ret;
@@ -1414,9 +1398,9 @@ get_file_attribute (int use_ntsec, const char *file,
}
if (uidret)
- *uidret = getuid32 ();
+ *uidret = myself->uid;
if (gidret)
- *gidret = getgid32 ();
+ *gidret = myself->gid;
if (!attribute)
return 0;
@@ -1446,15 +1430,15 @@ get_nt_object_attribute (HANDLE handle, SE_OBJECT_TYPE object_type,
psd = (PSECURITY_DESCRIPTOR) & sd_buf[0];
DWORD len = sizeof (sd_buf);
if (ERROR_SUCCESS != RegGetKeySecurity ((HKEY) handle,
- DACL_SECURITY_INFORMATION |
- GROUP_SECURITY_INFORMATION |
- OWNER_SECURITY_INFORMATION,
- psd, &len))
- {
- __seterrno ();
- debug_printf ("RegGetKeySecurity %E");
- psd = NULL;
- }
+ DACL_SECURITY_INFORMATION |
+ GROUP_SECURITY_INFORMATION |
+ OWNER_SECURITY_INFORMATION,
+ psd, &len))
+ {
+ __seterrno ();
+ debug_printf ("RegGetKeySecurity %E");
+ psd = NULL;
+ }
}
else
{
@@ -1463,7 +1447,7 @@ get_nt_object_attribute (HANDLE handle, SE_OBJECT_TYPE object_type,
GROUP_SECURITY_INFORMATION |
OWNER_SECURITY_INFORMATION,
NULL, NULL, NULL, NULL, &psd))
- {
+ {
__seterrno ();
debug_printf ("GetSecurityInfo %E");
psd = NULL;
diff --git a/winsup/cygwin/speclib b/winsup/cygwin/speclib
index 6f8e0cd..6907409 100755
--- a/winsup/cygwin/speclib
+++ b/winsup/cygwin/speclib
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/sh -x
# speclib - Make a special version of the cygwin import library.
#
# Copyright 2001, 2002 Red Hat, Inc.
@@ -10,14 +10,30 @@
# details.
case "$1" in
- -v) v="-v"; shift
+ -v) shift; v() { :; } ;;
+ *) v() { /bin/false; } ;;
esac
lib=$1; shift
nm=$1; shift
-dlltool=$1; shift
-as=$1; shift
-def=$1; shift
-trap "rm -f /tmp/$$.def" 0 1 2 15
-(echo "LIBRARY cygwin1.dll
-EXPORTS"; $nm --extern-only --defined-only $* | sed -e '/^[ ]*$/d' -e '/:$/d' -e 's/^.* _\(.*\)/\1/' | grep $v -f - -w $def |egrep -vi '^library|exports|^$' | sort) > /tmp/$$.def
-$dlltool --as=$as -d /tmp/$$.def -l "$lib"
+ar=$1; shift
+libdll=$1; shift
+cp /dev/null /tmp/$$.objs
+trap "/bin/rm -rf /tmp/$$.dir /tmp/$$.syms /tmp/$$.objs /tmp/$$.raw" 0 1 2 15
+$nm --extern-only --defined-only $* | sed -e '/^[ ]*$/d' -e '/:$/d' -e 's%^.* _\(.*\)%/ __imp__\1$/p%' | grep -v ' __imp___imp__' > /tmp/$$.syms
+v || $nm -Ap --extern-only --defined-only $libdll | egrep ' I __head| I _.*_iname' | awk -F: '{print $2}' > /tmp/$$.objs
+$nm -Ap --extern-only --defined-only $libdll | sed -n -f /tmp/$$.syms | awk -F: '{print $2}' >> /tmp/$$.objs
+sort -o /tmp/$$.objs -u /tmp/$$.objs
+
+[ -s /tmp/$$.objs ] || { echo "speclib: couldn't find symbols for $lib" 1>&2; exit 1; }
+
+/bin/rm -f /tmp/$$>dir
+mkdir /tmp/$$.dir
+cd /tmp/$$.dir
+if v; then
+ $ar x $libdll
+ /bin/rm -f `cat /tmp/$$.objs`
+else
+ $ar x $libdll `cat /tmp/$$.objs`
+fi
+/bin/rm -f $lib
+$ar crus $lib *.o
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index 229c1f5..752c8ab 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -290,14 +290,14 @@ setsid (void)
{
if (myself->ctty >= 0 && fhandler_console::open_fhs <= 0)
{
- syscall_printf ("open_fhs %d, freeing console",
- fhandler_console::open_fhs);
+ syscall_printf ("freeing console");
FreeConsole ();
}
myself->ctty = -1;
myself->sid = getpid ();
myself->pgid = getpid ();
- syscall_printf ("sid %d, pgid %d, ctty %d", myself->sid, myself->pgid, myself->ctty);
+ syscall_printf ("sid %d, pgid %d, ctty %d, open_fhs %d", myself->sid,
+ myself->pgid, myself->ctty, fhandler_console::open_fhs);
return myself->sid;
}
@@ -2123,7 +2123,6 @@ seteuid32 (__uid32_t uid)
HANDLE ptok, new_token = INVALID_HANDLE_VALUE;
struct passwd * pw_new;
PSID origpsid, psid2 = NO_SID;
- enum impersonation new_state = IMP_BAD;
BOOL token_is_internal;
pw_new = internal_getpwuid (uid);
@@ -2144,48 +2143,47 @@ seteuid32 (__uid32_t uid)
/* Verify if the process token is suitable. */
if (verify_token (ptok, usersid, groups))
- new_state = IMP_NONE;
- /* Verify if a current token is suitable */
- else if (cygheap->user.external_token
+ new_token = ptok;
+ /* Verify if the external token is suitable */
+ else if (cygheap->user.external_token != INVALID_HANDLE_VALUE
&& verify_token (cygheap->user.external_token, usersid, groups))
- {
- new_token = cygheap->user.external_token;
- new_state = IMP_EXTERNAL;
- }
- else if (cygheap->user.internal_token
+ new_token = cygheap->user.external_token;
+ /* Verify if the current token (internal or former external) is suitable */
+ else if (cygheap->user.current_token != INVALID_HANDLE_VALUE
+ && cygheap->user.current_token != cygheap->user.external_token
+ && verify_token (cygheap->user.current_token, usersid, groups,
+ &token_is_internal))
+ new_token = cygheap->user.current_token;
+ /* Verify if the internal token is suitable */
+ else if (cygheap->user.internal_token != INVALID_HANDLE_VALUE
+ && cygheap->user.internal_token != cygheap->user.current_token
&& verify_token (cygheap->user.internal_token, usersid, groups,
&token_is_internal))
- {
- new_token = cygheap->user.internal_token;
- new_state = IMP_INTERNAL;
- }
+ new_token = cygheap->user.internal_token;
- debug_printf ("New token %d, state %d", new_token, new_state);
- /* Return if current token is valid */
- if (cygheap->user.impersonation_state == new_state)
- {
- cygheap->user.reimpersonate ();
- goto success; /* No change */
- }
+ debug_printf ("Found token %d", new_token);
/* Set process def dacl to allow access to impersonated token */
- char dacl_buf[MAX_DACL_LEN (5)];
- if (usersid != (origpsid = cygheap->user.orig_sid ()))
- psid2 = usersid;
- if (sec_acl ((PACL) dacl_buf, FALSE, origpsid, psid2))
+ if (cygheap->user.current_token != new_token)
{
- TOKEN_DEFAULT_DACL tdacl;
- tdacl.DefaultDacl = (PACL) dacl_buf;
- if (!SetTokenInformation (ptok, TokenDefaultDacl,
- &tdacl, sizeof dacl_buf))
- debug_printf ("SetTokenInformation"
- "(TokenDefaultDacl): %E");
+ char dacl_buf[MAX_DACL_LEN (5)];
+ if (usersid != (origpsid = cygheap->user.orig_sid ()))
+ psid2 = usersid;
+ if (sec_acl ((PACL) dacl_buf, FALSE, origpsid, psid2))
+ {
+ TOKEN_DEFAULT_DACL tdacl;
+ tdacl.DefaultDacl = (PACL) dacl_buf;
+ if (!SetTokenInformation (ptok, TokenDefaultDacl,
+ &tdacl, sizeof dacl_buf))
+ debug_printf ("SetTokenInformation"
+ "(TokenDefaultDacl): %E");
+ }
}
- if (new_state == IMP_BAD)
+ /* If no impersonation token is available, try to
+ authenticate using NtCreateToken () or subauthentication. */
+ if (new_token == INVALID_HANDLE_VALUE)
{
- /* If no impersonation token is available, try to
- authenticate using NtCreateToken () or subauthentication. */
new_token = create_token (usersid, groups, pw_new);
if (new_token == INVALID_HANDLE_VALUE)
{
@@ -2195,48 +2193,31 @@ seteuid32 (__uid32_t uid)
if (new_token == INVALID_HANDLE_VALUE)
goto failed;
}
- new_state = IMP_INTERNAL;
- }
-
- /* If using the token, set info and impersonate */
- if (new_state != IMP_NONE)
- {
- /* If the token was explicitly created, all information has
- already been set correctly. */
- if (new_state == IMP_EXTERNAL)
- {
- /* Try setting owner to same value as user. */
- if (!SetTokenInformation (new_token, TokenOwner,
- &usersid, sizeof usersid))
- debug_printf ("SetTokenInformation(user.token, "
- "TokenOwner): %E");
- /* Try setting primary group in token to current group */
- if (!SetTokenInformation (new_token,
- TokenPrimaryGroup,
- &groups.pgsid, sizeof (cygsid)))
- debug_printf ("SetTokenInformation(user.token, "
- "TokenPrimaryGroup): %E");
- }
- /* Try to impersonate. */
- if (!ImpersonateLoggedOnUser (new_token))
- {
- debug_printf ("ImpersonateLoggedOnUser %E");
- __seterrno ();
- goto failed;
- }
/* Keep at most one internal token */
- if (new_state == IMP_INTERNAL)
- {
- if (cygheap->user.internal_token)
- CloseHandle (cygheap->user.internal_token);
- cygheap->user.internal_token = new_token;
- }
+ if (cygheap->user.internal_token != INVALID_HANDLE_VALUE)
+ CloseHandle (cygheap->user.internal_token);
+ cygheap->user.internal_token = new_token;
+ }
+ else if (new_token != ptok)
+ {
+ /* Try setting owner to same value as user. */
+ if (!SetTokenInformation (new_token, TokenOwner,
+ &usersid, sizeof usersid))
+ debug_printf ("SetTokenInformation(user.token, "
+ "TokenOwner): %E");
+ /* Try setting primary group in token to current group */
+ if (!SetTokenInformation (new_token,
+ TokenPrimaryGroup,
+ &groups.pgsid, sizeof (cygsid)))
+ debug_printf ("SetTokenInformation(user.token, "
+ "TokenPrimaryGroup): %E");
}
- cygheap->user.set_sid (usersid);
-success:
CloseHandle (ptok);
- cygheap->user.impersonation_state = new_state;
+ cygheap->user.set_sid (usersid);
+ cygheap->user.current_token = new_token == ptok ? INVALID_HANDLE_VALUE
+ : new_token;
+ cygheap->user.reimpersonate ();
success_9x:
cygheap->user.set_name (pw_new->pw_name);
myself->uid = uid;
@@ -2632,27 +2613,25 @@ logout (char *line)
strncpy (ut_buf.ut_line, line, sizeof ut_buf.ut_line);
setutent ();
ut = getutline (&ut_buf);
+
if (ut)
{
int fd;
- /* We can't use ut further since it's a pointer to the static utmp_data
- area (see below) and would get overwritten in pututline(). So we
- copy it back to the local ut_buf. */
- memcpy (&ut_buf, ut, sizeof ut_buf);
- ut_buf.ut_type = DEAD_PROCESS;
- memset (ut_buf.ut_user, 0, sizeof ut_buf.ut_user);
- time (&ut_buf.ut_time);
+ ut->ut_type = DEAD_PROCESS;
+ memset (ut->ut_user, 0, sizeof ut->ut_user);
+ time (&ut->ut_time);
/* Writing to wtmp must be atomic to prevent mixed up data. */
char mutex_name[MAX_PATH];
HANDLE mutex = CreateMutex (NULL, FALSE,
- shared_name (mutex_name, "wtmp_mutex", 0));
+ shared_name (mutex_name, "wtmp_mutex", 0));
if (mutex)
while (WaitForSingleObject (mutex, INFINITE) == WAIT_ABANDONED)
;
if ((fd = open (_PATH_WTMP, O_WRONLY | O_APPEND | O_BINARY, 0)) >= 0)
{
write (fd, &ut_buf, sizeof ut_buf);
+ debug_printf ("set logout time for %s", line);
close (fd);
}
if (mutex)
@@ -2660,9 +2639,9 @@ logout (char *line)
ReleaseMutex (mutex);
CloseHandle (mutex);
}
- memset (ut_buf.ut_line, 0, sizeof ut_buf.ut_line);
- ut_buf.ut_time = 0;
- pututline (&ut_buf);
+ memset (ut->ut_line, 0, sizeof ut_buf.ut_line);
+ ut->ut_time = 0;
+ pututline (ut);
endutent ();
}
return 1;
@@ -2672,8 +2651,6 @@ static int utmp_fd = -1;
static bool utmp_readonly = false;
static char *utmp_file = (char *) _PATH_UTMP;
-static struct utmp utmp_data;
-
static void
internal_setutent (bool force_readwrite)
{
@@ -2687,11 +2664,11 @@ internal_setutent (bool force_readwrite)
case we try again for reading only unless the process calls
pututline() (==force_readwrite) in which case opening just fails. */
if (utmp_fd < 0 && !force_readwrite)
- {
+ {
utmp_fd = open (utmp_file, O_RDONLY | O_BINARY);
if (utmp_fd >= 0)
utmp_readonly = true;
- }
+ }
}
else
lseek (utmp_fd, 0, SEEK_SET);
@@ -2729,6 +2706,16 @@ utmpname (_CONST char *file)
debug_printf ("New UTMP file: %s", utmp_file);
}
+/* Note: do not make NO_COPY */
+static struct utmp utmp_data_buf[16];
+static unsigned utix = 0;
+#define nutdbuf (sizeof (utmp_data_buf) / sizeof (utmp_data_buf[0]))
+#define utmp_data ({ \
+ if (utix > nutdbuf) \
+ utix = 0; \
+ utmp_data_buf + utix++; \
+})
+
extern "C" struct utmp *
getutent ()
{
@@ -2737,11 +2724,13 @@ getutent ()
{
internal_setutent (false);
if (utmp_fd < 0)
- return NULL;
+ return NULL;
}
- if (read (utmp_fd, &utmp_data, sizeof utmp_data) != sizeof utmp_data)
+
+ utmp *ut = utmp_data;
+ if (read (utmp_fd, ut, sizeof *ut) != sizeof *ut)
return NULL;
- return &utmp_data;
+ return ut;
}
extern "C" struct utmp *
@@ -2754,9 +2743,11 @@ getutid (struct utmp *id)
{
internal_setutent (false);
if (utmp_fd < 0)
- return NULL;
+ return NULL;
}
- while (read (utmp_fd, &utmp_data, sizeof utmp_data) == sizeof utmp_data)
+
+ utmp *ut = utmp_data;
+ while (read (utmp_fd, ut, sizeof *ut) == sizeof *ut)
{
switch (id->ut_type)
{
@@ -2764,15 +2755,15 @@ getutid (struct utmp *id)
case BOOT_TIME:
case OLD_TIME:
case NEW_TIME:
- if (id->ut_type == utmp_data.ut_type)
- return &utmp_data;
+ if (id->ut_type == ut->ut_type)
+ return ut;
break;
case INIT_PROCESS:
case LOGIN_PROCESS:
case USER_PROCESS:
case DEAD_PROCESS:
- if (strncmp (id->ut_id, utmp_data.ut_id, UT_IDLEN) == 0)
- return &utmp_data;
+ if (strncmp (id->ut_id, ut->ut_id, UT_IDLEN) == 0)
+ return ut;
break;
default:
return NULL;
@@ -2791,16 +2782,16 @@ getutline (struct utmp *line)
{
internal_setutent (false);
if (utmp_fd < 0)
- return NULL;
- }
- while (read (utmp_fd, &utmp_data, sizeof utmp_data) == sizeof utmp_data)
- {
- if ((utmp_data.ut_type == LOGIN_PROCESS ||
- utmp_data.ut_type == USER_PROCESS) &&
- !strncmp (utmp_data.ut_line, line->ut_line,
- sizeof utmp_data.ut_line))
- return &utmp_data;
+ return NULL;
}
+
+ utmp *ut = utmp_data;
+ while (read (utmp_fd, ut, sizeof *ut) == sizeof *ut)
+ if ((ut->ut_type == LOGIN_PROCESS ||
+ ut->ut_type == USER_PROCESS) &&
+ !strncmp (ut->ut_line, line->ut_line, sizeof (ut->ut_line)))
+ return ut;
+
return NULL;
}
@@ -2812,7 +2803,14 @@ pututline (struct utmp *ut)
return;
internal_setutent (true);
if (utmp_fd < 0)
- return;
+ {
+ debug_printf ("error: utmp_fd %d", utmp_fd);
+ return;
+ }
+ debug_printf ("ut->ut_type %d, ut->ut_pid %d, ut->ut_line '%s', ut->ut_id '%s'\n",
+ ut->ut_type, ut->ut_pid, ut->ut_line, ut->ut_id);
+ debug_printf ("ut->ut_user '%s', ut->ut_host '%s'\n",
+ ut->ut_user, ut->ut_host);
/* Read/write to utmp must be atomic to prevent overriding data
by concurrent processes. */
char mutex_name[MAX_PATH];
@@ -2838,18 +2836,18 @@ extern "C"
long gethostid(void)
{
unsigned data[13] = {0x92895012,
- 0x10293412,
- 0x29602018,
- 0x81928167,
- 0x34601329,
- 0x75630198,
- 0x89860395,
- 0x62897564,
- 0x00194362,
- 0x20548593,
- 0x96839102,
- 0x12219854,
- 0x00290012};
+ 0x10293412,
+ 0x29602018,
+ 0x81928167,
+ 0x34601329,
+ 0x75630198,
+ 0x89860395,
+ 0x62897564,
+ 0x00194362,
+ 0x20548593,
+ 0x96839102,
+ 0x12219854,
+ 0x00290012};
bool has_cpuid = false;
sigframe thisframe (mainthread);
@@ -2864,12 +2862,12 @@ long gethostid(void)
{
debug_printf ("486 processor");
if (can_set_flag (0x00200000))
- {
- debug_printf ("processor supports CPUID instruction");
- has_cpuid = true;
- }
+ {
+ debug_printf ("processor supports CPUID instruction");
+ has_cpuid = true;
+ }
else
- debug_printf ("processor does not support CPUID instruction");
+ debug_printf ("processor does not support CPUID instruction");
}
if (has_cpuid)
{
@@ -2877,22 +2875,22 @@ long gethostid(void)
cpuid (&maxf, &unused[0], &unused[1], &unused[2], 0);
maxf &= 0xffff;
if (maxf >= 1)
- {
- unsigned features;
- cpuid (&data[0], &unused[0], &unused[1], &features, 1);
- if (features & (1 << 18))
- {
- debug_printf ("processor has psn");
- if (maxf >= 3)
- {
- cpuid (&unused[0], &unused[1], &data[1], &data[2], 3);
- debug_printf ("Processor PSN: %04x-%04x-%04x-%04x-%04x-%04x",
- data[0] >> 16, data[0] & 0xffff, data[2] >> 16, data[2] & 0xffff, data[1] >> 16, data[1] & 0xffff);
- }
- }
- else
- debug_printf ("processor does not have psn");
- }
+ {
+ unsigned features;
+ cpuid (&data[0], &unused[0], &unused[1], &features, 1);
+ if (features & (1 << 18))
+ {
+ debug_printf ("processor has psn");
+ if (maxf >= 3)
+ {
+ cpuid (&unused[0], &unused[1], &data[1], &data[2], 3);
+ debug_printf ("Processor PSN: %04x-%04x-%04x-%04x-%04x-%04x",
+ data[0] >> 16, data[0] & 0xffff, data[2] >> 16, data[2] & 0xffff, data[1] >> 16, data[1] & 0xffff);
+ }
+ }
+ else
+ debug_printf ("processor does not have psn");
+ }
}
UUID Uuid;
@@ -2906,8 +2904,8 @@ long gethostid(void)
// Unfortunately Windows will sometimes pick a virtual Ethernet card
// e.g. VMWare Virtual Ethernet Adaptor
debug_printf ("MAC address of first Ethernet card: %02x:%02x:%02x:%02x:%02x:%02x",
- Uuid.Data4[2], Uuid.Data4[3], Uuid.Data4[4],
- Uuid.Data4[5], Uuid.Data4[6], Uuid.Data4[7]);
+ Uuid.Data4[2], Uuid.Data4[3], Uuid.Data4[4],
+ Uuid.Data4[5], Uuid.Data4[6], Uuid.Data4[7]);
}
else
{
@@ -2923,16 +2921,16 @@ long gethostid(void)
GetDiskFreeSpace ("C:\\", NULL, NULL, NULL, (DWORD *)&data[11]);
debug_printf ("hostid entropy: %08x %08x %08x %08x "
- "%08x %08x %08x %08x "
- "%08x %08x %08x %08x "
- "%08x",
- data[0], data[1],
- data[2], data[3],
- data[4], data[5],
- data[6], data[7],
- data[8], data[9],
- data[10], data[11],
- data[12]);
+ "%08x %08x %08x %08x "
+ "%08x %08x %08x %08x "
+ "%08x",
+ data[0], data[1],
+ data[2], data[3],
+ data[4], data[5],
+ data[6], data[7],
+ data[8], data[9],
+ data[10], data[11],
+ data[12]);
long hostid = 0x40291372;
// a random hashing algorithm
diff --git a/winsup/cygwin/sysconf.cc b/winsup/cygwin/sysconf.cc
index ac5b350..4c253a1 100644
--- a/winsup/cygwin/sysconf.cc
+++ b/winsup/cygwin/sysconf.cc
@@ -33,14 +33,14 @@ sysconf (int in)
/* FIXME: what's the right value? _POSIX_ARG_MAX is only 4K */
return 1048576;
case _SC_OPEN_MAX:
- return getdtablesize ();
- case _SC_PAGESIZE:
{
long max = getdtablesize ();
if (max < OPEN_MAX)
max = OPEN_MAX;
return max;
}
+ case _SC_PAGESIZE:
+ return getpagesize ();
case _SC_CLK_TCK:
return CLOCKS_PER_SEC;
case _SC_JOB_CONTROL:
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index b42bb14..516cb8d 100644
--- a/winsup/cygwin/thread.cc
+++ b/winsup/cygwin/thread.cc
@@ -288,7 +288,7 @@ List<pthread> pthread::threads;
/* member methods */
pthread::pthread ():verifyable_object (PTHREAD_MAGIC), win32_obj_id (0),
- running (false), suspended (false),
+ running (false), suspended (false),
cancelstate (0), canceltype (0), cancel_event (0),
joiner (NULL), next (NULL), cleanup_stack (NULL)
{
@@ -856,8 +856,8 @@ pthread_cond::pthread_cond (pthread_condattr *attr) :
if (attr)
if (attr->shared != PTHREAD_PROCESS_PRIVATE)
{
- magic = 0;
- return;
+ magic = 0;
+ return;
}
verifyable_mutex_obj = &mtx_in;
@@ -907,7 +907,7 @@ pthread_cond::unblock (const bool all)
{
unsigned long releaseable;
- /*
+ /*
* Block outgoing threads (and avoid simultanous unblocks)
*/
mtx_out.lock ();
@@ -918,19 +918,19 @@ pthread_cond::unblock (const bool all)
unsigned long released;
if (!pending)
- {
- /*
- * Block incoming threads until all waiting threads are released.
- */
- mtx_in.lock ();
-
- /*
- * Calculate releaseable again because threads can enter until
- * the semaphore has been taken, but they can not leave, therefore pending
- * is unchanged and releaseable can only get higher
- */
- releaseable = waiting - pending;
- }
+ {
+ /*
+ * Block incoming threads until all waiting threads are released.
+ */
+ mtx_in.lock ();
+
+ /*
+ * Calculate releaseable again because threads can enter until
+ * the semaphore has been taken, but they can not leave, therefore pending
+ * is unchanged and releaseable can only get higher
+ */
+ releaseable = waiting - pending;
+ }
released = all ? releaseable : 1;
pending += released;
@@ -971,20 +971,20 @@ pthread_cond::wait (pthread_mutex_t mutex, DWORD dwMilliseconds)
rv = pthread::cancelable_wait (sem_wait, dwMilliseconds, false);
mtx_out.lock ();
-
+
if (rv != WAIT_OBJECT_0)
{
/*
* It might happen that a signal is sent while the thread got canceled
* or timed out. Try to take one.
* If the thread gets one than a signal|broadcast is in progress.
- */
+ */
if (WaitForSingleObject (sem_wait, 0) == WAIT_OBJECT_0)
- /*
- * thread got cancelled ot timed out while a signalling is in progress.
- * Set wait result back to signaled
- */
- rv = WAIT_OBJECT_0;
+ /*
+ * thread got cancelled ot timed out while a signalling is in progress.
+ * Set wait result back to signaled
+ */
+ rv = WAIT_OBJECT_0;
}
InterlockedDecrement ((long *)&waiting);
@@ -997,7 +997,7 @@ pthread_cond::wait (pthread_mutex_t mutex, DWORD dwMilliseconds)
mtx_in.unlock ();
mtx_out.unlock ();
-
+
mutex->lock ();
--mutex->condwaits;
@@ -1068,8 +1068,8 @@ pthread_rwlock::pthread_rwlock (pthread_rwlockattr *attr) :
if (attr)
if (attr->shared != PTHREAD_PROCESS_PRIVATE)
{
- magic = 0;
- return;
+ magic = 0;
+ return;
}
if (!pthread_mutex::is_good_object (&verifyable_mutex_obj))
@@ -1129,7 +1129,7 @@ pthread_rwlock::rdlock ()
}
while (writer || waiting_writers)
- {
+ {
pthread_cleanup_push (pthread_rwlock::rdlock_cleanup, this);
++waiting_readers;
@@ -1162,14 +1162,14 @@ pthread_rwlock::tryrdlock ()
{
struct RWLOCK_READER *reader = new struct RWLOCK_READER;
if (reader)
- {
- reader->thread = self;
- add_reader (reader);
- }
+ {
+ reader->thread = self;
+ add_reader (reader);
+ }
else
- result = EAGAIN;
+ result = EAGAIN;
}
-
+
mtx.unlock ();
return result;
@@ -1190,7 +1190,7 @@ pthread_rwlock::wrlock ()
}
while (writer || readers)
- {
+ {
pthread_cleanup_push (pthread_rwlock::wrlock_cleanup, this);
++waiting_writers;
@@ -1220,7 +1220,7 @@ pthread_rwlock::trywrlock ()
result = EBUSY;
else
writer = self;
-
+
mtx.unlock ();
return result;
@@ -1237,10 +1237,10 @@ pthread_rwlock::unlock ()
if (writer)
{
if (writer != self)
- {
- result = EPERM;
- goto DONE;
- }
+ {
+ result = EPERM;
+ goto DONE;
+ }
writer = NULL;
}
@@ -1249,10 +1249,10 @@ pthread_rwlock::unlock ()
struct RWLOCK_READER *reader = lookup_reader (self);
if (!reader)
- {
- result = EPERM;
- goto DONE;
- }
+ {
+ result = EPERM;
+ goto DONE;
+ }
remove_reader (reader);
delete reader;
@@ -1336,13 +1336,13 @@ pthread_rwlock::_fixup_after_fork ()
while (*temp)
{
if ((*temp)->thread == self)
- temp = &((*temp)->next);
+ temp = &((*temp)->next);
else
- {
- struct RWLOCK_READER *cur = *temp;
- *temp = (*temp)->next;
- delete cur;
- }
+ {
+ struct RWLOCK_READER *cur = *temp;
+ *temp = (*temp)->next;
+ delete cur;
+ }
}
}
diff --git a/winsup/cygwin/times.cc b/winsup/cygwin/times.cc
index 44a0883..86e9f63 100644
--- a/winsup/cygwin/times.cc
+++ b/winsup/cygwin/times.cc
@@ -1,6 +1,6 @@
/* times.cc
- 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.
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
index 8c16ac6..1c2a149 100644
--- a/winsup/cygwin/uinfo.cc
+++ b/winsup/cygwin/uinfo.cc
@@ -122,7 +122,9 @@ uinfo_init ()
cygheap->user.orig_uid = cygheap->user.real_uid = myself->uid;
cygheap->user.orig_gid = cygheap->user.real_gid = myself->gid;
- cygheap->user.impersonation_state = IMP_NONE;
+ cygheap->user.external_token = INVALID_HANDLE_VALUE;
+ cygheap->user.internal_token = INVALID_HANDLE_VALUE;
+ cygheap->user.current_token = INVALID_HANDLE_VALUE;
cygheap->user.set_orig_sid (); /* Update the original sid */
}
diff --git a/winsup/cygwin/wincap.cc b/winsup/cygwin/wincap.cc
index 37ec6ef..dbc3913 100644
--- a/winsup/cygwin/wincap.cc
+++ b/winsup/cygwin/wincap.cc
@@ -540,7 +540,7 @@ wincapc::init ()
case 0:
caps = &wincap_2000;
break;
-
+
case 1:
caps = &wincap_xp;
break;