Change _function() to function() throughout.

* cygwin.din: Remove last vestiges (?) of newlib wrappers.
* cygthread.cc (cygthread::detach): Always wait for event or suffer an
apparently inavoidable race.
* dcrt0.cc (dll_crt0_1): Allocate threads after stack has been relocated.
* debub.cc (lock_debug): Don't acquire lock on exit.
* fork.cc (fork_child): Recreate mmaps before doing anything else since Windows
has a habit of using blocks of memory in the child that could previously have
been occupied by shared memory in the parent.
* mmap.cc (fhandler_disk_file::fixup_mmap_after_fork): Issue error here and
provide some details about what went wrong.
(fixup_mmaps_after_fork): Remove error message.
* shared.cc (open_shared): Move warning message so that more detail is
possible.
* sigproc.cc (sigproc_init): Initialize sync_proc_subproc to avoid a race.
(sigproc_terminate): Specifically wait for process thread to terminate.
This commit is contained in:
Christopher Faylor 2002-10-21 01:00:58 +00:00
parent ccefaab1d5
commit 5ec14fe40a
17 changed files with 164 additions and 126 deletions

View File

@ -1,3 +1,27 @@
2002-10-20 Christopher Faylor <cgf@redhat.com>
Change _function() to function() throughout.
* cygwin.din: Remove last vestiges (?) of newlib wrappers.
2002-10-20 Christopher Faylor <cgf@redhat.com>
* cygthread.cc (cygthread::detach): Always wait for event or suffer an
apparently inavoidable race.
* dcrt0.cc (dll_crt0_1): Allocate threads after stack has been
relocated.
* debub.cc (lock_debug): Don't acquire lock on exit.
* fork.cc (fork_child): Recreate mmaps before doing anything else since
Windows has a habit of using blocks of memory in the child that could
previously have been occupied by shared memory in the parent.
* mmap.cc (fhandler_disk_file::fixup_mmap_after_fork): Issue error here
and provide some details about what went wrong.
(fixup_mmaps_after_fork): Remove error message.
* shared.cc (open_shared): Move warning message so that more detail is
possible.
* sigproc.cc (sigproc_init): Initialize sync_proc_subproc to avoid a
race.
(sigproc_terminate): Specifically wait for process thread to terminate.
2002-10-20 Christopher Faylor <cgf@redhat.com>
* cygthread.cc (cygthread::stub): Fix typo.
@ -73,7 +97,7 @@
unneeded SEGV's during debugging.
2002-10-17 Thomas Pfaff <tpfaff@gmx.net>
* thread.cc (verifyable_object_isvalid): Test for static object first.
2002-10-16 Christopher Faylor <cgf@redhat.com>

View File

@ -64,7 +64,6 @@ cygthread::stub (VOID *arg)
switch (WaitForSingleObject (info->thread_sync, INFINITE))
{
case WAIT_OBJECT_0:
// ResetEvent (info->thread_sync);
continue;
default:
api_fatal ("WFSO failed, %E");
@ -204,10 +203,10 @@ cygthread::cygthread (LPTHREAD_START_ROUTINE start, LPVOID param,
__name = name; /* Need to set after thread has woken up to
ensure that it won't be cleared by exiting
thread. */
if (thread_sync)
SetEvent (thread_sync);
else
if (!thread_sync)
ResumeThread (h);
else
SetEvent (thread_sync);
}
/* Return the symbolic name of the current thread for debugging.
@ -269,15 +268,9 @@ cygthread::detach ()
else
{
DWORD avail = id;
/* Checking for __name here is just a minor optimization to avoid
an OS call. */
if (!__name)
thread_printf ("thread id %p returned. No need to wait.", id);
else
{
DWORD res = WaitForSingleObject (*this, INFINITE);
thread_printf ("WFSO returns %d, id %p", res, id);
}
DWORD res = WaitForSingleObject (*this, INFINITE);
thread_printf ("WFSO returns %d, id %p", res, id);
if (is_freerange)
{
CloseHandle (h);
@ -285,9 +278,8 @@ cygthread::detach ()
}
else
{
ResetEvent (*this);
id = 0;
__name = NULL;
ResetEvent (*this);
/* Mark the thread as available by setting avail to non-zero */
(void) InterlockedExchange ((LPLONG) &this->avail, avail);
}

View File

@ -110,8 +110,8 @@ clearerr
_clearerr = clearerr
clock
_clock = clock
_close
close = _close
close
_close = close
closedir
_closedir = closedir
copysign
@ -217,8 +217,8 @@ fcloseall
_fcloseall = fcloseall
_fcloseall_r
fcloseall_r = _fcloseall_r
_fcntl
fcntl = _fcntl
fcntl
_fcntl = fcntl
fcvt
_fcvt = fcvt
fcvtbuf
@ -534,8 +534,8 @@ login
logout
longjmp
_longjmp = longjmp
_lseek
lseek = _lseek
lseek
_lseek = lseek
lseek64
lstat = cygwin_lstat
_lstat = cygwin_lstat
@ -593,8 +593,8 @@ nextafter
_nextafter = nextafter
nextafterf
_nextafterf = nextafterf
_open
open = _open
open
_open = open
opendir
_opendir = opendir
pathconf
@ -632,8 +632,8 @@ _rand = rand
random
initstate
setstate
_read
read = _read
read
_read = read
readdir
_readdir = readdir
readlink
@ -652,8 +652,8 @@ remainderf
_remainderf = remainderf
remove
_remove = remove
_rename
rename = _rename
rename
_rename = rename
rewind
_rewind = rewind
rewinddir
@ -893,8 +893,8 @@ tempnam
_tempnam = tempnam
time
_time = time
_times
times = _times
times
_times = times
timezone
tmpfile
_tmpfile = tmpfile
@ -921,8 +921,8 @@ uname
_uname = uname
ungetc
_ungetc = ungetc
_unlink
unlink = _unlink
unlink
_unlink = unlink
usleep
_usleep = usleep
utime
@ -956,8 +956,8 @@ vsscanf
_vsscanf = vsscanf
_vsscanf_r
vsscanf_r = _vsscanf_r
_wait
wait = _wait
wait
_wait = wait
waitpid
_waitpid = waitpid
wait3
@ -966,8 +966,8 @@ wcstombs
_wcstombs = wcstombs
wctomb
_wctomb = wctomb
_write
write = _write
write
_write = write
writev
_writev = writev
y0

View File

@ -574,8 +574,8 @@ dll_crt0_1 ()
if (!child_proc_info)
{
memory_init ();
cygthread::init ();
memory_init ();
}
else
{
@ -584,8 +584,9 @@ dll_crt0_1 ()
switch (child_proc_info->type)
{
case _PROC_FORK:
cygheap_fixup_in_child (0);
alloc_stack (fork_info);
cygthread::init ();
cygheap_fixup_in_child (0);
close_ppid_handle = !!child_proc_info->pppid_handle;
memory_init ();
set_myself (mypid);
@ -599,6 +600,7 @@ dll_crt0_1 ()
hexec_proc = spawn_info->hexec_proc;
around:
HANDLE h;
cygthread::init ();
cygheap_fixup_in_child (1);
memory_init ();
if (!spawn_info->moreinfo->myself_pinfo ||
@ -619,7 +621,7 @@ dll_crt0_1 ()
old_title = strcpy (title_buf, spawn_info->moreinfo->old_title);
cfree (spawn_info->moreinfo->old_title);
}
cygthread::init ();
// cygthread::init ();
break;
}
if (close_hexec_proc)

View File

@ -37,7 +37,8 @@ class lock_debug
public:
lock_debug () : acquired (0)
{
if (locker)
extern int exit_state;
if (locker && !exit_state)
acquired = !!locker->acquire (INFINITE);
}
void unlock ()

View File

@ -476,7 +476,7 @@ dtable::dup2 (int oldfd, int newfd)
newfh->get_io_handle (), fds[oldfd]->get_io_handle ());
if (!not_open (newfd))
_close (newfd);
close (newfd);
else if ((size_t) newfd < size)
/* nothing to do */;
else if (find_unused_handle (newfd) < 0)

View File

@ -8,6 +8,7 @@ This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#define _execve __FOO_execve_
#include "winsup.h"
#include <unistd.h>
#include <stdlib.h>
@ -20,12 +21,13 @@ details. */
#include "pinfo.h"
#include "environ.h"
#include "cygerrno.h"
#undef _execve
/* This is called _execve and not execve because the real execve is defined
in libc/posix/execve.c. It calls us. */
extern "C" int
_execve (const char *path, char *const argv[], char *const envp[])
execve (const char *path, char *const argv[], char *const envp[])
{
static char *const empty_env[] = { 0 };
MALLOC_CHECK;
@ -34,6 +36,9 @@ _execve (const char *path, char *const argv[], char *const envp[])
return spawnve (_P_OVERLAY, path, argv, envp);
}
extern "C" int _execve (const char *, char *const [], char *const [])
__attribute__ ((alias ("execve")));
extern "C" int
execl (const char *path, const char *arg0, ...)
{
@ -49,14 +54,14 @@ execl (const char *path, const char *arg0, ...)
while (argv[i++] != NULL);
va_end (args);
MALLOC_CHECK;
return _execve (path, (char * const *) argv, cur_environ ());
return execve (path, (char * const *) argv, cur_environ ());
}
extern "C" int
execv (const char *path, char * const *argv)
{
MALLOC_CHECK;
return _execve (path, (char * const *) argv, cur_environ ());
return execve (path, (char * const *) argv, cur_environ ());
}
extern "C" pid_t

View File

@ -20,7 +20,6 @@
#include <asm/byteorder.h>
#include <stdlib.h>
#include <unistd.h>
#define USE_SYS_TYPES_FD_SET
#include <winsock2.h>
#include "cygerrno.h"
@ -33,6 +32,7 @@
#include "cygheap.h"
#include "sigproc.h"
#include "wsock_event.h"
#include <unistd.h>
#define SECRET_EVENT_NAME "cygwin.local_socket.secret.%d.%08x-%08x-%08x-%08x"
#define ENTROPY_SOURCE_NAME "/dev/urandom"
@ -61,7 +61,7 @@ get_inet_addr (const struct sockaddr *in, int inlen,
}
else if (in->sa_family == AF_LOCAL)
{
int fd = _open (in->sa_data, O_RDONLY);
int fd = open (in->sa_data, O_RDONLY);
if (fd == -1)
return 0;
@ -81,7 +81,7 @@ get_inet_addr (const struct sockaddr *in, int inlen,
*outlen = sizeof sin;
ret = 1;
}
_close (fd);
close (fd);
return ret;
}
else
@ -354,9 +354,7 @@ fhandler_socket::bind (const struct sockaddr *name, int namelen)
/* bind must fail if file system socket object already exists
so _open () is called with O_EXCL flag. */
fd = _open (un_addr->sun_path,
O_WRONLY | O_CREAT | O_EXCL | O_BINARY,
0);
fd = ::open (un_addr->sun_path, O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0);
if (fd < 0)
{
if (get_errno () == EEXIST)
@ -372,17 +370,17 @@ fhandler_socket::bind (const struct sockaddr *name, int namelen)
len = strlen (buf) + 1;
/* Note that the terminating nul is written. */
if (_write (fd, buf, len) != len)
if (::write (fd, buf, len) != len)
{
save_errno here;
_close (fd);
_unlink (un_addr->sun_path);
::close (fd);
unlink (un_addr->sun_path);
}
else
{
_close (fd);
::close (fd);
chmod (un_addr->sun_path,
(S_IFSOCK | S_IRWXU | S_IRWXG | S_IRWXO) & ~cygheap->umask);
(S_IFSOCK | S_IRWXU | S_IRWXG | S_IRWXO) & ~cygheap->umask);
set_sun_path (un_addr->sun_path);
res = 0;
}

View File

@ -278,12 +278,12 @@ fork_child (HANDLE& hParent, dll *&first_dll, bool& load_dlls)
MALLOC_CHECK;
cygheap->fdtab.fixup_after_fork (hParent);
ProtectHandleINH (hParent);
if (fixup_mmaps_after_fork (hParent))
api_fatal ("recreate_mmaps_after_fork_failed");
cygheap->fdtab.fixup_after_fork (hParent);
ProtectHandleINH (hParent);
MALLOC_CHECK;
/* If we haven't dynamically loaded any dlls, just signal
@ -305,7 +305,6 @@ fork_child (HANDLE& hParent, dll *&first_dll, bool& load_dlls)
if (fixup_shms_after_fork ())
api_fatal ("recreate_shm areas after fork failed");
cygthread::init ();
pinfo_fixup_after_fork ();
signal_fixup_after_fork ();
@ -316,8 +315,8 @@ fork_child (HANDLE& hParent, dll *&first_dll, bool& load_dlls)
if ((*t)->clear_on_fork ())
(*t)->set ();
wait_for_sigthread ();
pthread::atforkchild ();
wait_for_sigthread ();
cygbench ("fork-child");
return 0;
}

View File

@ -86,7 +86,7 @@ heap_init ()
/* FIXME: This function no longer handles "split heaps". */
extern "C" void *
_sbrk (int n)
sbrk (int n)
{
sigframe thisframe (mainthread);
char *newtop, *newbrk;

View File

@ -1,6 +1,6 @@
/* version.h -- Cygwin version numbers and accompanying documentation.
Copyright 1996, 1997, 1998, 1999, 2000, 2001 Red Hat, Inc.
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
This file is part of Cygwin.

View File

@ -868,6 +868,13 @@ fhandler_disk_file::fixup_mmap_after_fork (HANDLE h, DWORD access, DWORD offset,
{
/* Re-create the MapViewOfFileEx call */
void *base = MapViewOfFileEx (h, access, 0, offset, size, address);
if (base != address)
{
MEMORY_BASIC_INFORMATION m;
(void) VirtualQuery (address, &m, sizeof (m));
system_printf ("requested %p != %p mem alloc base %p, state %p, size %d, %E",
address, base, m.AllocationBase, m.State, m.RegionSize);
}
return base == address;
}
@ -961,11 +968,7 @@ fixup_mmaps_after_fork (HANDLE parent)
rec->free_fh (fh);
if (!ret)
{
system_printf ("base address fails to match requested address %p",
rec->get_address ());
return -1;
}
return -1;
if (rec->get_access () == FILE_MAP_COPY)
{
for (char *address = rec->get_address ();

View File

@ -104,14 +104,14 @@ open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, shared_locat
if (!shared)
{
#ifdef DEBUGGING
if (wincap.is_winnt ())
system_printf ("relocating shared object %s(%d) on Windows NT", name, n);
#endif
/* Probably win95, so try without specifying the address. */
shared = (shared_info *) MapViewOfFileEx (shared_h,
FILE_MAP_READ|FILE_MAP_WRITE,
0, 0, 0, 0);
#ifdef DEBUGGING
if (wincap.is_winnt ())
system_printf ("relocating shared object %s(%d) from %p to %p on Windows NT", name, n, addr, shared);
#endif
}
if (!shared)

View File

@ -472,6 +472,7 @@ proc_terminate (void)
ForceCloseHandle1 (zombies[i]->hProcess, childhProc);
ForceCloseHandle1 (zombies[i]->pid_handle, pid_handle);
}
zombies[i]->ppid = 1;
zombies[i]->process_state = PID_EXITED; /* CGF FIXME - still needed? */
zombies[i].release (); // FIXME: this breaks older gccs for some reason
}
@ -561,6 +562,11 @@ sigproc_init ()
wait_sig_inited = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL);
ProtectHandle (wait_sig_inited);
/* sync_proc_subproc is used by proc_subproc. It serialises
* access to the children and zombie arrays.
*/
new_muto (sync_proc_subproc);
/* local event signaled when main thread has been dispatched
to a signal handler function. */
signal_arrived = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL);
@ -569,11 +575,6 @@ sigproc_init ()
hwait_sig = new cygthread (wait_sig, cygself, "sig");
hwait_sig->zap_h ();
/* sync_proc_subproc is used by proc_subproc. It serialises
* access to the children and zombie arrays.
*/
new_muto (sync_proc_subproc);
/* Initialize waitq structure for main thread. A waitq structure is
* allocated for each thread that executes a wait to allow multiple threads
* to perform waits. Pre-allocate a waitq structure for the main thread.
@ -598,6 +599,16 @@ sigproc_terminate (void)
{
hwait_sig = NULL;
if (!sig_loop_wait)
sigproc_printf ("sigproc_terminate: sigproc handling not active");
else
{
sigproc_printf ("entering");
sig_loop_wait = 0; // Tell wait_sig to exit when it is
// finished with anything it is doing
sig_dispatch_pending (1);
}
if (GetCurrentThreadId () == sigtid)
{
ForceCloseHandle (sigcomplete_main);
@ -610,22 +621,6 @@ sigproc_terminate (void)
}
proc_terminate (); // Terminate process handling thread
if (!sig_loop_wait)
sigproc_printf ("sigproc_terminate: sigproc handling not active");
else
{
sigproc_printf ("entering");
sig_loop_wait = 0; // Tell wait_sig to exit when it is
// finished with anything it is doing
sigproc_printf ("done");
}
#if 0
/* Set this so that subsequent tests will succeed. */
if (!myself->dwProcessId)
myself->dwProcessId = GetCurrentProcessId ();
#endif
return;
}

View File

@ -8,6 +8,12 @@ This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#define _close __FOO_close__
#define _lseek __FOO_lseek__
#define _open __FOO_open__
#define _read __FOO_read__
#define _write __FOO_write__
#include "winsup.h"
#include <sys/stat.h>
#include <sys/vfs.h> /* needed for statfs */
@ -40,6 +46,12 @@ details. */
#include <setjmp.h>
#include "perthread.h"
#undef _close
#undef _lseek
#undef _open
#undef _read
#undef _write
SYSTEM_INFO system_info;
/* Close all files and process any queued deletions.
@ -94,7 +106,7 @@ dup2 (int oldfd, int newfd)
}
extern "C" int
_unlink (const char *ourname)
unlink (const char *ourname)
{
int res = -1;
DWORD devn;
@ -248,7 +260,7 @@ remove (const char *ourname)
return -1;
}
return win32_name.isdir () ? rmdir (ourname) : _unlink (ourname);
return win32_name.isdir () ? rmdir (ourname) : unlink (ourname);
}
extern "C" pid_t
@ -325,7 +337,7 @@ getsid (pid_t pid)
}
extern "C" ssize_t
_read (int fd, void *ptr, size_t len)
read (int fd, void *ptr, size_t len)
{
const struct iovec iov =
{
@ -336,8 +348,11 @@ _read (int fd, void *ptr, size_t len)
return readv (fd, &iov, 1);
}
extern "C" ssize_t _read (int, void *, size_t)
__attribute__ ((alias ("read")));
extern "C" ssize_t
_write (int fd, const void *ptr, size_t len)
write (int fd, const void *ptr, size_t len)
{
const struct iovec iov =
{
@ -348,6 +363,9 @@ _write (int fd, const void *ptr, size_t len)
return writev (fd, &iov, 1);
}
extern "C" ssize_t _write (int fd, const void *ptr, size_t len)
__attribute__ ((alias ("write")));
extern "C" ssize_t
readv (int fd, const struct iovec *const iov, const int iovcnt)
{
@ -487,7 +505,7 @@ done:
/* newlib's fcntl.h defines _open as taking variable args so we must
correspond. The third arg if it exists is: mode_t mode. */
extern "C" int
_open (const char *unix_path, int flags, ...)
open (const char *unix_path, int flags, ...)
{
int res = -1;
va_list ap;
@ -525,6 +543,9 @@ _open (const char *unix_path, int flags, ...)
return res;
}
extern "C" int _open (const char *, int flags, ...)
__attribute__ ((alias ("open")));
extern "C" __off64_t
lseek64 (int fd, __off64_t pos, int dir)
{
@ -550,13 +571,16 @@ lseek64 (int fd, __off64_t pos, int dir)
}
extern "C" __off32_t
_lseek (int fd, __off32_t pos, int dir)
lseek (int fd, __off32_t pos, int dir)
{
return lseek64 (fd, (__off64_t) pos, dir);
}
extern "C" __off32_t _lseek (int, __off32_t, int)
__attribute__ ((alias ("lseek")));
extern "C" int
_close (int fd)
close (int fd)
{
int res;
sigframe thisframe (mainthread);
@ -578,6 +602,8 @@ _close (int fd)
return res;
}
extern "C" int _close (int) __attribute__ ((alias ("close")));
extern "C" int
isatty (int fd)
{
@ -601,7 +627,7 @@ isatty (int fd)
*/
extern "C" int
_link (const char *a, const char *b)
link (const char *a, const char *b)
{
int res = -1;
sigframe thisframe (mainthread);
@ -1231,7 +1257,7 @@ done:
}
extern "C" int
_rename (const char *oldpath, const char *newpath)
rename (const char *oldpath, const char *newpath)
{
sigframe thisframe (mainthread);
int res = 0;
@ -2490,16 +2516,16 @@ setutent ()
sigframe thisframe (mainthread);
if (utmp_fd == -2)
{
utmp_fd = _open (utmp_file, O_RDONLY);
utmp_fd = open (utmp_file, O_RDONLY);
}
_lseek (utmp_fd, 0, SEEK_SET);
lseek (utmp_fd, 0, SEEK_SET);
}
extern "C" void
endutent ()
{
sigframe thisframe (mainthread);
_close (utmp_fd);
close (utmp_fd);
utmp_fd = -2;
}
@ -2522,7 +2548,7 @@ getutent ()
sigframe thisframe (mainthread);
if (utmp_fd == -2)
setutent ();
if (_read (utmp_fd, &utmp_data, sizeof (utmp_data)) != sizeof (utmp_data))
if (read (utmp_fd, &utmp_data, sizeof (utmp_data)) != sizeof (utmp_data))
return NULL;
return &utmp_data;
}
@ -2533,7 +2559,7 @@ getutid (struct utmp *id)
sigframe thisframe (mainthread);
if (check_null_invalid_struct_errno (id))
return NULL;
while (_read (utmp_fd, &utmp_data, sizeof (utmp_data)) == sizeof (utmp_data))
while (read (utmp_fd, &utmp_data, sizeof (utmp_data)) == sizeof (utmp_data))
{
switch (id->ut_type)
{
@ -2566,7 +2592,7 @@ getutline (struct utmp *line)
sigframe thisframe (mainthread);
if (check_null_invalid_struct_errno (line))
return NULL;
while (_read (utmp_fd, &utmp_data, sizeof (utmp_data)) == sizeof (utmp_data))
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) &&

View File

@ -46,7 +46,7 @@ __to_clock_t (FILETIME * src, int flag)
/* times: POSIX 4.5.2.1 */
extern "C" clock_t
_times (struct tms * buf)
times (struct tms *buf)
{
FILETIME creation_time, exit_time, kernel_time, user_time;
@ -86,6 +86,8 @@ _times (struct tms * buf)
return tc;
}
extern "C" clock_t _times (struct tms *) __attribute__((alias ("times")));
/* settimeofday: BSD */
extern "C" int
settimeofday (const struct timeval *tv, const struct timezone *tz)
@ -168,11 +170,8 @@ gettimeofday (struct timeval *tv, struct timezone *tz)
return 0;
}
extern "C" int
_gettimeofday (struct timeval *p, struct timezone *z)
{
return gettimeofday (p, z);
}
extern "C" int _gettimeofday (struct timeval *, struct timezone *)
__attribute__((alias ("gettimeofday")));
/* Cygwin internal */
void
@ -266,8 +265,7 @@ time_as_timestruc_t (timestruc_t * out)
/* time: POSIX 4.5.1.1, C 4.12.2.4 */
/* Return number of seconds since 00:00 UTC on jan 1, 1970 */
extern "C"
time_t
extern "C" time_t
time (time_t * ptr)
{
time_t res;
@ -409,8 +407,7 @@ corelocaltime (const time_t * tim_p)
* localtime takes a time_t (which is in UTC)
* and formats it into a struct tm as a local time.
*/
extern "C"
struct tm *
extern "C" struct tm *
localtime (const time_t *tim_p)
{
time_t tim = *tim_p;
@ -434,8 +431,7 @@ localtime (const time_t *tim_p)
* gmtime takes a time_t (which is already in UTC)
* and just puts it into a struct tm.
*/
extern "C"
struct tm *
extern "C" struct tm *
gmtime (const time_t *tim_p)
{
time_t tim = *tim_p;
@ -452,8 +448,7 @@ gmtime (const time_t *tim_p)
#endif /* POSIX_LOCALTIME */
/* utimes: standards? */
extern "C"
int
extern "C" int
utimes (const char *path, struct timeval *tvp)
{
int res = 0;
@ -532,8 +527,7 @@ utimes (const char *path, struct timeval *tvp)
}
/* utime: POSIX 5.6.6.1 */
extern "C"
int
extern "C" int
utime (const char *path, struct utimbuf *buf)
{
struct timeval tmp[2];
@ -549,8 +543,7 @@ utime (const char *path, struct utimbuf *buf)
}
/* ftime: standards? */
extern "C"
int
extern "C" int
ftime (struct timeb *tp)
{
struct timeval tv;

View File

@ -21,7 +21,7 @@ details. */
extern "C"
pid_t
_wait (int *status)
wait (int *status)
{
return wait4 (-1, status, 0, NULL);
}