From 18120a9be3de3adb5263ee501716cefa799b202b Mon Sep 17 00:00:00 2001 From: scottc Date: Tue, 27 Aug 2002 12:28:36 +0000 Subject: Merged changes from HEAD --- winsup/cygwin/ChangeLog | 43 ++++++++++++++++++++++++++++++++++++++++ winsup/cygwin/child_info.h | 11 +++++----- winsup/cygwin/cygheap.cc | 1 - winsup/cygwin/cygheap.h | 1 + winsup/cygwin/cygmagic | 10 ++++------ winsup/cygwin/dcrt0.cc | 17 +++++++++++----- winsup/cygwin/fhandler_socket.cc | 22 +------------------- winsup/cygwin/ioctl.cc | 3 +++ winsup/cygwin/net.cc | 24 ++++++++++++++++++---- winsup/cygwin/shared_info.h | 4 ++-- 10 files changed, 92 insertions(+), 44 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 0384c00aae2..35fe3510664 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,46 @@ +2002-08-26 Conrad Scott + + * fhandler_socket.cc (fhandler_socket::check_peer_secret_event): + Fix strace message. + (fhandler_socket::connect): Remove sigframe. + (fhandler_socket::accept): Ditto. + (fhandler_socket::getsockname): Ditto. + (fhandler_socket::getpeername): Ditto. + (fhandler_socket::recvfrom): Ditto. + (fhandler_socket::recvmsg): Ditto. + (fhandler_socket::sendto): Ditto. + (fhandler_socket::sendmsg): Ditto. + (fhandler_socket::close): Ditto. + (fhandler_socket::ioctl): Ditto. + * ioctl.cc (ioctl): Add sigframe. + *net.cc (cygwin_sendto): Ditto. + (cygwin_recvfrom): Ditto. + (cygwin_recvfrom): Ditto. + (cygwin_connect): Ditto. + (cygwin_shutdown): Ditto. + (cygwin_getpeername): Ditto. + (cygwin_accept): Ditto. Improve strace message. + (cygwin_getsockname): Ditto. Ditto. + (cygwin_recvmsg): Ditto. Ditto. + (cygwin_sendmsg): Fix strace message. + +2002-08-27 Christopher Faylor + + * child_info.h: Add _PROC_WHOOPS enum value. + (CURR_CHILD_INFO_MAGIC): Update. + (child_info::magic): Make 'long'. + * cygheap.h: Export _cygheap_start. + * cygheap.cc: Don't declare _cygheap_start. + * cygmagic: Use cksum to produce checksums. Append 'U' to end of + checksum. + * dcrt0.cc (initial_env): Calculate sleep ms before reusing buffer. + (_dll_crt0): Detect cygheap mismatch as indicative of different cygwin + version. Set child_proc_info to NULL when _PROC_WHOOPS. + (multiple_cygwin_problem): If child_info specific problem, then set + child_proc_info type to _PROC_WHOOPS. + * shared_info.h (CURR_MOUNT_MAGIC): Update. + (CURR_SHARED_MAGIC): Ditto. + 2002-08-25 Conrad Scott * fhandler.h (fhandler_socket::recvfrom): Fix prototype. diff --git a/winsup/cygwin/child_info.h b/winsup/cygwin/child_info.h index 4b68e428119..1aca7247b70 100644 --- a/winsup/cygwin/child_info.h +++ b/winsup/cygwin/child_info.h @@ -1,6 +1,6 @@ -/* childinfo.h: shared child info for cygwin +/* child_info.h: shared child info for cygwin - Copyright 2000, 2002 Red Hat, Inc. + Copyright 2000, 2001, 2002 Red Hat, Inc. This file is part of Cygwin. @@ -14,7 +14,8 @@ enum { _PROC_EXEC, _PROC_SPAWN, - _PROC_FORK + _PROC_FORK, + _PROC_WHOOPS }; #define OPROC_MAGIC_MASK 0xff00ff00 @@ -28,7 +29,7 @@ enum #define EXEC_MAGIC_SIZE sizeof(child_info) -#define CURR_CHILD_INFO_MAGIC 0x8b3c +#define CURR_CHILD_INFO_MAGIC 0xb3836013U /* NOTE: Do not make gratuitous changes to the names or organization of the below class. The layout is checksummed to determine compatibility between @@ -39,7 +40,7 @@ public: DWORD zero[4]; // must be zeroed DWORD cb; // size of this record DWORD intro; // improbable string - unsigned short magic; // magic number unique to child_info + unsigned long magic; // magic number unique to child_info unsigned short type; // type of record, exec, spawn, fork int cygpid; // cygwin pid of child process HANDLE subproc_ready; // used for synchronization with parent diff --git a/winsup/cygwin/cygheap.cc b/winsup/cygwin/cygheap.cc index 7ea7a39c39e..937c3392cb8 100644 --- a/winsup/cygwin/cygheap.cc +++ b/winsup/cygwin/cygheap.cc @@ -45,7 +45,6 @@ struct cygheap_entry extern "C" { static void __stdcall _cfree (void *ptr) __attribute__((regparm(1))); -extern void *_cygheap_start; } inline static void diff --git a/winsup/cygwin/cygheap.h b/winsup/cygwin/cygheap.h index 7cd5becbc37..6f81eaa4128 100644 --- a/winsup/cygwin/cygheap.h +++ b/winsup/cygwin/cygheap.h @@ -324,4 +324,5 @@ char *__stdcall cstrdup (const char *) __attribute__ ((regparm(1))); char *__stdcall cstrdup1 (const char *) __attribute__ ((regparm(1))); void __stdcall cfree_and_set (char *&, char * = NULL) __attribute__ ((regparm(2))); void __stdcall cygheap_init (); +extern DWORD _cygheap_start; } diff --git a/winsup/cygwin/cygmagic b/winsup/cygwin/cygmagic index 387593878f4..a8ccc8c76f6 100755 --- a/winsup/cygwin/cygmagic +++ b/winsup/cygwin/cygmagic @@ -17,16 +17,14 @@ cat < $file_magic /* autogenerated - do not edit */ #include "$file" EOF -if sum -r /dev/null >/dev/null 2>&1; then - sumit(){ sum -r $*; } -else - sumit(){ sum $*; } -fi +sumit() { + cksum $* +} while [ -n "$1" ]; do define=$1; shift struct=$1; shift - sum=`$gcc -E $file | sed -n "/^$struct/,/^};/p" | sed -e 's/[ ]//g' -e '/^$/d' | sumit | awk '{printf "0x%x", $1}'` + sum=`$gcc -E $file | sed -n "/^$struct/,/^};/p" | sed -e 's/[ ]//g' -e '/^$/d' | sumit | awk '{printf "0x%xU", $1}'` echo "#define $define $sum" curr=`sed -n "s/^#[ ]*define CURR_$define[ ][ ]*\([^ ][^ ]*\)/\1/p" $file` [ "$curr" != "$sum" ] && echo "*** WARNING WARNING WARNING WARNING WARNING *** diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 8367bf3d941..cfc95833009 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -792,10 +792,11 @@ initial_env () #ifdef DEBUGGING if (GetEnvironmentVariable ("CYGWIN_SLEEP", buf, sizeof (buf) - 1)) { + DWORD ms = atoi (buf); buf[0] = '\0'; len = GetModuleFileName (NULL, buf, MAX_PATH); - console_printf ("Sleeping %d, pid %u %s\n", atoi (buf), GetCurrentProcessId (), buf); - Sleep (atoi (buf)); + console_printf ("Sleeping %d, pid %u %s\n", ms, GetCurrentProcessId (), buf); + Sleep (ms); } if (GetEnvironmentVariable ("CYGWIN_DEBUG", buf, sizeof (buf) - 1)) { @@ -868,7 +869,11 @@ _dll_crt0 () multiple_cygwin_problem ("proc", child_proc_info->intro, 0); else if (child_proc_info->intro == PROC_MAGIC_GENERIC && child_proc_info->magic != CHILD_INFO_MAGIC) - multiple_cygwin_problem ("proc", child_proc_info->magic, CHILD_INFO_MAGIC); + multiple_cygwin_problem ("proc", child_proc_info->magic, + CHILD_INFO_MAGIC); + else if (child_proc_info->cygheap != (void *) &_cygheap_start) + multiple_cygwin_problem ("cygheap", (DWORD) child_proc_info->cygheap, + (DWORD) &_cygheap_start); unsigned should_be_cb = 0; switch (child_proc_info->type) { @@ -892,6 +897,8 @@ _dll_crt0 () } default: system_printf ("unknown exec type %d", child_proc_info->type); + /* intentionally fall through */ + case _PROC_WHOOPS: child_proc_info = NULL; break; } @@ -1067,9 +1074,9 @@ __api_fatal (const char *fmt, ...) void multiple_cygwin_problem (const char *what, unsigned magic_version, unsigned version) { - if (_cygwin_testing && strstr (what, "proc")) + if (_cygwin_testing && (strstr (what, "proc") || strstr (what, "cygheap"))) { - fork_info = NULL; + child_proc_info->type = _PROC_WHOOPS; return; } diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index ded5935a1a1..2057a9eec12 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -203,7 +203,7 @@ fhandler_socket::check_peer_secret_event (struct sockaddr_in* peer, int* secret) ev = CreateEvent (&sec_all_nih, FALSE, FALSE, buf); if (!ev && GetLastError () == ERROR_ALREADY_EXISTS) { - debug_printf ("%s event already exist"); + debug_printf ("event \"%s\" already exists", buf); ev = OpenEvent (EVENT_ALL_ACCESS, FALSE, buf); } @@ -406,8 +406,6 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen) sockaddr_in sin; int secret [4]; - sigframe thisframe (mainthread); - if (!get_inet_addr (name, namelen, &sin, &namelen, secret)) return -1; @@ -486,8 +484,6 @@ fhandler_socket::accept (struct sockaddr *peer, int *len) BOOL secret_check_failed = FALSE; BOOL in_progress = FALSE; - sigframe thisframe (mainthread); - /* Allows NULL peer and len parameters. */ struct sockaddr_in peer_dummy; int len_dummy; @@ -624,8 +620,6 @@ fhandler_socket::getsockname (struct sockaddr *name, int *namelen) { int res = -1; - sigframe thisframe (mainthread); - if (get_addr_family () == AF_LOCAL) { struct sockaddr_un *sun = (struct sockaddr_un *) name; @@ -659,8 +653,6 @@ fhandler_socket::getsockname (struct sockaddr *name, int *namelen) int fhandler_socket::getpeername (struct sockaddr *name, int *namelen) { - sigframe thisframe (mainthread); - int res = ::getpeername (get_socket (), name, namelen); if (res) set_winsock_errno (); @@ -682,8 +674,6 @@ fhandler_socket::recvfrom (void *ptr, size_t len, int flags, wsock_event wsock_evt; LPWSAOVERLAPPED ovr; - sigframe thisframe (mainthread); - if (is_nonblocking () || !(ovr = wsock_evt.prepare ())) { debug_printf ("Fallback to winsock 1 recvfrom call"); @@ -723,8 +713,6 @@ fhandler_socket::recvmsg (struct msghdr *msg, int flags) char *buf, *p; struct iovec *iov = msg->msg_iov; - sigframe thisframe (mainthread); - if (get_addr_family () == AF_LOCAL) { /* On AF_LOCAL sockets the (fixed-size) name of the shared memory @@ -771,8 +759,6 @@ fhandler_socket::sendto (const void *ptr, size_t len, int flags, LPWSAOVERLAPPED ovr; sockaddr_in sin; - sigframe thisframe (mainthread); - if (to && !get_inet_addr (to, tolen, &sin, &tolen)) return -1; @@ -844,8 +830,6 @@ fhandler_socket::sendmsg (const struct msghdr *msg, int flags) int fhandler_socket::shutdown (int how) { - sigframe thisframe (mainthread); - int res = ::shutdown (get_socket (), how); if (res) @@ -872,8 +856,6 @@ fhandler_socket::close () { int res = 0; - sigframe thisframe (mainthread); - /* HACK to allow a graceful shutdown even if shutdown() hasn't been called by the application. Note that this isn't the ultimate solution but it helps in many cases. */ @@ -916,8 +898,6 @@ fhandler_socket::ioctl (unsigned int cmd, void *p) struct ifconf ifc, *ifcp; struct ifreq *ifr, *ifrp; - sigframe thisframe (mainthread); - switch (cmd) { case SIOCGIFCONF: diff --git a/winsup/cygwin/ioctl.cc b/winsup/cygwin/ioctl.cc index 2f96e850883..6b12a2ec371 100644 --- a/winsup/cygwin/ioctl.cc +++ b/winsup/cygwin/ioctl.cc @@ -20,11 +20,14 @@ details. */ #include "path.h" #include "dtable.h" #include "cygheap.h" +#include "sigproc.h" #include extern "C" int ioctl (int fd, int cmd, ...) { + sigframe thisframe (mainthread); + cygheap_fdget cfd (fd); if (cfd < 0) return -1; diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc index 888c34eccd8..aa52a3cd5f6 100644 --- a/winsup/cygwin/net.cc +++ b/winsup/cygwin/net.cc @@ -568,6 +568,8 @@ cygwin_sendto (int fd, const void *buf, int len, int flags, const struct sockaddr *to, int tolen) { int res; + sigframe thisframe (mainthread); + fhandler_socket *fh = get (fd); if ((len && __check_invalid_read_ptr_errno (buf, (unsigned) len)) @@ -589,6 +591,8 @@ cygwin_recvfrom (int fd, void *buf, int len, int flags, struct sockaddr *from, int *fromlen) { int res; + sigframe thisframe (mainthread); + fhandler_socket *fh = get (fd); if ((len && __check_null_invalid_struct_errno (buf, (unsigned) len)) @@ -742,6 +746,8 @@ extern "C" int cygwin_connect (int fd, const struct sockaddr *name, int namelen) { int res; + sigframe thisframe (mainthread); + fhandler_socket *fh = get (fd); if (__check_invalid_read_ptr_errno (name, namelen) || !fh) @@ -1002,6 +1008,8 @@ extern "C" int cygwin_accept (int fd, struct sockaddr *peer, int *len) { int res; + sigframe thisframe (mainthread); + fhandler_socket *fh = get (fd); if ((peer && (check_null_invalid_struct_errno (len) @@ -1011,7 +1019,7 @@ cygwin_accept (int fd, struct sockaddr *peer, int *len) else res = fh->accept (peer, len); - syscall_printf ("%d = accept (%d, %p, %d)", res, fd, peer, len); + syscall_printf ("%d = accept (%d, %p, %p)", res, fd, peer, len); return res; } @@ -1036,6 +1044,8 @@ extern "C" int cygwin_getsockname (int fd, struct sockaddr *addr, int *namelen) { int res; + sigframe thisframe (mainthread); + fhandler_socket *fh = get (fd); if (check_null_invalid_struct_errno (namelen) @@ -1045,7 +1055,7 @@ cygwin_getsockname (int fd, struct sockaddr *addr, int *namelen) else res = fh->getsockname (addr, namelen); - syscall_printf ("%d = getsockname (%d, %p, %d)", res, fd, addr, namelen); + syscall_printf ("%d = getsockname (%d, %p, %p)", res, fd, addr, namelen); return res; } @@ -1070,6 +1080,8 @@ extern "C" int cygwin_shutdown (int fd, int how) { int res; + sigframe thisframe (mainthread); + fhandler_socket *fh = get (fd); if (!fh) @@ -1133,6 +1145,8 @@ extern "C" int cygwin_getpeername (int fd, struct sockaddr *name, int *len) { int res; + sigframe thisframe (mainthread); + fhandler_socket *fh = get (fd); if (check_null_invalid_struct_errno (len) @@ -2087,6 +2101,8 @@ extern "C" int cygwin_recvmsg (int fd, struct msghdr *msg, int flags) { int res; + sigframe thisframe (mainthread); + fhandler_socket *fh = get (fd); if (check_null_invalid_struct_errno (msg) @@ -2098,7 +2114,7 @@ cygwin_recvmsg (int fd, struct msghdr *msg, int flags) else res = fh->recvmsg (msg, flags); - syscall_printf ("%d = recvmsg (%d, %p, %d)", res, fd, msg, flags); + syscall_printf ("%d = recvmsg (%d, %p, %x)", res, fd, msg, flags); return res; } @@ -2118,6 +2134,6 @@ cygwin_sendmsg (int fd, const struct msghdr *msg, int flags) else res = fh->sendmsg (msg, flags); - syscall_printf ("%d = recvmsg (%d, %p, %d)", res, fd, msg, flags); + syscall_printf ("%d = sendmsg (%d, %p, %x)", res, fd, msg, flags); return res; } diff --git a/winsup/cygwin/shared_info.h b/winsup/cygwin/shared_info.h index 02a12fff560..945bc17a679 100644 --- a/winsup/cygwin/shared_info.h +++ b/winsup/cygwin/shared_info.h @@ -41,7 +41,7 @@ class mount_item #define MOUNT_VERSION 27 // increment when mount table changes and #define MOUNT_VERSION_MAGIC CYGWIN_VERSION_MAGIC (MOUNT_MAGIC, MOUNT_VERSION) -#define CURR_MOUNT_MAGIC 0xf4e5 +#define CURR_MOUNT_MAGIC 0x4fe431cdU #define MOUNT_INFO_CB 16488 class reg_key; @@ -138,7 +138,7 @@ public: #define SHARED_INFO_CB 47112 -#define CURR_SHARED_MAGIC 0x88e +#define CURR_SHARED_MAGIC 0x29eb8ccdU /* NOTE: Do not make gratuitous changes to the names or organization of the below class. The layout is checksummed to determine compatibility between -- cgit v1.2.1