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.
This commit is contained in:
Roland McGrath 1996-02-27 00:55:03 +00:00
parent a182affdd9
commit 92777700d2
34 changed files with 597 additions and 195 deletions

View File

@ -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),

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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 $< $@

View File

@ -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;

View File

@ -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;

View File

@ -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>
/*
*/

7
libio/.cvsignore Normal file
View File

@ -0,0 +1,7 @@
*.gz *.Z *.tar *.tgz
=*
TODO COPYING* AUTHORS copyr-* copying.*
glibc-*
mpn-copy.mk
distinfo

View File

@ -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 */

View File

@ -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)();

View File

@ -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. */

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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);

23
sysdeps/stub/direntry.h Normal file
View File

@ -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. */
}

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -26,5 +26,5 @@ int
dirfd (dirp)
DIR *dirp;
{
return dirp->__fd;
return dirp->fd;
}

View File

@ -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 */

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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];
};

View File

@ -0,0 +1,3 @@
# File name Caller Syscall name # args Strong name Weak names
sigaction - sigaction 3 __sigaction sigaction

View File

@ -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;
}

View File

@ -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 */
@ -146,6 +158,15 @@ extern int unlink P((const char * filename));
#define remove unlink
#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.
*/

View File

@ -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

View File

@ -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;

View File

@ -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;
}