* mmap.cc: Clean up *ResourceLock calls throughout.

* thread.cc (pthread_cond::TimedWait): Check for WAIT_TIMEOUT as well as
WAIT_ABANDONED.
(__pthread_cond_timedwait): Calculate a relative wait from the abstime
parameter.
This commit is contained in:
Christopher Faylor 2001-06-26 14:47:48 +00:00
parent d006404dae
commit 462f4effb1
15 changed files with 473 additions and 449 deletions

View File

@ -1,3 +1,14 @@
Tue Jun 26 10:47:24 2001 Christopher Faylor <cgf@cygnus.com>
* mmap.cc: Clean up *ResourceLock calls throughout.
Tue Jun 26 22:10:00 2001 Robert Collins rbtcollins@hotmail.com
* thread.cc (pthread_cond::TimedWait): Check for WAIT_TIMEOUT as well
as WAIT_ABANDONED.
(__pthread_cond_timedwait): Calculate a relative wait from the abstime
parameter.
Sun Jun 24 17:38:19 2001 Christopher Faylor <cgf@cygnus.com> Sun Jun 24 17:38:19 2001 Christopher Faylor <cgf@cygnus.com>
* exceptions.cc (interrupt_setup): Move actions from setup_handler to * exceptions.cc (interrupt_setup): Move actions from setup_handler to

View File

@ -68,7 +68,6 @@ public:
return 1; return 1;
return strncasematch (m->native_path, path, m->native_pathlen) return strncasematch (m->native_path, path, m->native_pathlen)
&& (path[m->native_pathlen] == '\\' || !path[m->native_pathlen]); && (path[m->native_pathlen] == '\\' || !path[m->native_pathlen]);
} }
const char *unchroot (const char *path) const char *unchroot (const char *path)
{ {

View File

@ -28,6 +28,13 @@
* malloc_usable_size(P) is equivalent to realloc(P, malloc_usable_size(P)) * malloc_usable_size(P) is equivalent to realloc(P, malloc_usable_size(P))
* *
* $Log$ * $Log$
* Revision 1.3 2001/06/26 14:47:48 cgf
* * mmap.cc: Clean up *ResourceLock calls throughout.
* * thread.cc (pthread_cond::TimedWait): Check for WAIT_TIMEOUT as well as
* WAIT_ABANDONED.
* (__pthread_cond_timedwait): Calculate a relative wait from the abstime
* parameter.
*
* Revision 1.2 2001/06/24 22:26:49 cgf * Revision 1.2 2001/06/24 22:26:49 cgf
* forced commit * forced commit
* *
@ -3662,9 +3669,9 @@ static void malloc_update_mallinfo(void)
check_free_chunk(p); check_free_chunk(p);
check_freefill(p, chunksize(p), chunksize(p)); check_freefill(p, chunksize(p), chunksize(p));
for (q = next_chunk(p); for (q = next_chunk(p);
q < top && inuse(q) && chunksize(q) >= MINSIZE; q < top && inuse(q) && chunksize(q) >= MINSIZE;
q = next_chunk(q)) q = next_chunk(q))
check_inuse_chunk(q); check_inuse_chunk(q);
#endif #endif
avail += chunksize(p); avail += chunksize(p);
navail++; navail++;
@ -3701,14 +3708,14 @@ void malloc_stats(void)
{ {
malloc_update_mallinfo(); malloc_update_mallinfo();
fprintf(stderr, "max system bytes = %10u\n", fprintf(stderr, "max system bytes = %10u\n",
(unsigned int)(max_total_mem)); (unsigned int)(max_total_mem));
fprintf(stderr, "system bytes = %10u\n", fprintf(stderr, "system bytes = %10u\n",
(unsigned int)(sbrked_mem + mmapped_mem)); (unsigned int)(sbrked_mem + mmapped_mem));
fprintf(stderr, "in use bytes = %10u\n", fprintf(stderr, "in use bytes = %10u\n",
(unsigned int)(current_mallinfo.uordblks + mmapped_mem)); (unsigned int)(current_mallinfo.uordblks + mmapped_mem));
#if HAVE_MMAP #if HAVE_MMAP
fprintf(stderr, "max mmap regions = %10u\n", fprintf(stderr, "max mmap regions = %10u\n",
(unsigned int)max_n_mmaps); (unsigned int)max_n_mmaps);
#endif #endif
} }
@ -3779,13 +3786,13 @@ History:
* Added anonymously donated WIN32 sbrk emulation * Added anonymously donated WIN32 sbrk emulation
* Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen
* malloc_extend_top: fix mask error that caused wastage after * malloc_extend_top: fix mask error that caused wastage after
foreign sbrks foreign sbrks
* Add linux mremap support code from HJ Liu * Add linux mremap support code from HJ Liu
V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee)
* Integrated most documentation with the code. * Integrated most documentation with the code.
* Add support for mmap, with help from * Add support for mmap, with help from
Wolfram Gloger (Gloger@lrz.uni-muenchen.de). Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
* Use last_remainder in more cases. * Use last_remainder in more cases.
* Pack bins using idea from colin@nyx10.cs.du.edu * Pack bins using idea from colin@nyx10.cs.du.edu
* Use ordered bins instead of best-fit threshhold * Use ordered bins instead of best-fit threshhold
@ -3793,34 +3800,34 @@ History:
* Support another case of realloc via move into top * Support another case of realloc via move into top
* Fix error occuring when initial sbrk_base not word-aligned. * Fix error occuring when initial sbrk_base not word-aligned.
* Rely on page size for units instead of SBRK_UNIT to * Rely on page size for units instead of SBRK_UNIT to
avoid surprises about sbrk alignment conventions. avoid surprises about sbrk alignment conventions.
* Add mallinfo, mallopt. Thanks to Raymond Nijssen * Add mallinfo, mallopt. Thanks to Raymond Nijssen
(raymond@es.ele.tue.nl) for the suggestion. (raymond@es.ele.tue.nl) for the suggestion.
* Add `pad' argument to malloc_trim and top_pad mallopt parameter. * Add `pad' argument to malloc_trim and top_pad mallopt parameter.
* More precautions for cases where other routines call sbrk, * More precautions for cases where other routines call sbrk,
courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
* Added macros etc., allowing use in linux libc from * Added macros etc., allowing use in linux libc from
H.J. Lu (hjl@gnu.ai.mit.edu) H.J. Lu (hjl@gnu.ai.mit.edu)
* Inverted this history list * Inverted this history list
V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee)
* Re-tuned and fixed to behave more nicely with V2.6.0 changes. * Re-tuned and fixed to behave more nicely with V2.6.0 changes.
* Removed all preallocation code since under current scheme * Removed all preallocation code since under current scheme
the work required to undo bad preallocations exceeds the work required to undo bad preallocations exceeds
the work saved in good cases for most test programs. the work saved in good cases for most test programs.
* No longer use return list or unconsolidated bins since * No longer use return list or unconsolidated bins since
no scheme using them consistently outperforms those that don't no scheme using them consistently outperforms those that don't
given above changes. given above changes.
* Use best fit for very large chunks to prevent some worst-cases. * Use best fit for very large chunks to prevent some worst-cases.
* Added some support for debugging * Added some support for debugging
V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee)
* Removed footers when chunks are in use. Thanks to * Removed footers when chunks are in use. Thanks to
Paul Wilson (wilson@cs.texas.edu) for the suggestion. Paul Wilson (wilson@cs.texas.edu) for the suggestion.
V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee)
* Added malloc_trim, with help from Wolfram Gloger * Added malloc_trim, with help from Wolfram Gloger
(wmglo@Dent.MED.Uni-Muenchen.DE). (wmglo@Dent.MED.Uni-Muenchen.DE).
V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g)
@ -3836,11 +3843,11 @@ History:
V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g)
* faster bin computation & slightly different binning * faster bin computation & slightly different binning
* merged all consolidations to one part of malloc proper * merged all consolidations to one part of malloc proper
(eliminating old malloc_find_space & malloc_clean_bin) (eliminating old malloc_find_space & malloc_clean_bin)
* Scan 2 returns chunks (not just 1) * Scan 2 returns chunks (not just 1)
* Propagate failure in realloc if malloc returns 0 * Propagate failure in realloc if malloc returns 0
* Add stuff to allow compilation on non-ANSI compilers * Add stuff to allow compilation on non-ANSI compilers
from kpv@research.att.com from kpv@research.att.com
V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu)
* removed potential for odd address access in prev_chunk * removed potential for odd address access in prev_chunk
@ -3848,11 +3855,11 @@ History:
* misc cosmetics and a bit more internal documentation * misc cosmetics and a bit more internal documentation
* anticosmetics: mangled names in macros to evade debugger strangeness * anticosmetics: mangled names in macros to evade debugger strangeness
* tested on sparc, hp-700, dec-mips, rs6000 * tested on sparc, hp-700, dec-mips, rs6000
with gcc & native cc (hp, dec only) allowing with gcc & native cc (hp, dec only) allowing
Detlefs & Zorn comparison study (in SIGPLAN Notices.) Detlefs & Zorn comparison study (in SIGPLAN Notices.)
Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu)
* Based loosely on libg++-1.2X malloc. (It retains some of the overall * Based loosely on libg++-1.2X malloc. (It retains some of the overall
structure of old version, but most details differ.) structure of old version, but most details differ.)
*/ */

View File

@ -974,7 +974,6 @@ private:
int audiobits_; int audiobits_;
int audiochannels_; int audiochannels_;
bool setupwav(const char *pData, int nBytes); bool setupwav(const char *pData, int nBytes);
public: public:
fhandler_dev_dsp (const char *name = 0); fhandler_dev_dsp (const char *name = 0);
~fhandler_dev_dsp(); ~fhandler_dev_dsp();

View File

@ -428,7 +428,7 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t off)
if ((flags & MAP_PRIVATE) && (os_being_run == winNT || (prot & ~PROT_READ))) if ((flags & MAP_PRIVATE) && (os_being_run == winNT || (prot & ~PROT_READ)))
access = FILE_MAP_COPY; access = FILE_MAP_COPY;
SetResourceLock(LOCK_MMAP_LIST,READ_LOCK|WRITE_LOCK," mmap"); SetResourceLock(LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
#if 0 #if 0
/* Windows 95 does not have fixed addresses */ /* Windows 95 does not have fixed addresses */
@ -452,7 +452,7 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t off)
{ {
set_errno (ENOMEM); set_errno (ENOMEM);
syscall_printf ("-1 = mmap(): ENOMEM"); syscall_printf ("-1 = mmap(): ENOMEM");
ReleaseResourceLock(LOCK_MMAP_LIST,READ_LOCK|WRITE_LOCK," mmap"); ReleaseResourceLock(LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
return MAP_FAILED; return MAP_FAILED;
} }
} }
@ -475,7 +475,7 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t off)
{ {
set_errno (EBADF); set_errno (EBADF);
syscall_printf ("-1 = mmap(): EBADF"); syscall_printf ("-1 = mmap(): EBADF");
ReleaseResourceLock(LOCK_MMAP_LIST,READ_LOCK|WRITE_LOCK," mmap"); ReleaseResourceLock(LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
return MAP_FAILED; return MAP_FAILED;
} }
fh = cygheap->fdtab[fd]; fh = cygheap->fdtab[fd];
@ -509,7 +509,7 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t off)
off = rec->map_map (off, len); off = rec->map_map (off, len);
caddr_t ret = rec->get_address () + off; caddr_t ret = rec->get_address () + off;
syscall_printf ("%x = mmap() succeeded", ret); syscall_printf ("%x = mmap() succeeded", ret);
ReleaseResourceLock(LOCK_MMAP_LIST,READ_LOCK|WRITE_LOCK," mmap"); ReleaseResourceLock(LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
return ret; return ret;
} }
} }
@ -518,7 +518,7 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t off)
if (h == INVALID_HANDLE_VALUE) if (h == INVALID_HANDLE_VALUE)
{ {
ReleaseResourceLock(LOCK_MMAP_LIST,READ_LOCK|WRITE_LOCK," mmap"); ReleaseResourceLock(LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
return MAP_FAILED; return MAP_FAILED;
} }
@ -541,7 +541,7 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t off)
fh->munmap (h, base, gran_len); fh->munmap (h, base, gran_len);
set_errno (ENOMEM); set_errno (ENOMEM);
syscall_printf ("-1 = mmap(): ENOMEM"); syscall_printf ("-1 = mmap(): ENOMEM");
ReleaseResourceLock(LOCK_MMAP_LIST,READ_LOCK|WRITE_LOCK," mmap"); ReleaseResourceLock(LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
return MAP_FAILED; return MAP_FAILED;
} }
l = mmapped_areas->add_list (l, fd); l = mmapped_areas->add_list (l, fd);
@ -552,7 +552,7 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t off)
off = rec->map_map (off, len); off = rec->map_map (off, len);
caddr_t ret = rec->get_address () + off; caddr_t ret = rec->get_address () + off;
syscall_printf ("%x = mmap() succeeded", ret); syscall_printf ("%x = mmap() succeeded", ret);
ReleaseResourceLock(LOCK_MMAP_LIST,READ_LOCK|WRITE_LOCK," mmap"); ReleaseResourceLock(LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
return ret; return ret;
} }
@ -573,13 +573,13 @@ munmap (caddr_t addr, size_t len)
return -1; return -1;
} }
SetResourceLock(LOCK_MMAP_LIST,WRITE_LOCK|READ_LOCK," munmap"); SetResourceLock(LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "munmap");
/* Check if a mmap'ed area was ever created */ /* Check if a mmap'ed area was ever created */
if (mmapped_areas == NULL) if (mmapped_areas == NULL)
{ {
syscall_printf ("-1 = munmap(): mmapped_areas == NULL"); syscall_printf ("-1 = munmap(): mmapped_areas == NULL");
set_errno (EINVAL); set_errno (EINVAL);
ReleaseResourceLock(LOCK_MMAP_LIST,WRITE_LOCK|READ_LOCK," munmap"); ReleaseResourceLock(LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "munmap");
return -1; return -1;
} }
@ -605,7 +605,7 @@ munmap (caddr_t addr, size_t len)
l->erase (li); l->erase (li);
} }
syscall_printf ("0 = munmap(): %x", addr); syscall_printf ("0 = munmap(): %x", addr);
ReleaseResourceLock(LOCK_MMAP_LIST,WRITE_LOCK|READ_LOCK," munmap"); ReleaseResourceLock(LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "munmap");
return 0; return 0;
} }
} }
@ -614,7 +614,7 @@ munmap (caddr_t addr, size_t len)
set_errno (EINVAL); set_errno (EINVAL);
syscall_printf ("-1 = munmap(): EINVAL"); syscall_printf ("-1 = munmap(): EINVAL");
ReleaseResourceLock(LOCK_MMAP_LIST,WRITE_LOCK|READ_LOCK," munmap"); ReleaseResourceLock(LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "munmap");
return -1; return -1;
} }
@ -636,13 +636,13 @@ msync (caddr_t addr, size_t len, int flags)
return -1; return -1;
} }
SetResourceLock(LOCK_MMAP_LIST,WRITE_LOCK|READ_LOCK," msync"); SetResourceLock(LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "msync");
/* Check if a mmap'ed area was ever created */ /* Check if a mmap'ed area was ever created */
if (mmapped_areas == NULL) if (mmapped_areas == NULL)
{ {
syscall_printf ("-1 = msync(): mmapped_areas == NULL"); syscall_printf ("-1 = msync(): mmapped_areas == NULL");
set_errno (EINVAL); set_errno (EINVAL);
ReleaseResourceLock(LOCK_MMAP_LIST,WRITE_LOCK|READ_LOCK," msync"); ReleaseResourceLock(LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "msync");
return -1; return -1;
} }
@ -668,7 +668,7 @@ msync (caddr_t addr, size_t len, int flags)
else else
syscall_printf ("0 = msync()"); syscall_printf ("0 = msync()");
ReleaseResourceLock(LOCK_MMAP_LIST,WRITE_LOCK|READ_LOCK," msync"); ReleaseResourceLock(LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "msync");
return 0; return 0;
} }
} }
@ -679,7 +679,7 @@ msync (caddr_t addr, size_t len, int flags)
set_errno (ENOMEM); set_errno (ENOMEM);
syscall_printf ("-1 = msync(): ENOMEM"); syscall_printf ("-1 = msync(): ENOMEM");
ReleaseResourceLock(LOCK_MMAP_LIST,WRITE_LOCK|READ_LOCK," msync"); ReleaseResourceLock(LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "msync");
return -1; return -1;
} }

View File

@ -55,7 +55,7 @@ public:
~wsock_event () ~wsock_event ()
{ {
if (event) if (event)
WSACloseEvent (event); WSACloseEvent (event);
event = NULL; event = NULL;
}; };
@ -100,9 +100,9 @@ wsock_event::wait (int socket, LPDWORD flags)
{ {
debug_printf ("CancelIo() %E, fallback to blocking io"); debug_printf ("CancelIo() %E, fallback to blocking io");
WSAGetOverlappedResult(socket, &ovr, &len, TRUE, flags); WSAGetOverlappedResult(socket, &ovr, &len, TRUE, flags);
} }
else else
WSASetLastError (WSAEINTR); WSASetLastError (WSAEINTR);
break; break;
case WSA_WAIT_FAILED: case WSA_WAIT_FAILED:
break; break;
@ -470,7 +470,7 @@ static int get_inet_addr (const struct sockaddr *in, int inlen,
char buf[128]; char buf[128];
memset (buf, 0, sizeof buf); memset (buf, 0, sizeof buf);
if (read (fd, buf, sizeof buf) != -1) if (read (fd, buf, sizeof buf) != -1)
{ {
sockaddr_in sin; sockaddr_in sin;
sin.sin_family = AF_INET; sin.sin_family = AF_INET;
sscanf (buf + strlen (SOCKET_COOKIE), "%hu %08x-%08x-%08x-%08x", sscanf (buf + strlen (SOCKET_COOKIE), "%hu %08x-%08x-%08x-%08x",
@ -481,7 +481,7 @@ static int get_inet_addr (const struct sockaddr *in, int inlen,
*out = sin; *out = sin;
*outlen = sizeof sin; *outlen = sizeof sin;
ret = 1; ret = 1;
} }
_close (fd); _close (fd);
return ret; return ret;
} }
@ -526,15 +526,15 @@ cygwin_sendto (int fd,
WSABUF wsabuf = { len, (char *) buf }; WSABUF wsabuf = { len, (char *) buf };
DWORD ret = 0; DWORD ret = 0;
if (WSASendTo (h->get_socket (), &wsabuf, 1, &ret, (DWORD)flags, if (WSASendTo (h->get_socket (), &wsabuf, 1, &ret, (DWORD)flags,
to, tolen, ovr, NULL) != SOCKET_ERROR) to, tolen, ovr, NULL) != SOCKET_ERROR)
res = ret; res = ret;
else if ((res = WSAGetLastError ()) != WSA_IO_PENDING) else if ((res = WSAGetLastError ()) != WSA_IO_PENDING)
{ {
set_winsock_errno (); set_winsock_errno ();
res = -1; res = -1;
} }
else if ((res = wsock_evt.wait (h->get_socket (), (DWORD *)&flags)) == -1) else if ((res = wsock_evt.wait (h->get_socket (), (DWORD *)&flags)) == -1)
set_winsock_errno (); set_winsock_errno ();
} }
syscall_printf ("%d = sendto (%d, %x, %x, %x)", res, fd, buf, len, flags); syscall_printf ("%d = sendto (%d, %x, %x, %x)", res, fd, buf, len, flags);
@ -561,7 +561,7 @@ cygwin_recvfrom (int fd,
{ {
debug_printf ("Fallback to winsock 1 recvfrom call"); debug_printf ("Fallback to winsock 1 recvfrom call");
if ((res = recvfrom (h->get_socket (), buf, len, flags, from, fromlen)) if ((res = recvfrom (h->get_socket (), buf, len, flags, from, fromlen))
== SOCKET_ERROR) == SOCKET_ERROR)
{ {
set_winsock_errno (); set_winsock_errno ();
res = -1; res = -1;
@ -572,15 +572,15 @@ cygwin_recvfrom (int fd,
WSABUF wsabuf = { len, (char *) buf }; WSABUF wsabuf = { len, (char *) buf };
DWORD ret = 0; DWORD ret = 0;
if (WSARecvFrom (h->get_socket (), &wsabuf, 1, &ret, (DWORD *)&flags, if (WSARecvFrom (h->get_socket (), &wsabuf, 1, &ret, (DWORD *)&flags,
from, fromlen, ovr, NULL) != SOCKET_ERROR) from, fromlen, ovr, NULL) != SOCKET_ERROR)
res = ret; res = ret;
else if ((res = WSAGetLastError ()) != WSA_IO_PENDING) else if ((res = WSAGetLastError ()) != WSA_IO_PENDING)
{ {
set_winsock_errno (); set_winsock_errno ();
res = -1; res = -1;
} }
else if ((res = wsock_evt.wait (h->get_socket (), (DWORD *)&flags)) == -1) else if ((res = wsock_evt.wait (h->get_socket (), (DWORD *)&flags)) == -1)
set_winsock_errno (); set_winsock_errno ();
} }
syscall_printf ("%d = recvfrom (%d, %x, %x, %x)", res, fd, buf, len, flags); syscall_printf ("%d = recvfrom (%d, %x, %x, %x)", res, fd, buf, len, flags);
@ -756,7 +756,7 @@ cygwin_connect (int fd,
{ {
res = connect (sock->get_socket (), (sockaddr *) &sin, namelen); res = connect (sock->get_socket (), (sockaddr *) &sin, namelen);
if (res) if (res)
{ {
/* Special handling for connect to return the correct error code /* Special handling for connect to return the correct error code
when called to early on a non-blocking socket. */ when called to early on a non-blocking socket. */
if (WSAGetLastError () == WSAEWOULDBLOCK) if (WSAGetLastError () == WSAEWOULDBLOCK)
@ -766,37 +766,37 @@ cygwin_connect (int fd,
} }
set_winsock_errno (); set_winsock_errno ();
} }
if (sock->get_addr_family () == AF_UNIX) if (sock->get_addr_family () == AF_UNIX)
{ {
if (!res || in_progress) if (!res || in_progress)
{ {
if (!sock->create_secret_event (secret)) if (!sock->create_secret_event (secret))
{ {
secret_check_failed = TRUE; secret_check_failed = TRUE;
} }
else if (in_progress) else if (in_progress)
sock->signal_secret_event (); sock->signal_secret_event ();
} }
if (!secret_check_failed && !res) if (!secret_check_failed && !res)
{ {
if (!sock->check_peer_secret_event (&sin, secret)) if (!sock->check_peer_secret_event (&sin, secret))
{ {
debug_printf ( "accept from unauthorized server" ); debug_printf ( "accept from unauthorized server" );
secret_check_failed = TRUE; secret_check_failed = TRUE;
} }
} }
if (secret_check_failed) if (secret_check_failed)
{ {
sock->close_secret_event (); sock->close_secret_event ();
if (res) if (res)
closesocket (res); closesocket (res);
set_errno (ECONNREFUSED); set_errno (ECONNREFUSED);
res = -1; res = -1;
} }
} }
} }
return res; return res;
} }
@ -913,7 +913,7 @@ cygwin_accept (int fd, struct sockaddr *peer, int *len)
in_progress = TRUE; in_progress = TRUE;
if (sock->get_addr_family () == AF_UNIX) if (sock->get_addr_family () == AF_UNIX)
{ {
if ((SOCKET) res != (SOCKET) INVALID_SOCKET || in_progress) if ((SOCKET) res != (SOCKET) INVALID_SOCKET || in_progress)
{ {
if (!sock->create_secret_event ()) if (!sock->create_secret_event ())
@ -923,25 +923,25 @@ cygwin_accept (int fd, struct sockaddr *peer, int *len)
} }
if (!secret_check_failed && if (!secret_check_failed &&
(SOCKET) res != (SOCKET) INVALID_SOCKET) (SOCKET) res != (SOCKET) INVALID_SOCKET)
{ {
if (!sock->check_peer_secret_event ((struct sockaddr_in*) peer)) if (!sock->check_peer_secret_event ((struct sockaddr_in*) peer))
{ {
debug_printf ("connect from unauthorized client"); debug_printf ("connect from unauthorized client");
secret_check_failed = TRUE; secret_check_failed = TRUE;
} }
} }
if (secret_check_failed) if (secret_check_failed)
{ {
sock->close_secret_event (); sock->close_secret_event ();
if ((SOCKET) res != (SOCKET) INVALID_SOCKET) if ((SOCKET) res != (SOCKET) INVALID_SOCKET)
closesocket (res); closesocket (res);
set_errno (ECONNABORTED); set_errno (ECONNABORTED);
res = -1; res = -1;
goto done; goto done;
} }
} }
SetResourceLock (LOCK_FD_LIST, WRITE_LOCK|READ_LOCK, "accept"); SetResourceLock (LOCK_FD_LIST, WRITE_LOCK|READ_LOCK, "accept");
@ -1020,11 +1020,11 @@ cygwin_bind (int fd, const struct sockaddr *my_addr, int addrlen)
goto out; goto out;
} }
sock->set_connect_secret (); sock->set_connect_secret ();
char buf[sizeof (SOCKET_COOKIE) + 80]; char buf[sizeof (SOCKET_COOKIE) + 80];
__small_sprintf (buf, "%s%u ", SOCKET_COOKIE, sin.sin_port); __small_sprintf (buf, "%s%u ", SOCKET_COOKIE, sin.sin_port);
sock->get_connect_secret (strchr (buf, '\0')); sock->get_connect_secret (strchr (buf, '\0'));
len = strlen (buf) + 1; len = strlen (buf) + 1;
/* Note that the terminating nul is written. */ /* Note that the terminating nul is written. */
@ -1158,14 +1158,14 @@ cygwin_herror (const char *s)
switch (h_errno) switch (h_errno)
{ {
case NETDB_INTERNAL: case NETDB_INTERNAL:
h_errstr = "Resolver internal error"; h_errstr = "Resolver internal error";
break; break;
case NETDB_SUCCESS: case NETDB_SUCCESS:
h_errstr = "Resolver error 0 (no error)"; h_errstr = "Resolver error 0 (no error)";
break; break;
default: default:
h_errstr = "Unknown resolver error"; h_errstr = "Unknown resolver error";
break; break;
} }
write (2, h_errstr, strlen (h_errstr)); write (2, h_errstr, strlen (h_errstr));
write (2, "\n", 1); write (2, "\n", 1);
@ -1200,7 +1200,7 @@ cygwin_recv (int fd, void *buf, int len, unsigned int flags)
{ {
debug_printf ("Fallback to winsock 1 recv call"); debug_printf ("Fallback to winsock 1 recv call");
if ((res = recv (h->get_socket (), (char *) buf, len, flags)) if ((res = recv (h->get_socket (), (char *) buf, len, flags))
== SOCKET_ERROR) == SOCKET_ERROR)
{ {
set_winsock_errno (); set_winsock_errno ();
res = -1; res = -1;
@ -1252,15 +1252,15 @@ cygwin_send (int fd, const void *buf, int len, unsigned int flags)
WSABUF wsabuf = { len, (char *) buf }; WSABUF wsabuf = { len, (char *) buf };
DWORD ret = 0; DWORD ret = 0;
if (WSASend (h->get_socket (), &wsabuf, 1, &ret, (DWORD)flags, if (WSASend (h->get_socket (), &wsabuf, 1, &ret, (DWORD)flags,
ovr, NULL) != SOCKET_ERROR) ovr, NULL) != SOCKET_ERROR)
res = ret; res = ret;
else if ((res = WSAGetLastError ()) != WSA_IO_PENDING) else if ((res = WSAGetLastError ()) != WSA_IO_PENDING)
{ {
set_winsock_errno (); set_winsock_errno ();
res = -1; res = -1;
} }
else if ((res = wsock_evt.wait (h->get_socket (), (DWORD *)&flags)) == -1) else if ((res = wsock_evt.wait (h->get_socket (), (DWORD *)&flags)) == -1)
set_winsock_errno (); set_winsock_errno ();
} }
syscall_printf ("%d = send (%d, %x, %d, %x)", res, fd, buf, len, flags); syscall_printf ("%d = send (%d, %x, %d, %x)", res, fd, buf, len, flags);
@ -1327,7 +1327,7 @@ get_2k_ifconf (struct ifconf *ifc, int what)
!GetIpAddrTable(ipt, &siz_ip_table, TRUE)) !GetIpAddrTable(ipt, &siz_ip_table, TRUE))
{ {
for (if_cnt = 0; if_cnt < ift->dwNumEntries; ++if_cnt) for (if_cnt = 0; if_cnt < ift->dwNumEntries; ++if_cnt)
{ {
switch (ift->table[if_cnt].dwType) switch (ift->table[if_cnt].dwType)
{ {
case MIB_IF_TYPE_ETHERNET: case MIB_IF_TYPE_ETHERNET:
@ -1351,44 +1351,44 @@ get_2k_ifconf (struct ifconf *ifc, int what)
default: default:
continue; continue;
} }
for (ip_cnt = 0; ip_cnt < ipt->dwNumEntries; ++ip_cnt) for (ip_cnt = 0; ip_cnt < ipt->dwNumEntries; ++ip_cnt)
if (ipt->table[ip_cnt].dwIndex == ift->table[if_cnt].dwIndex) if (ipt->table[ip_cnt].dwIndex == ift->table[if_cnt].dwIndex)
{ {
switch (what) switch (what)
{ {
case SIOCGIFCONF: case SIOCGIFCONF:
case SIOCGIFADDR: case SIOCGIFADDR:
sa = (struct sockaddr_in *) &ifr->ifr_addr; sa = (struct sockaddr_in *) &ifr->ifr_addr;
sa->sin_addr.s_addr = ipt->table[ip_cnt].dwAddr; sa->sin_addr.s_addr = ipt->table[ip_cnt].dwAddr;
sa->sin_family = AF_INET; sa->sin_family = AF_INET;
sa->sin_port = 0; sa->sin_port = 0;
break; break;
case SIOCGIFBRDADDR: case SIOCGIFBRDADDR:
sa = (struct sockaddr_in *) &ifr->ifr_broadaddr; sa = (struct sockaddr_in *) &ifr->ifr_broadaddr;
#if 0 #if 0
/* Unfortunately, the field returns only crap. */ /* Unfortunately, the field returns only crap. */
sa->sin_addr.s_addr = ipt->table[ip_cnt].dwBCastAddr; sa->sin_addr.s_addr = ipt->table[ip_cnt].dwBCastAddr;
#else #else
lip = ipt->table[ip_cnt].dwAddr; lip = ipt->table[ip_cnt].dwAddr;
lnp = ipt->table[ip_cnt].dwMask; lnp = ipt->table[ip_cnt].dwMask;
sa->sin_addr.s_addr = lip & lnp | ~lnp; sa->sin_addr.s_addr = lip & lnp | ~lnp;
sa->sin_family = AF_INET; sa->sin_family = AF_INET;
sa->sin_port = 0; sa->sin_port = 0;
#endif #endif
break; break;
case SIOCGIFNETMASK: case SIOCGIFNETMASK:
sa = (struct sockaddr_in *) &ifr->ifr_netmask; sa = (struct sockaddr_in *) &ifr->ifr_netmask;
sa->sin_addr.s_addr = ipt->table[ip_cnt].dwMask; sa->sin_addr.s_addr = ipt->table[ip_cnt].dwMask;
sa->sin_family = AF_INET; sa->sin_family = AF_INET;
sa->sin_port = 0; sa->sin_port = 0;
break; break;
case SIOCGIFHWADDR: case SIOCGIFHWADDR:
so = &ifr->ifr_hwaddr; so = &ifr->ifr_hwaddr;
for (UINT i = 0; i < IFHWADDRLEN; ++i) for (UINT i = 0; i < IFHWADDRLEN; ++i)
if (i >= ift->table[if_cnt].dwPhysAddrLen) if (i >= ift->table[if_cnt].dwPhysAddrLen)
so->sa_data[i] = '\0'; so->sa_data[i] = '\0';
else else
so->sa_data[i] = ift->table[if_cnt].bPhysAddr[i]; so->sa_data[i] = ift->table[if_cnt].bPhysAddr[i];
so->sa_family = AF_INET; so->sa_family = AF_INET;
break; break;
case SIOCGIFMETRIC: case SIOCGIFMETRIC:
@ -1397,13 +1397,13 @@ get_2k_ifconf (struct ifconf *ifc, int what)
case SIOCGIFMTU: case SIOCGIFMTU:
ifr->ifr_mtu = ift->table[if_cnt].dwMtu; ifr->ifr_mtu = ift->table[if_cnt].dwMtu;
break; break;
} }
++cnt; ++cnt;
if ((caddr_t) ++ifr > if ((caddr_t) ++ifr >
ifc->ifc_buf + ifc->ifc_len - sizeof (struct ifreq)) ifc->ifc_buf + ifc->ifc_len - sizeof (struct ifreq))
goto done; goto done;
break; break;
} }
} }
} }
done: done:
@ -1438,26 +1438,26 @@ get_nt_ifconf (struct ifconf *ifc, int what)
struct ifreq *ifr = ifc->ifc_req; struct ifreq *ifr = ifc->ifc_req;
if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, if (RegOpenKeyEx (HKEY_LOCAL_MACHINE,
"SYSTEM\\" "SYSTEM\\"
"CurrentControlSet\\" "CurrentControlSet\\"
"Services\\" "Services\\"
"Tcpip\\" "Tcpip\\"
"Linkage", "Linkage",
0, KEY_READ, &key) == ERROR_SUCCESS) 0, KEY_READ, &key) == ERROR_SUCCESS)
{ {
if (RegQueryValueEx (key, "Bind", if (RegQueryValueEx (key, "Bind",
NULL, NULL, NULL, NULL,
NULL, &size) == ERROR_SUCCESS) NULL, &size) == ERROR_SUCCESS)
{ {
binding = (char *) alloca (size); binding = (char *) alloca (size);
if (RegQueryValueEx (key, "Bind", if (RegQueryValueEx (key, "Bind",
NULL, NULL, NULL, NULL,
(unsigned char *) binding, (unsigned char *) binding,
&size) != ERROR_SUCCESS) &size) != ERROR_SUCCESS)
{ {
binding = NULL; binding = NULL;
} }
} }
RegCloseKey (key); RegCloseKey (key);
} }
@ -1467,141 +1467,141 @@ get_nt_ifconf (struct ifconf *ifc, int what)
char cardkey[256], ipaddress[256], netmask[256]; char cardkey[256], ipaddress[256], netmask[256];
for (bp = binding; *bp; bp += strlen (bp) + 1) for (bp = binding; *bp; bp += strlen (bp) + 1)
{ {
bp += strlen ("\\Device\\"); bp += strlen ("\\Device\\");
strcpy (cardkey, "SYSTEM\\CurrentControlSet\\Services\\"); strcpy (cardkey, "SYSTEM\\CurrentControlSet\\Services\\");
strcat (cardkey, bp); strcat (cardkey, bp);
strcat (cardkey, "\\Parameters\\Tcpip"); strcat (cardkey, "\\Parameters\\Tcpip");
if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, cardkey, if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, cardkey,
0, KEY_READ, &key) != ERROR_SUCCESS) 0, KEY_READ, &key) != ERROR_SUCCESS)
continue; continue;
if (RegQueryValueEx (key, "IPAddress", if (RegQueryValueEx (key, "IPAddress",
NULL, NULL, NULL, NULL,
(unsigned char *) ipaddress, (unsigned char *) ipaddress,
(size = 256, &size)) == ERROR_SUCCESS (size = 256, &size)) == ERROR_SUCCESS
&& RegQueryValueEx (key, "SubnetMask", && RegQueryValueEx (key, "SubnetMask",
NULL, NULL, NULL, NULL,
(unsigned char *) netmask, (unsigned char *) netmask,
(size = 256, &size)) == ERROR_SUCCESS) (size = 256, &size)) == ERROR_SUCCESS)
{ {
char *ip, *np; char *ip, *np;
char dhcpaddress[256], dhcpnetmask[256]; char dhcpaddress[256], dhcpnetmask[256];
for (ip = ipaddress, np = netmask; for (ip = ipaddress, np = netmask;
*ip && *np; *ip && *np;
ip += strlen (ip) + 1, np += strlen (np) + 1) ip += strlen (ip) + 1, np += strlen (np) + 1)
{ {
if ((caddr_t) ++ifr > ifc->ifc_buf if ((caddr_t) ++ifr > ifc->ifc_buf
+ ifc->ifc_len + ifc->ifc_len
- sizeof (struct ifreq)) - sizeof (struct ifreq))
break; break;
if (! strncmp (bp, "NdisWan", 7)) if (! strncmp (bp, "NdisWan", 7))
{ {
strcpy (ifr->ifr_name, "ppp"); strcpy (ifr->ifr_name, "ppp");
strcat (ifr->ifr_name, bp + 7); strcat (ifr->ifr_name, bp + 7);
} }
else else
{ {
++*eth; ++*eth;
strcpy (ifr->ifr_name, "eth"); strcpy (ifr->ifr_name, "eth");
strcat (ifr->ifr_name, eth); strcat (ifr->ifr_name, eth);
} }
memset (&ifr->ifr_addr, '\0', sizeof ifr->ifr_addr); memset (&ifr->ifr_addr, '\0', sizeof ifr->ifr_addr);
if (cygwin_inet_addr (ip) == 0L if (cygwin_inet_addr (ip) == 0L
&& RegQueryValueEx (key, "DhcpIPAddress", && RegQueryValueEx (key, "DhcpIPAddress",
NULL, NULL, NULL, NULL,
(unsigned char *) dhcpaddress, (unsigned char *) dhcpaddress,
(size = 256, &size)) (size = 256, &size))
== ERROR_SUCCESS == ERROR_SUCCESS
&& RegQueryValueEx (key, "DhcpSubnetMask", && RegQueryValueEx (key, "DhcpSubnetMask",
NULL, NULL, NULL, NULL,
(unsigned char *) dhcpnetmask, (unsigned char *) dhcpnetmask,
(size = 256, &size)) (size = 256, &size))
== ERROR_SUCCESS) == ERROR_SUCCESS)
{ {
switch (what) switch (what)
{ {
case SIOCGIFCONF: case SIOCGIFCONF:
case SIOCGIFADDR: case SIOCGIFADDR:
sa = (struct sockaddr_in *) &ifr->ifr_addr; sa = (struct sockaddr_in *) &ifr->ifr_addr;
sa->sin_addr.s_addr = cygwin_inet_addr (dhcpaddress); sa->sin_addr.s_addr = cygwin_inet_addr (dhcpaddress);
sa->sin_family = AF_INET; sa->sin_family = AF_INET;
sa->sin_port = 0; sa->sin_port = 0;
break; break;
case SIOCGIFBRDADDR: case SIOCGIFBRDADDR:
lip = cygwin_inet_addr (dhcpaddress); lip = cygwin_inet_addr (dhcpaddress);
lnp = cygwin_inet_addr (dhcpnetmask); lnp = cygwin_inet_addr (dhcpnetmask);
sa = (struct sockaddr_in *) &ifr->ifr_broadaddr; sa = (struct sockaddr_in *) &ifr->ifr_broadaddr;
sa->sin_addr.s_addr = lip & lnp | ~lnp; sa->sin_addr.s_addr = lip & lnp | ~lnp;
sa->sin_family = AF_INET; sa->sin_family = AF_INET;
sa->sin_port = 0; sa->sin_port = 0;
break; break;
case SIOCGIFNETMASK: case SIOCGIFNETMASK:
sa = (struct sockaddr_in *) &ifr->ifr_netmask; sa = (struct sockaddr_in *) &ifr->ifr_netmask;
sa->sin_addr.s_addr = sa->sin_addr.s_addr =
cygwin_inet_addr (dhcpnetmask); cygwin_inet_addr (dhcpnetmask);
sa->sin_family = AF_INET; sa->sin_family = AF_INET;
sa->sin_port = 0; sa->sin_port = 0;
break; break;
case SIOCGIFHWADDR: case SIOCGIFHWADDR:
so = &ifr->ifr_hwaddr; so = &ifr->ifr_hwaddr;
memset (so->sa_data, 0, IFHWADDRLEN); memset (so->sa_data, 0, IFHWADDRLEN);
so->sa_family = AF_INET; so->sa_family = AF_INET;
break; break;
case SIOCGIFMETRIC: case SIOCGIFMETRIC:
ifr->ifr_metric = 1; ifr->ifr_metric = 1;
break; break;
case SIOCGIFMTU: case SIOCGIFMTU:
ifr->ifr_mtu = 1500; ifr->ifr_mtu = 1500;
break; break;
} }
} }
else else
{ {
switch (what) switch (what)
{ {
case SIOCGIFCONF: case SIOCGIFCONF:
case SIOCGIFADDR: case SIOCGIFADDR:
sa = (struct sockaddr_in *) &ifr->ifr_addr; sa = (struct sockaddr_in *) &ifr->ifr_addr;
sa->sin_addr.s_addr = cygwin_inet_addr (ip); sa->sin_addr.s_addr = cygwin_inet_addr (ip);
sa->sin_family = AF_INET; sa->sin_family = AF_INET;
sa->sin_port = 0; sa->sin_port = 0;
break; break;
case SIOCGIFBRDADDR: case SIOCGIFBRDADDR:
lip = cygwin_inet_addr (ip); lip = cygwin_inet_addr (ip);
lnp = cygwin_inet_addr (np); lnp = cygwin_inet_addr (np);
sa = (struct sockaddr_in *) &ifr->ifr_broadaddr; sa = (struct sockaddr_in *) &ifr->ifr_broadaddr;
sa->sin_addr.s_addr = lip & lnp | ~lnp; sa->sin_addr.s_addr = lip & lnp | ~lnp;
sa->sin_family = AF_INET; sa->sin_family = AF_INET;
sa->sin_port = 0; sa->sin_port = 0;
break; break;
case SIOCGIFNETMASK: case SIOCGIFNETMASK:
sa = (struct sockaddr_in *) &ifr->ifr_netmask; sa = (struct sockaddr_in *) &ifr->ifr_netmask;
sa->sin_addr.s_addr = cygwin_inet_addr (np); sa->sin_addr.s_addr = cygwin_inet_addr (np);
sa->sin_family = AF_INET; sa->sin_family = AF_INET;
sa->sin_port = 0; sa->sin_port = 0;
break; break;
case SIOCGIFHWADDR: case SIOCGIFHWADDR:
so = &ifr->ifr_hwaddr; so = &ifr->ifr_hwaddr;
memset (so->sa_data, 0, IFHWADDRLEN); memset (so->sa_data, 0, IFHWADDRLEN);
so->sa_family = AF_INET; so->sa_family = AF_INET;
break; break;
case SIOCGIFMETRIC: case SIOCGIFMETRIC:
ifr->ifr_metric = 1; ifr->ifr_metric = 1;
break; break;
case SIOCGIFMTU: case SIOCGIFMTU:
ifr->ifr_mtu = 1500; ifr->ifr_mtu = 1500;
break; break;
} }
} }
++cnt; ++cnt;
} }
} }
RegCloseKey (key); RegCloseKey (key);
} }
} }
/* Set the correct length */ /* Set the correct length */
@ -1644,7 +1644,7 @@ get_95_ifconf (struct ifconf *ifc, int what)
struct ifreq *ifr = ifc->ifc_req; struct ifreq *ifr = ifc->ifc_req;
if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, "Enum\\Network\\MSTCP", if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, "Enum\\Network\\MSTCP",
0, KEY_READ, &key) != ERROR_SUCCESS) 0, KEY_READ, &key) != ERROR_SUCCESS)
{ {
/* Set the correct length */ /* Set the correct length */
ifc->ifc_len = cnt * sizeof (struct ifreq); ifc->ifc_len = cnt * sizeof (struct ifreq);
@ -1653,8 +1653,8 @@ get_95_ifconf (struct ifconf *ifc, int what)
for (int i = 0; for (int i = 0;
(res = RegEnumKeyEx (key, i, ifname, (res = RegEnumKeyEx (key, i, ifname,
(size = sizeof ifname, &size), (size = sizeof ifname, &size),
0, 0, 0, &update)) != ERROR_NO_MORE_ITEMS; 0, 0, 0, &update)) != ERROR_NO_MORE_ITEMS;
++i) ++i)
{ {
HKEY ifkey, subkey; HKEY ifkey, subkey;
@ -1662,62 +1662,62 @@ get_95_ifconf (struct ifconf *ifc, int what)
char adapter[256], ip[256], np[256]; char adapter[256], ip[256], np[256];
if (res != ERROR_SUCCESS if (res != ERROR_SUCCESS
|| RegOpenKeyEx (key, ifname, 0, || RegOpenKeyEx (key, ifname, 0,
KEY_READ, &ifkey) != ERROR_SUCCESS) KEY_READ, &ifkey) != ERROR_SUCCESS)
continue; continue;
if (RegQueryValueEx (ifkey, "Driver", 0, if (RegQueryValueEx (ifkey, "Driver", 0,
NULL, (unsigned char *) driver, NULL, (unsigned char *) driver,
(size = sizeof driver, &size)) != ERROR_SUCCESS) (size = sizeof driver, &size)) != ERROR_SUCCESS)
{ {
RegCloseKey (ifkey); RegCloseKey (ifkey);
continue; continue;
} }
strcpy (classname, "System\\CurrentControlSet\\Services\\Class\\"); strcpy (classname, "System\\CurrentControlSet\\Services\\Class\\");
strcat (classname, driver); strcat (classname, driver);
if ((res = RegOpenKeyEx (HKEY_LOCAL_MACHINE, classname, if ((res = RegOpenKeyEx (HKEY_LOCAL_MACHINE, classname,
0, KEY_READ, &subkey)) != ERROR_SUCCESS) 0, KEY_READ, &subkey)) != ERROR_SUCCESS)
{ {
RegCloseKey (ifkey); RegCloseKey (ifkey);
continue; continue;
} }
if (RegQueryValueEx (subkey, "IPAddress", 0, if (RegQueryValueEx (subkey, "IPAddress", 0,
NULL, (unsigned char *) ip, NULL, (unsigned char *) ip,
(size = sizeof ip, &size)) == ERROR_SUCCESS (size = sizeof ip, &size)) == ERROR_SUCCESS
&& RegQueryValueEx (subkey, "IPMask", 0, && RegQueryValueEx (subkey, "IPMask", 0,
NULL, (unsigned char *) np, NULL, (unsigned char *) np,
(size = sizeof np, &size)) == ERROR_SUCCESS) (size = sizeof np, &size)) == ERROR_SUCCESS)
{ {
if ((caddr_t)++ifr > ifc->ifc_buf if ((caddr_t)++ifr > ifc->ifc_buf
+ ifc->ifc_len + ifc->ifc_len
- sizeof (struct ifreq)) - sizeof (struct ifreq))
goto out; goto out;
switch (what) switch (what)
{ {
case SIOCGIFCONF: case SIOCGIFCONF:
case SIOCGIFADDR: case SIOCGIFADDR:
sa = (struct sockaddr_in *) &ifr->ifr_addr; sa = (struct sockaddr_in *) &ifr->ifr_addr;
sa->sin_addr.s_addr = cygwin_inet_addr (ip); sa->sin_addr.s_addr = cygwin_inet_addr (ip);
sa->sin_family = AF_INET; sa->sin_family = AF_INET;
sa->sin_port = 0; sa->sin_port = 0;
break; break;
case SIOCGIFBRDADDR: case SIOCGIFBRDADDR:
lip = cygwin_inet_addr (ip); lip = cygwin_inet_addr (ip);
lnp = cygwin_inet_addr (np); lnp = cygwin_inet_addr (np);
sa = (struct sockaddr_in *) &ifr->ifr_broadaddr; sa = (struct sockaddr_in *) &ifr->ifr_broadaddr;
sa->sin_addr.s_addr = lip & lnp | ~lnp; sa->sin_addr.s_addr = lip & lnp | ~lnp;
sa->sin_family = AF_INET; sa->sin_family = AF_INET;
sa->sin_port = 0; sa->sin_port = 0;
break; break;
case SIOCGIFNETMASK: case SIOCGIFNETMASK:
sa = (struct sockaddr_in *) &ifr->ifr_netmask; sa = (struct sockaddr_in *) &ifr->ifr_netmask;
sa->sin_addr.s_addr = cygwin_inet_addr (np); sa->sin_addr.s_addr = cygwin_inet_addr (np);
sa->sin_family = AF_INET; sa->sin_family = AF_INET;
sa->sin_port = 0; sa->sin_port = 0;
break; break;
case SIOCGIFHWADDR: case SIOCGIFHWADDR:
so = &ifr->ifr_hwaddr; so = &ifr->ifr_hwaddr;
memset (so->sa_data, 0, IFHWADDRLEN); memset (so->sa_data, 0, IFHWADDRLEN);
@ -1729,61 +1729,61 @@ get_95_ifconf (struct ifconf *ifc, int what)
case SIOCGIFMTU: case SIOCGIFMTU:
ifr->ifr_mtu = 1500; ifr->ifr_mtu = 1500;
break; break;
} }
} }
RegCloseKey (subkey); RegCloseKey (subkey);
if (RegOpenKeyEx (ifkey, "Bindings", if (RegOpenKeyEx (ifkey, "Bindings",
0, KEY_READ, &subkey) != ERROR_SUCCESS) 0, KEY_READ, &subkey) != ERROR_SUCCESS)
{ {
RegCloseKey (ifkey); RegCloseKey (ifkey);
--ifr; --ifr;
continue; continue;
} }
for (int j = 0; for (int j = 0;
(res = RegEnumValue (subkey, j, bindname, (res = RegEnumValue (subkey, j, bindname,
(size = sizeof bindname, &size), (size = sizeof bindname, &size),
0, NULL, NULL, NULL)) != ERROR_NO_MORE_ITEMS; 0, NULL, NULL, NULL)) != ERROR_NO_MORE_ITEMS;
++j) ++j)
if (!strncasecmp (bindname, "VREDIR\\", 7)) if (!strncasecmp (bindname, "VREDIR\\", 7))
break; break;
RegCloseKey (subkey); RegCloseKey (subkey);
if (res == ERROR_SUCCESS) if (res == ERROR_SUCCESS)
{ {
strcpy (netname, "System\\CurrentControlSet\\Services\\Class\\Net\\"); strcpy (netname, "System\\CurrentControlSet\\Services\\Class\\Net\\");
strcat (netname, bindname + 7); strcat (netname, bindname + 7);
if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, netname, if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, netname,
0, KEY_READ, &subkey) != ERROR_SUCCESS) 0, KEY_READ, &subkey) != ERROR_SUCCESS)
{ {
RegCloseKey (ifkey); RegCloseKey (ifkey);
--ifr; --ifr;
continue; continue;
} }
if (RegQueryValueEx (subkey, "AdapterName", 0, if (RegQueryValueEx (subkey, "AdapterName", 0,
NULL, (unsigned char *) adapter, NULL, (unsigned char *) adapter,
(size = sizeof adapter, &size)) == ERROR_SUCCESS (size = sizeof adapter, &size)) == ERROR_SUCCESS
&& strcasematch (adapter, "MS$PPP")) && strcasematch (adapter, "MS$PPP"))
{ {
++*ppp; ++*ppp;
strcpy (ifr->ifr_name, "ppp"); strcpy (ifr->ifr_name, "ppp");
strcat (ifr->ifr_name, ppp); strcat (ifr->ifr_name, ppp);
} }
else else
{ {
++*eth; ++*eth;
strcpy (ifr->ifr_name, "eth"); strcpy (ifr->ifr_name, "eth");
strcat (ifr->ifr_name, eth); strcat (ifr->ifr_name, eth);
} }
RegCloseKey (subkey); RegCloseKey (subkey);
} }
RegCloseKey (ifkey); RegCloseKey (ifkey);
@ -1863,14 +1863,14 @@ get_ifconf (struct ifconf *ifc, int what)
/* We have a win95 version... */ /* We have a win95 version... */
if (os_version_info.dwPlatformId != VER_PLATFORM_WIN32_NT if (os_version_info.dwPlatformId != VER_PLATFORM_WIN32_NT
&& (os_version_info.dwMajorVersion < 4 && (os_version_info.dwMajorVersion < 4
|| (os_version_info.dwMajorVersion == 4 || (os_version_info.dwMajorVersion == 4
&& os_version_info.dwMinorVersion == 0))) && os_version_info.dwMinorVersion == 0)))
get_95_ifconf (ifc, what); get_95_ifconf (ifc, what);
/* ...and a NT <= SP3 version... */ /* ...and a NT <= SP3 version... */
else if (os_version_info.dwPlatformId == VER_PLATFORM_WIN32_NT else if (os_version_info.dwPlatformId == VER_PLATFORM_WIN32_NT
&& (os_version_info.dwMajorVersion < 4 && (os_version_info.dwMajorVersion < 4
|| (os_version_info.dwMajorVersion == 4 || (os_version_info.dwMajorVersion == 4
&& strcmp (os_version_info.szCSDVersion, "Service Pack 4") < 0))) && strcmp (os_version_info.szCSDVersion, "Service Pack 4") < 0)))
get_nt_ifconf (ifc, what); get_nt_ifconf (ifc, what);
/* ...and finally a "modern" version for win98/ME, NT >= SP4 and W2K! */ /* ...and finally a "modern" version for win98/ME, NT >= SP4 and W2K! */
else else

View File

@ -133,8 +133,8 @@ read_etc_passwd ()
/* if we got blocked by the mutex, then etc_passwd may have been processed */ /* if we got blocked by the mutex, then etc_passwd may have been processed */
if (passwd_state != uninitialized) if (passwd_state != uninitialized)
{ {
pthread_mutex_unlock(&etc_passwd_mutex); pthread_mutex_unlock(&etc_passwd_mutex);
return; return;
} }
if (passwd_state != initializing) if (passwd_state != initializing)
@ -232,7 +232,7 @@ getpwuid_r (uid_t uid, struct passwd *pwd, char *buffer, size_t bufsize, struct
/* check needed buffer size. */ /* check needed buffer size. */
size_t needsize = strlen (temppw->pw_name) + strlen (temppw->pw_dir) + size_t needsize = strlen (temppw->pw_name) + strlen (temppw->pw_dir) +
strlen (temppw->pw_shell) + strlen (temppw->pw_gecos) + strlen (temppw->pw_shell) + strlen (temppw->pw_gecos) +
strlen (temppw->pw_passwd) + 5; strlen (temppw->pw_passwd) + 5;
if (needsize > bufsize) if (needsize > bufsize)
return ERANGE; return ERANGE;
@ -290,7 +290,7 @@ getpwnam_r (const char *nam, struct passwd *pwd, char *buffer, size_t bufsize, s
/* check needed buffer size. */ /* check needed buffer size. */
size_t needsize = strlen (temppw->pw_name) + strlen (temppw->pw_dir) + size_t needsize = strlen (temppw->pw_name) + strlen (temppw->pw_dir) +
strlen (temppw->pw_shell) + strlen (temppw->pw_gecos) + strlen (temppw->pw_shell) + strlen (temppw->pw_gecos) +
strlen (temppw->pw_passwd) + 5; strlen (temppw->pw_passwd) + 5;
if (needsize > bufsize) if (needsize > bufsize)
return ERANGE; return ERANGE;

View File

@ -27,7 +27,6 @@
/* for getpid */ /* for getpid */
#include <unistd.h> #include <unistd.h>
/* Win32 priority to UNIX priority Mapping. /* Win32 priority to UNIX priority Mapping.
For now, I'm just following the spec: any range of priorities is ok. For now, I'm just following the spec: any range of priorities is ok.
There are probably many many issues with this... There are probably many many issues with this...

View File

@ -710,7 +710,7 @@ create_token (cygsid &usersid, cygsid &pgrpsid)
else else
{ {
/* Switching user context to SYSTEM doesn't inherit the authentication /* Switching user context to SYSTEM doesn't inherit the authentication
id of the user account running current process. */ id of the user account running current process. */
if (usersid != well_known_system_sid) if (usersid != well_known_system_sid)
if (!GetTokenInformation (my_token, TokenStatistics, if (!GetTokenInformation (my_token, TokenStatistics,
&stats, sizeof stats, &size)) &stats, sizeof stats, &size))
@ -719,9 +719,9 @@ create_token (cygsid &usersid, cygsid &pgrpsid)
auth_luid = stats.AuthenticationId; auth_luid = stats.AuthenticationId;
/* Retrieving current processes group list to be able to inherit /* Retrieving current processes group list to be able to inherit
some important well known group sids. */ some important well known group sids. */
if (!GetTokenInformation (my_token, TokenGroups, NULL, 0, &size) && if (!GetTokenInformation (my_token, TokenGroups, NULL, 0, &size) &&
GetLastError () != ERROR_INSUFFICIENT_BUFFER) GetLastError () != ERROR_INSUFFICIENT_BUFFER)
debug_printf ("GetTokenInformation(my_token, TokenGroups): %E\n"); debug_printf ("GetTokenInformation(my_token, TokenGroups): %E\n");
else if (!(my_grps = (PTOKEN_GROUPS) malloc (size))) else if (!(my_grps = (PTOKEN_GROUPS) malloc (size)))
debug_printf ("malloc (my_grps) failed."); debug_printf ("malloc (my_grps) failed.");
@ -751,10 +751,10 @@ create_token (cygsid &usersid, cygsid &pgrpsid)
{ {
grps->Groups[i].Sid = grpsids.sids[i]; grps->Groups[i].Sid = grpsids.sids[i];
grps->Groups[i].Attributes = SE_GROUP_MANDATORY | grps->Groups[i].Attributes = SE_GROUP_MANDATORY |
SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_ENABLED_BY_DEFAULT |
SE_GROUP_ENABLED; SE_GROUP_ENABLED;
if (auth_pos >= 0 && i == (DWORD) auth_pos) if (auth_pos >= 0 && i == (DWORD) auth_pos)
grps->Groups[i].Attributes |= SE_GROUP_LOGON_ID; grps->Groups[i].Attributes |= SE_GROUP_LOGON_ID;
} }
/* Retrieve list of privileges of that user. */ /* Retrieve list of privileges of that user. */
@ -780,7 +780,7 @@ create_token (cygsid &usersid, cygsid &pgrpsid)
/* Convert to primary token. */ /* Convert to primary token. */
if (!DuplicateTokenEx (token, TOKEN_ALL_ACCESS, &sa, if (!DuplicateTokenEx (token, TOKEN_ALL_ACCESS, &sa,
SecurityImpersonation, TokenPrimary, SecurityImpersonation, TokenPrimary,
&primary_token)) &primary_token))
__seterrno (); __seterrno ();
@ -879,7 +879,7 @@ subauth (struct passwd *pw)
subbuf.auth.ParameterControl = 0 | (subauth_id << 24); subbuf.auth.ParameterControl = 0 | (subauth_id << 24);
/* Try to logon... */ /* Try to logon... */
ret = LsaLogonUser(lsa_hdl, (PLSA_STRING) &origin, Network, ret = LsaLogonUser(lsa_hdl, (PLSA_STRING) &origin, Network,
package_id, &subbuf, sizeof subbuf, package_id, &subbuf, sizeof subbuf,
NULL, &ts, (PVOID *)&profile, &size, NULL, &ts, (PVOID *)&profile, &size,
&luid, &user_token, &quota, &ret2); &luid, &user_token, &quota, &ret2);
if (ret != STATUS_SUCCESS) if (ret != STATUS_SUCCESS)
@ -892,7 +892,7 @@ subauth (struct passwd *pw)
LsaFreeReturnBuffer(profile); LsaFreeReturnBuffer(profile);
/* Convert to primary token. */ /* Convert to primary token. */
if (!DuplicateTokenEx (user_token, TOKEN_ALL_ACCESS, &sa, if (!DuplicateTokenEx (user_token, TOKEN_ALL_ACCESS, &sa,
SecurityImpersonation, TokenPrimary, SecurityImpersonation, TokenPrimary,
&primary_token)) &primary_token))
__seterrno (); __seterrno ();
@ -943,7 +943,7 @@ read_sd(const char *file, PSECURITY_DESCRIPTOR sd_buf, LPDWORD sd_size)
} }
if (!GetFileSecurity (pfile, if (!GetFileSecurity (pfile,
OWNER_SECURITY_INFORMATION OWNER_SECURITY_INFORMATION
| GROUP_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION
| DACL_SECURITY_INFORMATION, | DACL_SECURITY_INFORMATION,
sd_buf, *sd_size, &len)) sd_buf, *sd_size, &len))

View File

@ -44,6 +44,7 @@ details. */
#include "security.h" #include "security.h"
#include <semaphore.h> #include <semaphore.h>
#include <stdio.h> #include <stdio.h>
#include <sys/timeb.h>
extern int threadsafe; extern int threadsafe;
@ -423,7 +424,7 @@ pthread_cond::BroadCast ()
if (!verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC)) if (!verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC))
{ {
if (pthread_mutex_unlock (&cond_access)) if (pthread_mutex_unlock (&cond_access))
system_printf ("Failed to unlock condition variable access mutex, this %0p\n", this); system_printf ("Failed to unlock condition variable access mutex, this %0p\n", this);
/* This isn't and API error - users are allowed to call this when no threads /* This isn't and API error - users are allowed to call this when no threads
are waiting are waiting
system_printf ("Broadcast called with invalid mutex\n"); system_printf ("Broadcast called with invalid mutex\n");
@ -444,8 +445,8 @@ pthread_cond::Signal ()
if (!verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC)) if (!verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC))
{ {
if (pthread_mutex_unlock (&cond_access)) if (pthread_mutex_unlock (&cond_access))
system_printf ("Failed to unlock condition variable access mutex, this %0p\n", system_printf ("Failed to unlock condition variable access mutex, this %0p\n",
this); this);
return; return;
} }
PulseEvent (win32_obj_id); PulseEvent (win32_obj_id);
@ -472,6 +473,7 @@ pthread_cond::TimedWait (DWORD dwMilliseconds)
case WAIT_FAILED: case WAIT_FAILED:
return 0; /* POSIX doesn't allow errors after we modify the mutex state */ return 0; /* POSIX doesn't allow errors after we modify the mutex state */
case WAIT_ABANDONED: case WAIT_ABANDONED:
case WAIT_TIMEOUT:
return ETIMEDOUT; return ETIMEDOUT;
case WAIT_OBJECT_0: case WAIT_OBJECT_0:
return 0; /* we have been signaled */ return 0; /* we have been signaled */
@ -580,23 +582,23 @@ pthread_mutex::pthread_mutex (pthread_mutex_t *mutex, pthread_mutexattr * attr):
char stringbuf[29]; char stringbuf[29];
unsigned short id = 1; unsigned short id = 1;
while (id < 256) while (id < 256)
{ {
snprintf (stringbuf, 29, "CYGWINMUTEX0x%0x", id & 0x000f); snprintf (stringbuf, 29, "CYGWINMUTEX0x%0x", id & 0x000f);
system_printf ("name of mutex to create %s\n",stringbuf); system_printf ("name of mutex to create %s\n",stringbuf);
this->win32_obj_id =::CreateMutex (&sec_none_nih, false, stringbuf); this->win32_obj_id =::CreateMutex (&sec_none_nih, false, stringbuf);
if (this->win32_obj_id && GetLastError () != ERROR_ALREADY_EXISTS) if (this->win32_obj_id && GetLastError () != ERROR_ALREADY_EXISTS)
{ {
MT_INTERFACE->pshared_mutexs[id] = this; MT_INTERFACE->pshared_mutexs[id] = this;
pshared_mutex *pmutex=(pshared_mutex *)(mutex); pshared_mutex *pmutex=(pshared_mutex *)(mutex);
pmutex->id = id; pmutex->id = id;
pmutex->flags = SYS_BASE; pmutex->flags = SYS_BASE;
pshared = PTHREAD_PROCESS_SHARED; pshared = PTHREAD_PROCESS_SHARED;
condwaits = 0; condwaits = 0;
return; return;
} }
id++; id++;
CloseHandle (win32_obj_id); CloseHandle (win32_obj_id);
} }
magic = 0; magic = 0;
win32_obj_id = NULL; win32_obj_id = NULL;
} }
@ -605,7 +607,7 @@ pthread_mutex::pthread_mutex (pthread_mutex_t *mutex, pthread_mutexattr * attr):
this->win32_obj_id =::CreateMutex (&sec_none_nih, false, NULL); this->win32_obj_id =::CreateMutex (&sec_none_nih, false, NULL);
if (!win32_obj_id) if (!win32_obj_id)
magic = 0; magic = 0;
condwaits = 0; condwaits = 0;
pshared = PTHREAD_PROCESS_PRIVATE; pshared = PTHREAD_PROCESS_PRIVATE;
} }
@ -1654,16 +1656,23 @@ __pthread_cond_timedwait (pthread_cond_t * cond, pthread_mutex_t * mutex,
return EINVAL; return EINVAL;
if (!verifyable_object_isvalid (*cond, PTHREAD_COND_MAGIC)) if (!verifyable_object_isvalid (*cond, PTHREAD_COND_MAGIC))
return EINVAL; return EINVAL;
struct timeb currSysTime;
long waitlength;
ftime(&currSysTime);
waitlength = (abstime->tv_sec - currSysTime.time) * 1000;
if (waitlength < 0)
return ETIMEDOUT;
/* if the cond variable is blocked, then the above timer test maybe wrong. *shrug* */
if (pthread_mutex_lock (&(*cond)->cond_access)) if (pthread_mutex_lock (&(*cond)->cond_access))
system_printf ("Failed to lock condition variable access mutex, this %0p\n", *cond); system_printf ("Failed to lock condition variable access mutex, this %0p\n", *cond);
if ((*cond)->waiting) if ((*cond)->waiting)
if ((*cond)->mutex && ((*cond)->mutex != (*themutex))) if ((*cond)->mutex && ((*cond)->mutex != (*themutex)))
{ {
if (pthread_mutex_unlock (&(*cond)->cond_access)) if (pthread_mutex_unlock (&(*cond)->cond_access))
system_printf ("Failed to unlock condition variable access mutex, this %0p\n", *cond); system_printf ("Failed to unlock condition variable access mutex, this %0p\n", *cond);
return EINVAL; return EINVAL;
} }
InterlockedIncrement (&((*cond)->waiting)); InterlockedIncrement (&((*cond)->waiting));
@ -1671,7 +1680,7 @@ __pthread_cond_timedwait (pthread_cond_t * cond, pthread_mutex_t * mutex,
InterlockedIncrement (&((*themutex)->condwaits)); InterlockedIncrement (&((*themutex)->condwaits));
if (pthread_mutex_unlock (&(*cond)->cond_access)) if (pthread_mutex_unlock (&(*cond)->cond_access))
system_printf ("Failed to unlock condition variable access mutex, this %0p\n", *cond); system_printf ("Failed to unlock condition variable access mutex, this %0p\n", *cond);
rv = (*cond)->TimedWait (abstime->tv_sec * 1000); rv = (*cond)->TimedWait (waitlength);
(*cond)->mutex->Lock (); (*cond)->mutex->Lock ();
if (pthread_mutex_lock (&(*cond)->cond_access)) if (pthread_mutex_lock (&(*cond)->cond_access))
system_printf ("Failed to lock condition variable access mutex, this %0p\n", *cond); system_printf ("Failed to lock condition variable access mutex, this %0p\n", *cond);
@ -1708,9 +1717,9 @@ __pthread_cond_wait (pthread_cond_t * cond, pthread_mutex_t * mutex)
if ((*cond)->waiting) if ((*cond)->waiting)
if ((*cond)->mutex && ((*cond)->mutex != (*themutex))) if ((*cond)->mutex && ((*cond)->mutex != (*themutex)))
{ {
if (pthread_mutex_unlock (&(*cond)->cond_access)) if (pthread_mutex_unlock (&(*cond)->cond_access))
system_printf ("Failed to unlock condition variable access mutex, this %0p\n", *cond); system_printf ("Failed to unlock condition variable access mutex, this %0p\n", *cond);
return EINVAL; return EINVAL;
} }
InterlockedIncrement (&((*cond)->waiting)); InterlockedIncrement (&((*cond)->waiting));
@ -1856,11 +1865,11 @@ __pthread_mutex_init (pthread_mutex_t * mutex,
mutex = __pthread_mutex_getpshared ((pthread_mutex_t *) mutex); mutex = __pthread_mutex_getpshared ((pthread_mutex_t *) mutex);
if (!verifyable_object_isvalid (*mutex, PTHREAD_MUTEX_MAGIC)) if (!verifyable_object_isvalid (*mutex, PTHREAD_MUTEX_MAGIC))
{ {
delete throwaway; delete throwaway;
*mutex = NULL; *mutex = NULL;
return EAGAIN; return EAGAIN;
} }
return 0; return 0;
} }
*mutex = new pthread_mutex (attr ? (*attr) : NULL); *mutex = new pthread_mutex (attr ? (*attr) : NULL);

View File

@ -269,10 +269,10 @@ public:
int TryLock (); int TryLock ();
int UnLock (); int UnLock ();
pthread_mutex (unsigned short); pthread_mutex (unsigned short);
pthread_mutex (pthread_mutexattr *); pthread_mutex (pthread_mutexattr *);
pthread_mutex (pthread_mutex_t *, pthread_mutexattr *); pthread_mutex (pthread_mutex_t *, pthread_mutexattr *);
~pthread_mutex (); ~pthread_mutex ();
}; };
class pthread_condattr:public verifyable_object class pthread_condattr:public verifyable_object
@ -280,8 +280,8 @@ class pthread_condattr:public verifyable_object
public: public:
int shared; int shared;
pthread_condattr (); pthread_condattr ();
~pthread_condattr (); ~pthread_condattr ();
}; };
class pthread_cond:public verifyable_object class pthread_cond:public verifyable_object