aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog80
-rw-r--r--config.h.in27
-rw-r--r--dirent/Makefile6
-rw-r--r--dirent/dirent.h52
-rw-r--r--dirent/scandir.c2
-rw-r--r--gmon/Makefile10
-rw-r--r--io/fts.c11
-rw-r--r--io/ftw.c15
-rw-r--r--libc-symbols.h18
-rw-r--r--libio/.cvsignore7
-rw-r--r--libio/cleanup.c2
-rw-r--r--libio/filedoalloc.c10
-rw-r--r--sysdeps/i386/memcmp.S8
-rw-r--r--sysdeps/mach/hurd/profil.c25
-rw-r--r--sysdeps/posix/getcwd.c17
-rw-r--r--sysdeps/posix/ttyname.c9
-rw-r--r--sysdeps/stub/direntry.h23
-rw-r--r--sysdeps/unix/bsd/bsd4.4/direntry.h33
-rw-r--r--sysdeps/unix/bsd/direntry.h29
-rw-r--r--sysdeps/unix/closedir.c8
-rw-r--r--sysdeps/unix/common/direntry.h29
-rw-r--r--sysdeps/unix/dirfd.c2
-rw-r--r--sysdeps/unix/dirstream.h21
-rw-r--r--sysdeps/unix/opendir.c28
-rw-r--r--sysdeps/unix/readdir.c84
-rw-r--r--sysdeps/unix/rewinddir.c10
-rw-r--r--sysdeps/unix/seekdir.c8
-rw-r--r--sysdeps/unix/sysv/direntry.h24
-rw-r--r--sysdeps/unix/sysv/sysv4/solaris2/syscalls.list3
-rw-r--r--sysdeps/unix/telldir.c23
-rw-r--r--time/private.h35
-rw-r--r--time/sys/time.h29
-rw-r--r--time/zdump.c26
-rw-r--r--time/zic.c78
34 files changed, 597 insertions, 195 deletions
diff --git a/ChangeLog b/ChangeLog
index 84599fc..e6f5808 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,83 @@
+Mon Feb 26 10:22:30 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
+
+ * sysdeps/unix/dirstream.h: Rewritten.
+ * sysdeps/unix/readdir.c: Rewritten.
+ * sysdeps/unix/telldir.c: Rewritten.
+ * sysdeps/unix/closedir.c: Use <...> instead of "..." for dirstream.h.
+ Remove __ from DIR struct member names.
+ * sysdeps/unix/dirfd.c: Likewise.
+ * sysdeps/unix/seekdir.c: Likewise.
+ * sysdeps/unix/rewinddir.c: Likewise.
+ * sysdeps/unix/opendir.c: Likewise. Don't allocate extra space after
+ DIR structure.
+ * sysdeps/stub/direct.h: File removed.
+ * sysdeps/unix/bsd/bsd4.4/direct.h: File removed.
+ * sysdeps/unix/bsd/direct.h: File removed.
+ * sysdeps/unix/common/direct.h: File removed.
+ * sysdeps/unix/sysv/irix4/direct.h: File removed.
+ * sysdeps/unix/sysv/isc3/direct.h: File removed.
+ * sysdeps/unix/sysv/sco3.2.4/direct.h: File removed.
+ * sysdeps/unix/sysv/sysv4/solaris2/direct.h: File removed.
+ * sysdeps/unix/common/direntry.h: New file.
+ * sysdeps/unix/bsd/direntry.h: New file.
+ * sysdeps/unix/bsd/bsd4.4/direntry.h: New file.
+ * sysdeps/unix/sysv/direntry.h: New file.
+ * sysdeps/stub/direntry.h: New file.
+ * dirent/dirent.h (struct dirent): Type removed. Include <direntry.h>
+ to define it.
+ (_D_EXACT_NAMLEN, _D_ALLOC_NAMLEN): New macros.
+ * dirent/Makefile (headers): Add direntry.h.
+ (distribute): Remove direct.h.
+ * sysdeps/posix/getcwd.c: Use new macros instead of d_namlen.
+ * dirent/scandir.c: Likewise.
+ * io/fts.c (fts_build): Likewise.
+ * io/ftw.c (ftw_dir): Likewise.
+ * sysdeps/posix/ttyname.c: Likewise.
+
+ * sysdeps/unix/sysv/sysv4/solaris2/syscalls.list: New file.
+
+ * sysdeps/mach/hurd/profil.c (MAX_PC_SAMPLES): New macro.
+ (collector_timeout): New static variable.
+ (update_waiter): Actually call __task_enable_pc_sampling.
+ Set collector_timeout based on the `tick' count returned.
+ (profile_waiter): Use MAX_PC_SAMPLES. Set nsamples before RPC.
+ Use collector_timeout in __mach_msg call.
+
+ * gmon/Makefile (noprof): New variable containing mcount.
+ Append profil unless it is in $(unix-syscalls).
+ (mcount.po): Use $(noprof) for list of targets in this rule.
+
+ * libc-symbols.h: Define _LIBC before #include <config.h>.
+
+Sun Feb 25 12:29:23 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
+
+ * config.h.in [_LIBC] (HAVE_STRERROR): Define it.
+ Protect 2nd page of #undef's for generator programs with #ifndef _LIBC.
+
+ * time/zic.c, time/zdump.c, time/private.h: Updated from ADO's latest.
+
+Fri Feb 9 12:40:19 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * libio/cleanup.c (_IO_cleanup_registration_needed)
+ [!_G_HAVE_ATEXIT]: Init to NULL.
+ * libio/filedoalloc.c (_IO_cleanup_registration_needed): Remove decl.
+
+Thu Feb 8 08:12:50 1996 Brendan Kehoe <brendan@cygnus.com>
+
+ * libio/filedoalloc.c (_IO_cleanup_registration_needed): Revert
+ previous change, since cleanup.c only defines it if _G_HAVE_ATEXIT.
+
+Wed Feb 7 15:10:17 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * libio/filedoalloc.c (_IO_cleanup_registration_needed): Declare as
+ extern.
+
+Sat Feb 24 11:34:13 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
+
+ * sysdeps/i386/memcmp.S: Fix argument %esp offsets.
+
+ * time/sys/time.h (timeradd, timersub): New macros; BSD has these.
+
Wed Feb 21 02:25:07 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* Rules (others): Depend on $(extra-objs), $(install-lib),
diff --git a/config.h.in b/config.h.in
index 485f861..52332be 100644
--- a/config.h.in
+++ b/config.h.in
@@ -34,12 +34,22 @@
/* Define to use GNU libio instead of GNU stdio.
This is defined by configure under --enable-libio. */
#undef USE_IN_LIBIO
-/* */
-/* These symbols might be defined by some sysdeps configures. */
+
+/*
+ */
+
+#ifndef _LIBC
+
+/* These symbols might be defined by some sysdeps configures.
+ They are used only in miscellaneous generator programs, not
+ in compiling libc itself. */
/* sysdeps/generic/configure.in */
#undef HAVE_PSIGNAL
+/* sysdeps/unix/configure.in */
+#undef HAVE_STRERROR
+
/* sysdeps/unix/common/configure.in */
#undef HAVE_SYS_SIGLIST
#undef HAVE__SYS_SIGLIST
@@ -49,3 +59,16 @@
#undef HAVE__CTYPE__
#undef HAVE__CTYPE
#undef HAVE__LOCP
+
+#endif
+
+/*
+ */
+
+#ifdef _LIBC
+
+/* The zic and zdump programs need these definitions. */
+
+#define HAVE_STRERROR 1
+
+#endif
diff --git a/dirent/Makefile b/dirent/Makefile
index 532020d..b6a4219 100644
--- a/dirent/Makefile
+++ b/dirent/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+# Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -21,11 +21,11 @@
#
subdir := dirent
-headers := dirent.h
+headers := dirent.h direntry.h
routines := opendir closedir readdir rewinddir \
seekdir telldir scandir alphasort \
getdents dirfd
-distribute := direct.h dirstream.h
+distribute := dirstream.h
tests := list tst-seekdir
diff --git a/dirent/dirent.h b/dirent/dirent.h
index 5b99437..d93a146 100644
--- a/dirent/dirent.h
+++ b/dirent/dirent.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -29,30 +29,48 @@ __BEGIN_DECLS
#include <gnu/types.h>
+/* This file defines `struct dirent'.
-/* Directory entry structure.
+ It defines the macro `_DIRENT_HAVE_D_NAMLEN' iff there is a `d_namlen'
+ member that gives the length of `d_name'.
- This structure is laid out identically to the `struct direct' that
- represents directory entries in the GNU Hurd and in BSD 4.4 (and
- incidentally, on disk in the Berkeley fast file system). The `readdir'
- implementations for GNU and BSD know this; you must change them if you
- change this structure. */
+ It defines the macro `_DIRENT_HAVE_D_RECLEN' iff there is a `d_reclen'
+ member that gives the size of the entire directory entry. */
-struct dirent
- {
- __ino_t d_fileno; /* File serial number. */
- unsigned short int d_reclen; /* Length of the whole `struct dirent'. */
- unsigned char d_type; /* File type, possibly unknown. */
- unsigned char d_namlen; /* Length of the file name. */
-
- /* Only this member is in the POSIX standard. */
- char d_name[1]; /* File name (actually longer). */
- };
+#include <direntry.h>
#if defined(__USE_BSD) || defined(__USE_MISC)
#define d_ino d_fileno /* Backward compatibility. */
#endif
+/* These macros extract size information from a `struct dirent *'.
+ They may evaluate their argument multiple times, so it must not
+ have side effects. Each of these may involve a relatively costly
+ call to `strlen' on some systems, so these values should be cached.
+
+ _D_EXACT_NAMLEN (DP) returns the length of DP->d_name, not including
+ its terminating null character.
+
+ _D_ALLOC_NAMLEN (DP) returns a size at least (_D_EXACT_NAMLEN (DP) + 1);
+ that is, the allocation size needed to hold the DP->d_name string.
+ Use this macro when you don't need the exact length, just an upper bound.
+ This macro is less likely to require calling `strlen' than _D_EXACT_NAMLEN.
+ */
+
+#ifdef _DIRENT_HAVE_D_NAMLEN
+#define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
+#define _D_ALLOC_NAMLEN(d) (_D_EXACT_NAMLEN (d) + 1)
+#else
+#define _D_EXACT_NAMLEN(d) (strlen ((d)->d_name))
+#ifdef _DIRENT_HAVE_D_RECLEN
+#define _D_ALLOC_NAMLEN(d) (((char *) (d) + (d)->d_reclen) - &(d)->d_name[0])
+#else
+#define _D_ALLOC_NAMLEN(d) (sizeof (d)->d_name > 1 ? sizeof (d)->d_name : \
+ _D_EXACT_NAMLEN (d) + 1)
+#endif
+#endif
+
+
#ifdef __USE_BSD
/* File types for `d_type'. */
enum
diff --git a/dirent/scandir.c b/dirent/scandir.c
index e2ef63a..6907f08 100644
--- a/dirent/scandir.c
+++ b/dirent/scandir.c
@@ -64,7 +64,7 @@ DEFUN(scandir, (dir, namelist, select, cmp),
v = new;
}
- dsize = &d->d_name[d->d_namlen + 1] - (char *) d;
+ dsize = &d->d_name[_D_ALLOC_NAMLEN (d)] - (char *) d;
v[i] = (struct dirent *) malloc (dsize);
if (v[i] == NULL)
goto lose;
diff --git a/gmon/Makefile b/gmon/Makefile
index 2a5bb5f..3c6f85d 100644
--- a/gmon/Makefile
+++ b/gmon/Makefile
@@ -32,6 +32,14 @@ CFLAGS-mcount.c := -fno-omit-frame-pointer
# We cannot compile mcount.c with -pg because that would
# create resursive calls. Just copy the normal static object.
-$(objpfx)mcount.po: $(objpfx)mcount.o
+# On systems where `profil' is not a system call, the same
+# problem exists for the internal functions in profil.c.
+
+noprof := mcount
+ifeq (,$(filter profil,$(unix-syscalls)))
+noprof += profil
+endif
+
+$(noprof:%=$(objpfx)%.po): %.po: %.o
rm -f $@
ln $< $@
diff --git a/io/fts.c b/io/fts.c
index 5bc1aff..fe5750a 100644
--- a/io/fts.c
+++ b/io/fts.c
@@ -661,13 +661,16 @@ fts_build(sp, type)
/* Read the directory, attaching each entry to the `link' pointer. */
adjaddr = NULL;
for (head = tail = NULL, nitems = 0; dp = readdir(dirp);) {
+ int namlen;
+
if (!ISSET(FTS_SEEDOT) && ISDOT(dp->d_name))
continue;
- if ((p = fts_alloc(sp, dp->d_name, (int)dp->d_namlen)) == NULL)
+ namlen = _D_EXACT_NAMLEN (dp);
+ if ((p = fts_alloc(sp, dp->d_name, namlen)) == NULL)
goto mem1;
- if (dp->d_namlen > maxlen) {
- if (fts_palloc(sp, (size_t)dp->d_namlen)) {
+ if (namlen > maxlen) {
+ if (fts_palloc(sp, (size_t)namlen)) {
/*
* No more memory for path or structures. Save
* errno, free up the current structure and the
@@ -687,7 +690,7 @@ mem1: saved_errno = errno;
maxlen = sp->fts_pathlen - sp->fts_cur->fts_pathlen - 1;
}
- p->fts_pathlen = len + dp->d_namlen + 1;
+ p->fts_pathlen = len + namlen + 1;
p->fts_parent = sp->fts_cur;
p->fts_level = level;
diff --git a/io/ftw.c b/io/ftw.c
index 7b264e0..ff2e2b1 100644
--- a/io/ftw.c
+++ b/io/ftw.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ian Lance Taylor (ian@airs.com).
@@ -53,18 +53,21 @@ DEFUN (ftw_dir, (dirs, level, descriptors, dir, len, func),
{
struct stat s;
int flag, retval, newlev;
+ size_t namlen;
++got;
if (entry->d_name[0] == '.'
- && (entry->d_namlen == 1 ||
- (entry->d_namlen == 2 && entry->d_name[1] == '.')))
+ && (entry->d_name[1] == '\0' ||
+ (entry->d_name[1] == '.' && entry->d_name[2] == '\0')))
{
errno = 0;
continue;
}
- if (entry->d_namlen + len + 1 > PATH_MAX)
+ namlen = _D_EXACT_NAMLEN (entry);
+
+ if (namlen + len + 1 > PATH_MAX)
{
#ifdef ENAMETOOLONG
errno = ENAMETOOLONG;
@@ -76,7 +79,7 @@ DEFUN (ftw_dir, (dirs, level, descriptors, dir, len, func),
dir[len] = '/';
memcpy ((PTR) (dir + len + 1), (PTR) entry->d_name,
- entry->d_namlen + 1);
+ namlen + 1);
if (stat (dir, &s) < 0)
{
@@ -110,7 +113,7 @@ DEFUN (ftw_dir, (dirs, level, descriptors, dir, len, func),
{
if (retval == 0)
retval = ftw_dir (dirs, newlev, descriptors, dir,
- entry->d_namlen + len + 1, func);
+ namlen + len + 1, func);
if (dirs[newlev] != NULL)
{
int save;
diff --git a/libc-symbols.h b/libc-symbols.h
index 9d6c2f8..bd3bb9a 100644
--- a/libc-symbols.h
+++ b/libc-symbols.h
@@ -1,6 +1,6 @@
/* Support macros for making weak and strong aliases for symbols,
and for using symbol sets and linker warnings with GNU ld.
-Copyright (C) 1995 Free Software Foundation, Inc.
+Copyright (C) 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -37,15 +37,17 @@ Cambridge, MA 02139, USA. */
linker being used. Set by --with-weak-symbols.
*/
-#include <config.h>
-/* This is defined for the compilation of all C library code.
- features.h tests this to avoid inclusion of stubs.h while
- compiling the library, before stubs.h has been generated.
- Some library code that is shared with other packages also
- tests this symbol to see if it is being compiled as part
- of the C library. */
+/* This is defined for the compilation of all C library code. features.h
+ tests this to avoid inclusion of stubs.h while compiling the library,
+ before stubs.h has been generated. Some library code that is shared
+ with other packages also tests this symbol to see if it is being
+ compiled as part of the C library. We must define this before including
+ config.h, because it makes some definitions conditional on whether libc
+ itself is being compiled, or just some generator program. */
#define _LIBC 1
+
+#include <config.h>
/*
*/
diff --git a/libio/.cvsignore b/libio/.cvsignore
new file mode 100644
index 0000000..b699a6e
--- /dev/null
+++ b/libio/.cvsignore
@@ -0,0 +1,7 @@
+*.gz *.Z *.tar *.tgz
+=*
+TODO COPYING* AUTHORS copyr-* copying.*
+glibc-*
+
+mpn-copy.mk
+distinfo
diff --git a/libio/cleanup.c b/libio/cleanup.c
index b4c8be9..a0c5052 100644
--- a/libio/cleanup.c
+++ b/libio/cleanup.c
@@ -12,4 +12,6 @@ DEFUN_VOID(_IO_register_cleanup)
}
void (*_IO_cleanup_registration_needed)() = _IO_register_cleanup;
+#else
+void (*_IO_cleanup_registration_needed)() = NULL;
#endif /* _G_HAVE_ATEXIT */
diff --git a/libio/filedoalloc.c b/libio/filedoalloc.c
index 8ab1738..0ebb75d 100644
--- a/libio/filedoalloc.c
+++ b/libio/filedoalloc.c
@@ -49,12 +49,6 @@ the executable file might be covered by the GNU General Public License. */
#include <stdlib.h>
#endif
-/* If this function pointer is non-zero, we should call it.
- It's supposed to make sure _IO_cleanup gets called on exit.
- We call it from _IO_file_doallocate, since that is likely
- to get called by any program that does buffered I/O. */
-void (*_IO_cleanup_registration_needed)();
-
/*
* Allocate a file buffer, or switch to unbuffered I/O.
* Per the ANSI C standard, ALL tty devices default to line buffered.
@@ -72,6 +66,10 @@ DEFUN(_IO_file_doallocate, (fp),
register char *p;
struct stat st;
+ /* If _IO_cleanup_registration_needed is non-zero, we should call the
+ function it points to. This is to make sure _IO_cleanup gets called
+ on exit. We call it from _IO_file_doallocate, since that is likely
+ to get called by any program that does buffered I/O. */
if (_IO_cleanup_registration_needed)
(*_IO_cleanup_registration_needed)();
diff --git a/sysdeps/i386/memcmp.S b/sysdeps/i386/memcmp.S
index f16b44a..3917a32 100644
--- a/sysdeps/i386/memcmp.S
+++ b/sysdeps/i386/memcmp.S
@@ -1,6 +1,6 @@
/* memcmp -- compare two memory blocks for differences in the first COUNT
bytes.
-Copyright (C) 1995 Free Software Foundation, Inc.
+Copyright (C) 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -34,9 +34,9 @@ ENTRY (memcmp)
movl %edi, %edx /* Note that %edx is not used and can
so be used to save %edi. It's faster. */
- movl 12(%esp), %esi /* Load address of block #1. */
- movl 16(%esp), %edi /* Load address of block #2. */
- movl 20(%esp), %ecx /* Load maximal length of compare area. */
+ movl 8(%esp), %esi /* Load address of block #1. */
+ movl 12(%esp), %edi /* Load address of block #2. */
+ movl 16(%esp), %ecx /* Load maximal length of compare area. */
cld /* Set direction of comparison. */
diff --git a/sysdeps/mach/hurd/profil.c b/sysdeps/mach/hurd/profil.c
index 43456ec..431982e 100644
--- a/sysdeps/mach/hurd/profil.c
+++ b/sysdeps/mach/hurd/profil.c
@@ -1,5 +1,5 @@
/* Low-level statistical profiling support function. Mach/Hurd version.
-Copyright (C) 1995 Free Software Foundation, Inc.
+Copyright (C) 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -26,6 +26,8 @@ Cambridge, MA 02139, USA. */
#include <cthreads.h>
#include <assert.h>
+#define MAX_PC_SAMPLES 512 /* XXX ought to be exported in kernel hdr */
+
static thread_t profile_thread = MACH_PORT_NULL;
static u_short *samples;
static size_t maxsamples;
@@ -33,6 +35,7 @@ static size_t pc_offset;
static size_t sample_scale;
static sampled_pc_seqno_t seqno;
static struct mutex lock = MUTEX_INITIALIZER;
+static mach_msg_timeout_t collector_timeout; /* ms between collections. */
/* Enable statistical profiling, writing samples of the PC into at most
SIZE bytes of SAMPLE_BUFFER; every processor clock tick while profiling
@@ -59,7 +62,12 @@ update_waiter (u_short *sample_buffer, size_t size, size_t offset, u_int scale)
if (! err)
{
- if (sample_scale == 0)
+ int tick; /* Microseconds per sample. */
+ err = __task_enable_pc_sampling (__mach_task_self (), &tick,
+ SAMPLED_PC_PERIODIC);
+ if (!err && sample_scale == 0)
+ /* Profiling was not turned on, so the collector thread was
+ suspended. Resume it. */
err = __thread_resume (profile_thread);
if (! err)
{
@@ -67,6 +75,11 @@ update_waiter (u_short *sample_buffer, size_t size, size_t offset, u_int scale)
maxsamples = size / sizeof *sample_buffer;
pc_offset = offset;
sample_scale = scale;
+ /* Calculate a good period for the collector thread. From TICK
+ and the kernel buffer size we get the length of time it takes
+ to fill the buffer; translate that to milliseconds for
+ mach_msg, and chop it in half for general lag factor. */
+ collector_timeout = MAX_PC_SAMPLES * tick / 1000 / 2;
}
}
@@ -100,17 +113,17 @@ profil (u_short *sample_buffer, size_t size, size_t offset, u_int scale)
static void
profile_waiter (void)
{
- sampled_pc_t pc_samples[512];
- mach_msg_type_number_t nsamples = 512, i;
+ sampled_pc_t pc_samples[MAX_PC_SAMPLES];
+ mach_msg_type_number_t nsamples, i;
mach_port_t rcv = __mach_reply_port ();
mach_msg_header_t msg;
- const mach_msg_timeout_t timeout = 17; /* ??? XXX */
error_t err;
while (1)
{
__mutex_lock (&lock);
+ nsamples = sizeof pc_samples / sizeof pc_samples[0];
err = __task_get_sampled_pcs (__mach_task_self (), &seqno,
pc_samples, &nsamples);
assert_perror (err);
@@ -130,7 +143,7 @@ profile_waiter (void)
__mutex_unlock (&lock);
__mach_msg (&msg, MACH_RCV_MSG|MACH_RCV_TIMEOUT, 0, sizeof msg,
- rcv, timeout, MACH_PORT_NULL);
+ rcv, collector_timeout, MACH_PORT_NULL);
}
}
diff --git a/sysdeps/posix/getcwd.c b/sysdeps/posix/getcwd.c
index 4bebece..af858a2 100644
--- a/sysdeps/posix/getcwd.c
+++ b/sysdeps/posix/getcwd.c
@@ -292,16 +292,15 @@ __getcwd (buf, size)
while ((d = readdir (dirstream)) != NULL)
{
if (d->d_name[0] == '.' &&
- (d->d_namlen == 1 || (d->d_namlen == 2 && d->d_name[1] == '.')))
+ (d->d_name[1] == '\0' ||
+ (d->d_name[1] == '.' && d->d_name[2] == '\0')))
continue;
if (mount_point || d->d_ino == thisino)
{
- char *name = __alloca (dotlist + dotsize - dotp +
- 1 + d->d_namlen + 1);
+ char name[dotlist + dotsize - dotp + 1 + _D_ALLOC_NAMLEN (d)];
memcpy (name, dotp, dotlist + dotsize - dotp);
name[dotlist + dotsize - dotp] = '/';
- memcpy (&name[dotlist + dotsize - dotp + 1],
- d->d_name, d->d_namlen + 1);
+ strcpy (&name[dotlist + dotsize - dotp + 1], d->d_name);
if (__lstat (name, &st) < 0)
{
int save = errno;
@@ -322,7 +321,9 @@ __getcwd (buf, size)
}
else
{
- if (pathp - path < d->d_namlen + 1)
+ size_t namlen = _D_EXACT_NAMLEN (d);
+
+ if (pathp - path < namlen)
{
if (buf != NULL)
{
@@ -344,8 +345,8 @@ __getcwd (buf, size)
path = buf;
}
}
- pathp -= d->d_namlen;
- (void) memcpy (pathp, d->d_name, d->d_namlen);
+ pathp -= namlen;
+ (void) memcpy (pathp, d->d_name, namlen);
*--pathp = '/';
(void) closedir (dirstream);
}
diff --git a/sysdeps/posix/ttyname.c b/sysdeps/posix/ttyname.c
index 50e3c79..b0650b3 100644
--- a/sysdeps/posix/ttyname.c
+++ b/sysdeps/posix/ttyname.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1993, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -56,17 +56,18 @@ DEFUN(ttyname, (fd), int fd)
while ((d = readdir (dirstream)) != NULL)
if (d->d_fileno == myino)
{
- if (sizeof (dev) + d->d_namlen + 1 > namelen)
+ size_t dlen = _D_ALLOC_NAMLEN (d);
+ if (sizeof (dev) + dlen > namelen)
{
free (name);
- namelen = 2 * (sizeof (dev) + d->d_namlen + 1); /* Big enough. */
+ namelen = 2 * (sizeof (dev) + dlen); /* Big enough. */
name = malloc (namelen);
if (! name)
return NULL;
(void) memcpy (name, dev, sizeof (dev) - 1);
name[sizeof (dev) - 1] = '/';
}
- (void) memcpy (&name[sizeof (dev)], d->d_name, d->d_namlen + 1);
+ (void) memcpy (&name[sizeof (dev)], d->d_name, dlen);
if (stat (name, &st) == 0 && st.st_dev == mydev)
{
(void) closedir (dirstream);
diff --git a/sysdeps/stub/direntry.h b/sysdeps/stub/direntry.h
new file mode 100644
index 0000000..0bf5316
--- /dev/null
+++ b/sysdeps/stub/direntry.h
@@ -0,0 +1,23 @@
+/* Directory entry structure `struct dirent'. Stub version.
+Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+struct dirent
+ {
+ char d_name[1]; /* Variable length. */
+ }
diff --git a/sysdeps/unix/bsd/bsd4.4/direntry.h b/sysdeps/unix/bsd/bsd4.4/direntry.h
new file mode 100644
index 0000000..c221d55
--- /dev/null
+++ b/sysdeps/unix/bsd/bsd4.4/direntry.h
@@ -0,0 +1,33 @@
+/* Directory entry structure `struct dirent'. 4.4BSD version.
+Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+struct dirent
+ {
+ __ino_t d_fileno; /* File serial number. */
+ unsigned short int d_reclen; /* Length of the whole `struct dirent'. */
+ unsigned char d_type; /* File type, possibly unknown. */
+ unsigned char d_namlen; /* Length of the file name. */
+
+ /* Only this member is in the POSIX standard. */
+ char d_name[1]; /* File name (actually longer). */
+ };
+
+#define _DIRENT_HAVE_D_RECLEN 1
+#define _DIRENT_HAVE_D_NAMLEN 1
+#define _DIRENT_HAVE_D_TYPE 1
diff --git a/sysdeps/unix/bsd/direntry.h b/sysdeps/unix/bsd/direntry.h
new file mode 100644
index 0000000..eb55d57
--- /dev/null
+++ b/sysdeps/unix/bsd/direntry.h
@@ -0,0 +1,29 @@
+/* Directory entry structure `struct dirent'. 4.2BSD version.
+Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+struct dirent
+ {
+ unsigned int d_fileno; /* 32 bits. */
+ unsigned short int d_reclen; /* 16 bits. */
+ unsigned short int d_namlen; /* 16 bits. */
+ char d_name[0]; /* Variable length. */
+ };
+
+#define _DIRENT_HAVE_D_RECLEN 1
+#define _DIRENT_HAVE_D_NAMLEN 1
diff --git a/sysdeps/unix/closedir.c b/sysdeps/unix/closedir.c
index 5f1ac74..791eaad 100644
--- a/sysdeps/unix/closedir.c
+++ b/sysdeps/unix/closedir.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1993, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1993, 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -22,7 +22,7 @@ Cambridge, MA 02139, USA. */
#include <stdlib.h>
#include <dirent.h>
#include <unistd.h>
-#include "dirstream.h"
+#include <dirstream.h>
/* Close the directory stream DIRP.
Return 0 if successful, -1 if not. */
@@ -37,9 +37,9 @@ DEFUN(closedir, (dirp), DIR *dirp)
return -1;
}
- fd = dirp->__fd;
+ fd = dirp->fd;
- free ((PTR) dirp->__data);
+ free ((PTR) dirp->data);
free ((PTR) dirp);
return __close (fd);
diff --git a/sysdeps/unix/common/direntry.h b/sysdeps/unix/common/direntry.h
new file mode 100644
index 0000000..5decd56
--- /dev/null
+++ b/sysdeps/unix/common/direntry.h
@@ -0,0 +1,29 @@
+/* Directory entry structure `struct dirent'. SVR4/Linux version.
+Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+struct dirent
+ {
+ unsigned int d_fileno;
+ int d_off; /* Position in directory of following entry. */
+ unsigned short int d_reclen;
+ char d_name[0]; /* Variable length. */
+ };
+
+#define _DIRENT_HAVE_D_RECLEN 1
+#define _DIRENT_HAVE_D_OFF 1
diff --git a/sysdeps/unix/dirfd.c b/sysdeps/unix/dirfd.c
index 7733634..d02c12a 100644
--- a/sysdeps/unix/dirfd.c
+++ b/sysdeps/unix/dirfd.c
@@ -26,5 +26,5 @@ int
dirfd (dirp)
DIR *dirp;
{
- return dirp->__fd;
+ return dirp->fd;
}
diff --git a/sysdeps/unix/dirstream.h b/sysdeps/unix/dirstream.h
index 72fd67c..87e78b6 100644
--- a/sysdeps/unix/dirstream.h
+++ b/sysdeps/unix/dirstream.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -20,26 +20,25 @@ Cambridge, MA 02139, USA. */
#define _DIRSTREAM_H 1
-#define __need_size_t
-#include <stddef.h>
+#include <sys/types.h>
/* Directory stream type.
The miscellaneous Unix `readdir' implementations read directory data
- into a buffer and fill in a `struct dirent' copy in the `DIR' object. */
+ into a buffer and return `struct dirent *' pointers into it. */
struct __dirstream
{
- int __fd; /* File descriptor. */
+ int fd; /* File descriptor. */
- char *__data; /* Directory block. */
- size_t __allocation; /* Space allocated for the block. */
- size_t __offset; /* Current offset into the block. */
- size_t __size; /* Total valid data in the block. */
+ char *data; /* Directory block. */
+ size_t allocation; /* Space allocated for the block. */
+ size_t size; /* Total valid data in the block. */
+ size_t offset; /* Current offset into the block. */
- struct dirent __entry; /* Returned by `readdir'. */
+ off_t filepos; /* Position of next entry to read. */
};
-#define _DIR_dirfd(dirp) ((dirp)->__fd)
+#define _DIR_dirfd(dirp) ((dirp)->fd)
#endif /* dirstream.h */
diff --git a/sysdeps/unix/opendir.c b/sysdeps/unix/opendir.c
index 5cd6206..df20b9c 100644
--- a/sysdeps/unix/opendir.c
+++ b/sysdeps/unix/opendir.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -16,7 +16,6 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
-#include <ansidecl.h>
#include <errno.h>
#include <limits.h>
#include <stddef.h>
@@ -28,12 +27,11 @@ Cambridge, MA 02139, USA. */
#include <unistd.h>
#include <stdio.h>
-#include "direct.h" /* This file defines `struct direct'. */
-#include "dirstream.h"
+#include <dirstream.h>
/* Open a directory stream on NAME. */
DIR *
-DEFUN(opendir, (name), CONST char *name)
+opendir (const char *name)
{
DIR *dirp;
struct stat statbuf;
@@ -62,7 +60,7 @@ DEFUN(opendir, (name), CONST char *name)
goto lose;
}
- dirp = (DIR *) calloc (1, sizeof (DIR) + NAME_MAX); /* Zero-fill. */
+ dirp = (DIR *) calloc (1, sizeof (DIR)); /* Zero-fill. */
if (dirp == NULL)
lose:
{
@@ -73,24 +71,24 @@ DEFUN(opendir, (name), CONST char *name)
}
#ifdef _STATBUF_ST_BLKSIZE
- if (statbuf.st_blksize < sizeof (struct direct))
- dirp->__allocation = sizeof (struct direct);
+ if (statbuf.st_blksize < sizeof (struct dirent))
+ dirp->allocation = sizeof (struct dirent);
else
- dirp->__allocation = statbuf.st_blksize;
+ dirp->allocation = statbuf.st_blksize;
#else
- dirp->__allocation = (BUFSIZ < sizeof (struct direct) ?
- sizeof (struct direct) : BUFSIZ);
+ dirp->allocation = (BUFSIZ < sizeof (struct dirent) ?
+ sizeof (struct dirent) : BUFSIZ);
#endif
- dirp->__data = (char *) malloc (dirp->__allocation);
- if (dirp->__data == NULL)
+ dirp->data = (char *) malloc (dirp->allocation);
+ if (dirp->data == NULL)
{
int save = errno;
- free ((PTR) dirp);
+ free (dirp);
(void) __close (fd);
errno = save;
return NULL;
}
- dirp->__fd = fd;
+ dirp->fd = fd;
return dirp;
}
diff --git a/sysdeps/unix/readdir.c b/sysdeps/unix/readdir.c
index 1842948..84ac033 100644
--- a/sysdeps/unix/readdir.c
+++ b/sysdeps/unix/readdir.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -16,7 +16,6 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
-#include <ansidecl.h>
#include <errno.h>
#include <limits.h>
#include <stddef.h>
@@ -24,60 +23,77 @@ Cambridge, MA 02139, USA. */
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
+#include <assert.h>
-#include "direct.h" /* This file defines `struct direct'. */
-#include "dirstream.h"
-
-/* direct.h may have an alternate definition for this. */
-#ifndef D_RECLEN
-#define D_RECLEN(dp) ((dp)->d_reclen)
-#endif
+#include <dirstream.h>
/* Read a directory entry from DIRP. */
struct dirent *
-DEFUN(readdir, (dirp), DIR *dirp)
+readdir (DIR *dirp)
{
- if (dirp == NULL || dirp->__data == NULL)
+ struct dirent *dp;
+
+ if (dirp == NULL || dirp->data == NULL)
{
errno = EINVAL;
return NULL;
}
- while (1)
+ do
{
- struct direct *dp;
+ size_t reclen;
- if (dirp->__offset >= dirp->__size)
+ if (dirp->offset >= dirp->size)
{
/* We've emptied out our buffer. Refill it. */
+ size_t maxread;
off_t base;
- ssize_t bytes = __getdirentries (dirp->__fd, dirp->__data,
- dirp->__allocation, &base);
+ ssize_t bytes;
+
+ if (sizeof (dp->d_name) > 1)
+ /* Fixed-size struct; must read one at a time (see below). */
+ maxread = sizeof *dp;
+ else
+ maxread = dirp->allocation;
+
+ base = dirp->filepos;
+ bytes = __getdirentries (dirp->fd, dirp->data, maxread, &base);
if (bytes <= 0)
return NULL;
- dirp->__size = (size_t) bytes;
+ dirp->size = (size_t) bytes;
/* Reset the offset into the buffer. */
- dirp->__offset = 0;
+ dirp->offset = 0;
}
- dp = (struct direct *) &dirp->__data[dirp->__offset];
- dirp->__offset += D_RECLEN (dp);
+ dp = (struct dirent *) &dirp->data[dirp->offset];
- if (dp->d_ino != 0)
- {
- /* Not a deleted file. */
- register struct dirent *d = &dirp->__entry;
- register const char *p;
- d->d_fileno = (ino_t) dp->d_ino;
- /* On some systems the name length does not actually mean much.
- But we always use it as a maximum. */
- p = memchr ((PTR) dp->d_name, '\0', D_NAMLEN (dp) + 1);
- d->d_namlen = (p != NULL) ? p - dp->d_name : D_NAMLEN (dp);
- memcpy (d->d_name, dp->d_name, d->d_namlen + 1);
- return d;
- }
- }
+#ifdef _DIRENT_HAVE_D_RECLEN
+ reclen = dp->d_reclen;
+#else
+ /* The only version of `struct dirent' that lacks `d_reclen'
+ is fixed-size. */
+ assert (sizeof dp->d_name > 1);
+ reclen = sizeof *dp;
+ /* The name is not terminated if it is the largest possible size.
+ Clobber the following byte to ensure proper null termination. We
+ read jst one entry at a time above so we know that byte will not
+ be used later. */
+ dp->d_name[sizeof dp->d_name] = '\0';
+#endif
+
+ dirp->offset += reclen;
+
+#ifdef _DIRENT_HAVE_D_OFF
+ dirp->filepos = dp->d_off;
+#else
+ dirp->filepos += reclen;
+#endif
+
+ /* Skip deleted files. */
+ } while (dp->d_ino == 0);
+
+ return dp;
}
diff --git a/sysdeps/unix/rewinddir.c b/sysdeps/unix/rewinddir.c
index 7ad7bc1..791ecc1 100644
--- a/sysdeps/unix/rewinddir.c
+++ b/sysdeps/unix/rewinddir.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -21,13 +21,13 @@ Cambridge, MA 02139, USA. */
#include <dirent.h>
#include <sys/types.h>
#include <unistd.h>
-#include "dirstream.h"
+#include <dirstream.h>
/* Rewind DIRP to the beginning of the directory. */
void
DEFUN(rewinddir, (dirp), DIR *dirp)
{
- (void) lseek(dirp->__fd, (off_t) 0, SEEK_SET);
- dirp->__offset = 0;
- dirp->__size = 0;
+ (void) lseek(dirp->fd, (off_t) 0, SEEK_SET);
+ dirp->offset = 0;
+ dirp->size = 0;
}
diff --git a/sysdeps/unix/seekdir.c b/sysdeps/unix/seekdir.c
index 018f697..9ce332b 100644
--- a/sysdeps/unix/seekdir.c
+++ b/sysdeps/unix/seekdir.c
@@ -21,13 +21,13 @@ Cambridge, MA 02139, USA. */
#include <stddef.h>
#include <dirent.h>
#include <unistd.h>
-#include "dirstream.h"
+#include <dirstream.h>
/* Seek to position POS in DIRP. */
void
DEFUN(seekdir, (dirp, pos), DIR *dirp AND __off_t pos)
{
- (void) __lseek(dirp->__fd, pos, SEEK_SET);
- dirp->__size = 0;
- dirp->__offset = 0;
+ (void) __lseek(dirp->fd, pos, SEEK_SET);
+ dirp->size = 0;
+ dirp->offset = 0;
}
diff --git a/sysdeps/unix/sysv/direntry.h b/sysdeps/unix/sysv/direntry.h
new file mode 100644
index 0000000..5035f14
--- /dev/null
+++ b/sysdeps/unix/sysv/direntry.h
@@ -0,0 +1,24 @@
+/* Directory entry structure `struct dirent'. Old System V version.
+Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+struct dirent
+ {
+ unsigned short int d_fileno;
+ char d_name[14];
+ };
diff --git a/sysdeps/unix/sysv/sysv4/solaris2/syscalls.list b/sysdeps/unix/sysv/sysv4/solaris2/syscalls.list
new file mode 100644
index 0000000..5206363
--- /dev/null
+++ b/sysdeps/unix/sysv/sysv4/solaris2/syscalls.list
@@ -0,0 +1,3 @@
+# File name Caller Syscall name # args Strong name Weak names
+
+sigaction - sigaction 3 __sigaction sigaction
diff --git a/sysdeps/unix/telldir.c b/sysdeps/unix/telldir.c
index 2b611b0..d9b8d11 100644
--- a/sysdeps/unix/telldir.c
+++ b/sysdeps/unix/telldir.c
@@ -16,28 +16,13 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
-#include <ansidecl.h>
-#include <errno.h>
-#include <stddef.h>
#include <dirent.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include "dirstream.h"
+
+#include <dirstream.h>
/* Return the current position of DIRP. */
off_t
-DEFUN(telldir, (dirp), DIR *dirp)
+telldir (DIR *dirp)
{
- register off_t pos;
-
- if (dirp == NULL)
- {
- errno = EINVAL;
- return (off_t) -1;
- }
-
- pos = __lseek(dirp->__fd, (off_t) 0, SEEK_CUR);
- if (pos == (off_t) -1)
- return (off_t) -1;
- return pos + dirp->__size - dirp->__offset;
+ return dirp->filepos;
}
diff --git a/time/private.h b/time/private.h
index de70395..69fcca3 100644
--- a/time/private.h
+++ b/time/private.h
@@ -16,7 +16,7 @@
#ifndef lint
#ifndef NOID
-static char privatehid[] = "@(#)private.h 7.40";
+static char privatehid[] = "@(#)private.h 7.42";
#endif /* !defined NOID */
#endif /* !defined lint */
@@ -29,10 +29,18 @@ static char privatehid[] = "@(#)private.h 7.40";
#define HAVE_ADJTIME 1
#endif /* !defined HAVE_ADJTIME */
+#ifndef HAVE_GETTEXT
+#define HAVE_GETTEXT 0
+#endif /* !defined HAVE_GETTEXT */
+
#ifndef HAVE_SETTIMEOFDAY
#define HAVE_SETTIMEOFDAY 3
#endif /* !defined HAVE_SETTIMEOFDAY */
+#ifndef HAVE_STRERROR
+#define HAVE_STRERROR 0
+#endif /* !defined HAVE_STRERROR */
+
#ifndef HAVE_UNISTD_H
#define HAVE_UNISTD_H 1
#endif /* !defined HAVE_UNISTD_H */
@@ -57,6 +65,10 @@ static char privatehid[] = "@(#)private.h 7.40";
#include "time.h"
#include "stdlib.h"
+#if HAVE_GETTEXT - 0
+#include "libintl.h"
+#endif /* HAVE_GETTEXT - 0 */
+
#if HAVE_UNISTD_H - 0
#include "unistd.h" /* for F_OK and R_OK */
#endif /* HAVE_UNISTD_H - 0 */
@@ -147,6 +159,15 @@ extern int unlink P((const char * filename));
#endif /* !defined remove */
/*
+** Some ancient errno.h implementations don't declare errno.
+** But some newer errno.h implementations define it as a macro.
+** Fix the former without affecting the latter.
+*/
+#ifndef errno
+extern int errno;
+#endif /* !defined errno */
+
+/*
** Finally, some convenience items.
*/
@@ -203,12 +224,22 @@ extern int unlink P((const char * filename));
/*
** For the benefit of GNU folk...
+** `_(MSGID)' uses the current locale's message library string for MSGID.
+** The default is to use gettext if available, and use MSGID otherwise.
*/
#ifndef _
-#define _(x) x
+#if HAVE_GETTEXT - 0
+#define _(msgid) gettext(msgid)
+#else /* !(HAVE_GETTEXT - 0) */
+#define _(msgid) msgid
+#endif /* !(HAVE_GETTEXT - 0) */
#endif /* !defined _ */
+#ifndef TZ_DOMAIN
+#define TZ_DOMAIN "tz"
+#endif /* !defined TZ_DOMAIN */
+
/*
** UNIX was a registered trademark of UNIX System Laboratories in 1993.
*/
diff --git a/time/sys/time.h b/time/sys/time.h
index 7275561..d615b2e 100644
--- a/time/sys/time.h
+++ b/time/sys/time.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 96 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -135,11 +135,30 @@ extern int utimes __P ((__const char *__file, struct timeval __tvp[2]));
/* Convenience macros for operations on timevals.
NOTE: `timercmp' does not work for >= or <=. */
#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
-#define timercmp(tvp, uvp, CMP) \
- ((tvp)->tv_sec CMP (uvp)->tv_sec || \
- (tvp)->tv_sec == (uvp)->tv_sec && (tvp)->tv_usec CMP (uvp)->tv_usec)
#define timerclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0)
-
+#define timercmp(a, b, CMP) \
+ (((a)->tv_sec == (b)->tv_sec) ? \
+ ((a)->tv_usec CMP (b)->tv_usec) : \
+ ((a)->tv_sec CMP (b)->tv_sec))
+#define timeradd(a, b, result) \
+ do { \
+ (result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \
+ (result)->tv_usec = (a)->tv_usec + (b)->tv_usec; \
+ if ((result)->tv_usec >= 1000000) \
+ { \
+ ++(result)->tv_sec; \
+ (result)->tv_usec -= 1000000; \
+ } \
+ } while (0)
+#define timersub(a, b, result) \
+ do { \
+ (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
+ (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \
+ if ((result)->tv_usec < 0) { \
+ --(result)->tv_sec; \
+ (result)->tv_usec += 1000000; \
+ } \
+ } while (0)
__END_DECLS
diff --git a/time/zdump.c b/time/zdump.c
index 5169c20..f56e09d 100644
--- a/time/zdump.c
+++ b/time/zdump.c
@@ -1,6 +1,6 @@
#ifndef lint
#ifndef NOID
-static char elsieid[] = "@(#)zdump.c 7.22";
+static char elsieid[] = "@(#)zdump.c 7.23";
#endif /* !defined NOID */
#endif /* !defined lint */
@@ -68,6 +68,11 @@ static char elsieid[] = "@(#)zdump.c 7.22";
#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
#endif /* !defined isleap */
+#if HAVE_GETTEXT - 0
+#include "locale.h" /* for setlocale */
+#include "libintl.h"
+#endif /* HAVE_GETTEXT - 0 */
+
#ifndef GNUC_or_lint
#ifdef lint
#define GNUC_or_lint
@@ -90,12 +95,22 @@ static char elsieid[] = "@(#)zdump.c 7.22";
/*
** For the benefit of GNU folk...
+** `_(MSGID)' uses the current locale's message library string for MSGID.
+** The default is to use gettext if available, and use MSGID otherwise.
*/
#ifndef _
-#define _(x) x
+#if HAVE_GETTEXT - 0
+#define _(msgid) gettext(msgid)
+#else /* !(HAVE_GETTEXT - 0) */
+#define _(msgid) msgid
+#endif /* !(HAVE_GETTEXT - 0) */
#endif /* !defined _ */
+#ifndef TZ_DOMAIN
+#define TZ_DOMAIN "tz"
+#endif /* !defined TZ_DOMAIN */
+
extern char ** environ;
extern int getopt();
extern char * optarg;
@@ -130,6 +145,13 @@ char * argv[];
struct tm newtm;
INITIALIZE(cuttime);
+#if HAVE_GETTEXT - 0
+ (void) setlocale(LC_MESSAGES, "");
+#ifdef TZ_DOMAINDIR
+ (void) bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
+#endif /* defined(TEXTDOMAINDIR) */
+ (void) textdomain(TZ_DOMAIN);
+#endif /* HAVE_GETTEXT - 0 */
progname = argv[0];
vflag = 0;
cutoff = NULL;
diff --git a/time/zic.c b/time/zic.c
index c0ce5be..756b7eb 100644
--- a/time/zic.c
+++ b/time/zic.c
@@ -1,10 +1,11 @@
#ifndef lint
#ifndef NOID
-static char elsieid[] = "@(#)zic.c 7.60";
+static char elsieid[] = "@(#)zic.c 7.62";
#endif /* !defined NOID */
#endif /* !defined lint */
#include "private.h"
+#include "locale.h"
#include "tzfile.h"
#ifdef unix
#include "sys/stat.h" /* for umask manifest constants */
@@ -135,6 +136,10 @@ static void usage P((void));
static void writezone P((const char * name));
static int yearistype P((int year, const char * type));
+#if !HAVE_STRERROR
+static char * strerror P((int));
+#endif /* !HAVE_STRERROR */
+
static int charcnt;
static int errors;
static const char * filename;
@@ -351,7 +356,9 @@ memcheck(ptr)
char * const ptr;
{
if (ptr == NULL) {
- (void) perror(progname);
+ const char *e = strerror(errno);
+ (void) fprintf(stderr, _("%s: Memory exhausted: %s\n"),
+ progname, e);
(void) exit(EXIT_FAILURE);
}
return ptr;
@@ -366,6 +373,20 @@ char * const ptr;
** Error handling.
*/
+#if ! HAVE_STRERROR
+static char *
+strerror(errnum)
+int errnum;
+{
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+
+ if (errnum > 0 && errnum <= sys_nerr)
+ return sys_errlist[errnum];
+ return "Unknown system error";
+}
+#endif /* ! HAVE_STRERROR */
+
static void
eats(name, num, rname, rnum)
const char * const name;
@@ -434,6 +455,13 @@ char * argv[];
#ifdef unix
(void) umask(umask(S_IWGRP | S_IWOTH) | (S_IWGRP | S_IWOTH));
#endif /* defined unix */
+#if HAVE_GETTEXT - 0
+ (void) setlocale(LC_MESSAGES, "");
+#ifdef TZ_DOMAINDIR
+ (void) bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
+#endif /* defined TEXTDOMAINDIR */
+ (void) textdomain(TZ_DOMAIN);
+#endif /* HAVE_GETTEXT - 0 */
progname = argv[0];
while ((c = getopt(argc, argv, "d:l:p:L:vsy:")) != EOF)
switch (c) {
@@ -567,9 +595,10 @@ const char * const tofile;
if (mkdirs(toname) != 0)
(void) exit(EXIT_FAILURE);
if (link(fromname, toname) != 0) {
- (void) fprintf(stderr, _("%s: Can't link from %s to "),
- progname, fromname);
- (void) perror(toname);
+ const char *e = strerror(errno);
+ (void) fprintf(stderr,
+ _("%s: Can't link from %s to %s: %s\n"),
+ progname, fromname, toname, e);
(void) exit(EXIT_FAILURE);
}
}
@@ -682,7 +711,8 @@ associate P((void))
** Maybe we have a local standard time offset.
*/
eat(zp->z_filename, zp->z_linenum);
- zp->z_stdoff = gethms(zp->z_rule, "unruly zone", TRUE);
+ zp->z_stdoff = gethms(zp->z_rule, _("unruly zone"),
+ TRUE);
/*
** Note, though, that if there's no rule,
** a '%s' in the format is a bad thing.
@@ -712,8 +742,9 @@ const char * name;
name = _("standard input");
fp = stdin;
} else if ((fp = fopen(name, "r")) == NULL) {
- (void) fprintf(stderr, _("%s: Can't open "), progname);
- (void) perror(name);
+ const char *e = strerror(errno);
+ (void) fprintf(stderr, _("%s: Can't open %s: %s\n"),
+ progname, name, e);
(void) exit(EXIT_FAILURE);
}
wantcont = FALSE;
@@ -774,13 +805,14 @@ _("%s: panic: Invalid l_value %d\n"),
ifree((char *) fields);
}
if (ferror(fp)) {
- (void) fprintf(stderr, _("%s: Error reading "), progname);
- (void) perror(filename);
+ (void) fprintf(stderr, _("%s: Error reading %s\n"),
+ progname, filename);
(void) exit(EXIT_FAILURE);
}
if (fp != stdin && fclose(fp)) {
- (void) fprintf(stderr, _("%s: Error closing "), progname);
- (void) perror(filename);
+ const char *e = strerror(errno);
+ (void) fprintf(stderr, _("%s: Error closing %s: %s\n"),
+ progname, filename, e);
(void) exit(EXIT_FAILURE);
}
if (wantcont)
@@ -1048,7 +1080,7 @@ const int nfields;
}
dayoff = oadd(dayoff, eitol(day - 1));
if (dayoff < 0 && !TYPE_SIGNED(time_t)) {
- error("time before zero");
+ error(_("time before zero"));
return;
}
t = (time_t) dayoff * SECSPERDAY;
@@ -1059,7 +1091,7 @@ const int nfields;
error(_("time overflow"));
return;
}
- tod = gethms(fields[LP_TIME], "invalid time of day", FALSE);
+ tod = gethms(fields[LP_TIME], _("invalid time of day"), FALSE);
cp = fields[LP_CORR];
{
register int positive;
@@ -1161,7 +1193,7 @@ const char * const timep;
break;
}
}
- rp->r_tod = gethms(dp, "invalid time of day", FALSE);
+ rp->r_tod = gethms(dp, _("invalid time of day"), FALSE);
ifree(dp);
/*
** Year work.
@@ -1303,9 +1335,9 @@ const char * const name;
if (mkdirs(fullname) != 0)
(void) exit(EXIT_FAILURE);
if ((fp = fopen(fullname, "wb")) == NULL) {
- (void) fprintf(stderr, _("%s: Can't create "),
- progname);
- (void) perror(fullname);
+ const char *e = strerror(errno);
+ (void) fprintf(stderr, _("%s: Can't create %s: %s\n"),
+ progname, fullname, e);
(void) exit(EXIT_FAILURE);
}
}
@@ -1369,8 +1401,8 @@ const char * const name;
for (i = 0; i < typecnt; ++i)
(void) putc(ttisgmts[i], fp);
if (ferror(fp) || fclose(fp)) {
- (void) fprintf(stderr, _("%s: Write error on "), progname);
- (void) perror(fullname);
+ (void) fprintf(stderr, _("%s: Error writing %s\n"),
+ progname, fullname);
(void) exit(EXIT_FAILURE);
}
}
@@ -1977,10 +2009,10 @@ char * const argname;
** It doesn't seem to exist, so we try to create it.
*/
if (mkdir(name, 0755) != 0) {
+ const char *e = strerror(errno);
(void) fprintf(stderr,
- _("%s: Can't create directory "),
- progname);
- (void) perror(name);
+ _("%s: Can't create directory %s: %s\n"),
+ progname, name, e);
ifree(name);
return -1;
}