Mercurial > hg > octave-lyh > gnulib-hg
changeset 5813:6962b5c5069f
Merge from coreutils.
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2005-05-01 Paul Eggert <eggert@cs.ucla.edu> + + * modules/getloadavg (Depends-on): Add unistd-safer. + * modules/getusershell (Depends-on): Add stdio-safer. + * modules/lstat (Depends-on): Remove xalloc. + * modules/mkstemp (Depends-on): Add stat-macros. + * modules/modechange (Depends-on): Remove xstrtol. + Add stat-macros, xalloc. + * modules/save-cwd (Depends-on): Add unistd-safer. + * modules/stdio-safer (Makefile.am): Remove lib_SOURCES. + * modules/unistd-safer (Files): Add lib/fd-safer.c + (Makefile.am): Remove lib_SOURCES. + + * MODULES.html.sh (Enhancements for POSIX:2001 functions): + Remove fcntl-safer; unistd-safer supersedes it. + 2005-05-01 Oskar Liljeblad <oskar@osk.mine.nu> * modules/getcwd (Depends-on): Add extensions.
--- a/MODULES.html.sh +++ b/MODULES.html.sh @@ -1774,7 +1774,6 @@ func_begin_table func_module dirname func_module getopt - func_module fcntl-safer func_module unistd-safer func_module fnmatch func_module fnmatch-posix
--- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,85 @@ +2005-05-01 Paul Eggert <eggert@cs.ucla.edu> + + Merge from coreutils. Among other things, + add bulletproofing for cases where stdin, stdout, or stderr are closed. + * fd-safer.c: New file. + * fcntl-safer.h, open-safer.c: Remove. + * chdir-long.c: Fix comment "fetish" -> "coreutils". + * dup-safer.c: Include unistd-safer.h first. + Don't include errno.h. + (dup_safer) [!defined F_DUPFD]: Let fd_safer do the real work. + * file-type.h: Don't assume invoker included sys/stat.h first. + * file-type.c: Rely on file-type.h change. + * getloadavg.c: Include unistd-safer.h. + (getloadavg): Use safer open. + * getusershell.c: Include "stdio-safer.h". + (getusershell): Use safer fopen. + * long-options.c (long_options): Use NULL rather than 0. + * modechange.h (mode_free): Remove; all callers changed to invoke + 'free'. + * modechange.c: Likewise. + xstrtol.h, stdbool.h, stddef.h: Don't include; no longer needed. + (MODE_DONE): New constant. + (struct mode_change): Remove 'next' member. + (make_node_op_equals): New function; like the old one of the + same name, except it allocates an array. + (mode_compile, mode_create_from_ref): Use it. + (mode_compile): Allocate result as an array, not a linked list. + Parse octal string ourself, so that we catch mistakes like "+0". + (mode_adjust): Arg is an array, not a linked list. + * modechange.c: Include stat-macros.h, xalloc.h. + (S_ISDIR, S_ISUID, S_ISGID, S_ISVTX, S_IRUSR, S_IWUSR, S_IXUSR): + (S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH, S_IRXWU): + (S_IRWXG, S_IRWXO, CHMOD_MODE_BITS): + Remove. This is now stat-macros.h's job. + (talloc): Remove. All callers replaced by xalloc, so that + our invokers don't have to worry about reporting memory failures. + (make_node_op_equals): Remove. + (MODE_ORDINARY_CHAGE, MODE_X_IF_ANY_X, MODE_COPY_EXISTING): + New constants. + (struct mode_change): Moved here from modechange.h. + (mode_append_entry): Remove. + (mode_compile): Remove MASKED_OPS arg, since it encouraged + apps to have incorrect behavior. Use simpler algorithm for head + and tail. Don't futz with umask; that's now the job of mode_adjust. + Detect more invalid usages rather than having somewhat-random behavior. + Don't insert an "a=" action, as that leads to incorrect behavior. + (mode_compile, mode_create_from_ref): Return NULL on error instead + of an enum, since now there's only one way to have an error. All + callers changed. + (mode_adjust): Accept new arg UMASK_VALUE, and interpret it + at the correct time. Simplify calculation of "+u" and its ilk. + Don't mishandle "+X". + (mode_free): Remove "register" and localize decls. + * modechange.h (MODE_X_IF_ANY_X, MODE_COPY_EXISTING): + (struct mode_change): Move to modechange.c; callers don't + need to see this stuff. + (MODE_MASK_EQUALS, MODE_MASK_PLUS, MODE_MASK_MINUS, MODE_MASK_ALL): + (MODE_INVALID, MODE_MEMORY_EXHAUSTED, MODE_BAD_REFERENCE): Remove. + (mode_change, mode_adjust): Reflect the new signatures noted above. + * nanosleep.c (rpl_nanosleep): Include "timespec.h" before macros + that might redefine system include files. + (siginterrupt) [!HAVE_SIGINTERRUPT]: New macro. + (my_usleep): Use NULL rather than (void *) 0. + (rpl_nanosleep) [!defined SA_NOCLDSTOP]: + Use siginterrupt to specify that system calls should be interrupted. + (rpl_nanosleep): Move initialization of suspended closer to call of + my_usleep. + * readutmp.h (read_utmp): New arg OPTIONS. All uses changed. + * readutmp.c: Likewise. Include signal.h, stdbool.h. + (desirable_utmp_entry): New function. + (read_utmp) [defined UTMP_NAME_FUNCTION]: Redo memory allocation + using x2nrealloc, to simplify logic. + (read_utmp) [!defined UTMP_NAME_FUNCTION]: Check for overflow in + size calculation. Do not assume utmp file is a regular file. + * readutmp.h (UT_PID): Moved here from ../src/who.c. + (READ_UTMP_CHECK_PIDS): New constant. + * save-cwd.c: Include unistd-safer.h. + (save_cwd): Use fd_safer. + * tempname.c (S_ISDIR, S_IRUSR, S_IRUSR, S_IWUSR, S_IXUSR): Remove. + [!_LIBC] Include "stat-macros.h" instead. + * unistd-safer.h (fd_safer): New decl. + 2005-05-01 Oskar Liljeblad <oskar@osk.mine.nu> * byteswap_.h: New file.
--- a/lib/chdir-long.c +++ b/lib/chdir-long.c @@ -269,6 +269,6 @@ /* Local Variables: -compile-command: "gcc -DTEST_CHDIR=1 -DHAVE_CONFIG_H -I.. -g -O -W -Wall chdir-long.c libfetish.a" +compile-command: "gcc -DTEST_CHDIR=1 -DHAVE_CONFIG_H -I.. -g -O -W -Wall chdir-long.c libcoreutils.a" End: */
--- a/lib/dup-safer.c +++ b/lib/dup-safer.c @@ -1,5 +1,5 @@ /* Invoke dup, but avoid some glitches. - Copyright (C) 2001, 2004 Free Software Foundation, Inc. + Copyright (C) 2001, 2004, 2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,7 +21,7 @@ # include <config.h> #endif -#include <errno.h> +#include "unistd-safer.h" #if HAVE_FCNTL_H # include <fcntl.h> @@ -34,8 +34,6 @@ # define STDERR_FILENO 2 #endif -#include <unistd-safer.h> - /* Like dup, but do not return STDIN_FILENO, STDOUT_FILENO, or STDERR_FILENO. */ @@ -45,15 +43,8 @@ #ifdef F_DUPFD return fcntl (fd, F_DUPFD, STDERR_FILENO + 1); #else - int f = dup (fd); - if (0 <= f && f <= STDERR_FILENO) - { - int f1 = dup_safer (f); - int e = errno; - close (f); - errno = e; - f = f1; - } - return f; + /* fd_safer calls us back, but eventually the recursion unwinds and + does the right thing. */ + return fd_safer (dup (fd)); #endif }
deleted file mode 100644 --- a/lib/fcntl-safer.h +++ /dev/null @@ -1,21 +0,0 @@ -/* Invoke fcntl functions, but avoid some glitches. - - Copyright (C) 2004 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Written by Paul Eggert. */ - -int open_safer (char const *, int, ...);
new file mode 100644 --- /dev/null +++ b/lib/fd-safer.c @@ -0,0 +1,61 @@ +/* Return a safer copy of a file descriptor. + + Copyright (C) 2005 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include "unistd-safer.h" + +#include <errno.h> + +#if HAVE_UNISTD_H +# include <unistd.h> +#endif +#ifndef STDIN_FILENO +# define STDIN_FILENO 0 +#endif +#ifndef STDERR_FILENO +# define STDERR_FILENO 2 +#endif + +/* Return FD, unless FD would be a copy of standard input, output, or + error; in that case, return a duplicate of FD, closing FD. On + failure to duplicate, close FD, set errno, and return -1. Preserve + errno if FD is negative, so that the caller can always inspect + errno when the returned value is negative. + + This function is usefully wrapped around functions that return file + descriptors, e.g., fd_safer (open ("file", O_RDONLY)). */ + +int +fd_safer (int fd) +{ + if (STDIN_FILENO <= fd && fd <= STDERR_FILENO) + { + int f = dup_safer (fd); + int e = errno; + close (fd); + errno = e; + fd = f; + } + + return fd; +}
--- a/lib/file-type.c +++ b/lib/file-type.c @@ -1,6 +1,7 @@ /* Return a string describing the type of a file. - Copyright (C) 1993, 1994, 2001, 2002, 2004 Free Software Foundation, Inc. + Copyright (C) 1993, 1994, 2001, 2002, 2004, 2005 Free Software + Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,9 +23,8 @@ # include <config.h> #endif -#include <sys/types.h> -#include <sys/stat.h> #include "file-type.h" + #include "stat-macros.h" #include <gettext.h>
--- a/lib/file-type.h +++ b/lib/file-type.h @@ -1,6 +1,7 @@ /* Return a string describing the type of a file. - Copyright (C) 1993, 1994, 2001, 2002, 2004 Free Software Foundation, Inc. + Copyright (C) 1993, 1994, 2001, 2002, 2004, 2005 Free Software + Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,6 +22,9 @@ #ifndef FILE_TYPE_H # define FILE_TYPE_H 1 +# include <sys/types.h> +# include <sys/stat.h> + char const *file_type (struct stat const *); #endif /* FILE_TYPE_H */
--- a/lib/getloadavg.c +++ b/lib/getloadavg.c @@ -452,6 +452,8 @@ # else # include <sys/file.h> # endif + +# include "unistd-safer.h" /* Avoid static vars inside a function since in HPUX they dump as pure. */ @@ -911,7 +913,7 @@ if (!getloadavg_initialized) { # ifndef SUNOS_5 - channel = open ("/dev/kmem", 0); + channel = fd_safer (open ("/dev/kmem", O_RDONLY)); if (channel >= 0) { /* Set the channel to close on exec, so it does not
--- a/lib/getusershell.c +++ b/lib/getusershell.c @@ -1,6 +1,6 @@ /* getusershell.c -- Return names of valid user shells. - Copyright (C) 1991, 1997, 2000, 2001, 2003, 2004 Free Software + Copyright (C) 1991, 1997, 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify @@ -37,6 +37,7 @@ #include <stdlib.h> #include <ctype.h> +#include "stdio-safer.h" #include "xalloc.h" #if USE_UNLOCKED_IO @@ -98,7 +99,7 @@ if (shellstream == NULL) { - shellstream = fopen (SHELLS_FILE, "r"); + shellstream = fopen_safer (SHELLS_FILE, "r"); if (shellstream == NULL) { /* No shells file. Use the default list. */
--- a/lib/long-options.c +++ b/lib/long-options.c @@ -1,6 +1,6 @@ /* Utility to accept --help and --version options as unobtrusively as possible. - Copyright (C) 1993, 1994, 1998, 1999, 2000, 2002, 2003, 2004 Free + Copyright (C) 1993, 1994, 1998, 1999, 2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify @@ -35,9 +35,9 @@ static struct option const long_options[] = { - {"help", no_argument, 0, 'h'}, - {"version", no_argument, 0, 'v'}, - {0, 0, 0, 0} + {"help", no_argument, NULL, 'h'}, + {"version", no_argument, NULL, 'v'}, + {NULL, 0, NULL, 0} }; /* Process long options --help and --version, but only if argc == 2.
--- a/lib/modechange.c +++ b/lib/modechange.c @@ -1,7 +1,7 @@ /* modechange.c -- file mode manipulation - Copyright (C) 1989, 1990, 1997, 1998, 1999, 2001, 2003, 2004 Free - Software Foundation, Inc. + Copyright (C) 1989, 1990, 1997, 1998, 1999, 2001, 2003, 2004, 2005 + Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,12 +19,12 @@ /* Written by David MacKenzie <djm@ai.mit.edu> */ -/* The ASCII mode string is compiled into a linked list of `struct +/* The ASCII mode string is compiled into an array of `struct modechange', which can then be applied to each file to be changed. We do this instead of re-parsing the ASCII string for each file because the compiled form requires less computation to use; when changing the mode of many files, this probably results in a - performance gain. */ + performance gain. */ #if HAVE_CONFIG_H # include <config.h> @@ -32,19 +32,10 @@ #include "modechange.h" #include <sys/stat.h> -#include "xstrtol.h" -#include <stdbool.h> -#include <stddef.h> +#include "stat-macros.h" +#include "xalloc.h" #include <stdlib.h> -#if STAT_MACROS_BROKEN -# undef S_ISDIR -#endif - -#if !defined(S_ISDIR) && defined(S_IFDIR) -# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -#endif - /* The traditional octal values corresponding to each mode bit. */ #define SUID 04000 #define SGID 02000 @@ -60,127 +51,78 @@ #define XOTH 00001 #define ALLM 07777 /* all octal mode bits */ -#ifndef S_ISUID -# define S_ISUID SUID -#endif -#ifndef S_ISGID -# define S_ISGID SGID -#endif -#ifndef S_ISVTX -# define S_ISVTX SVTX -#endif -#ifndef S_IRUSR -# define S_IRUSR RUSR -#endif -#ifndef S_IWUSR -# define S_IWUSR WUSR -#endif -#ifndef S_IXUSR -# define S_IXUSR XUSR -#endif -#ifndef S_IRGRP -# define S_IRGRP RGRP -#endif -#ifndef S_IWGRP -# define S_IWGRP WGRP -#endif -#ifndef S_IXGRP -# define S_IXGRP XGRP -#endif -#ifndef S_IROTH -# define S_IROTH ROTH -#endif -#ifndef S_IWOTH -# define S_IWOTH WOTH -#endif -#ifndef S_IXOTH -# define S_IXOTH XOTH -#endif -#ifndef S_IRWXU -# define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) -#endif -#ifndef S_IRWXG -# define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) -#endif -#ifndef S_IRWXO -# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) -#endif +/* Special operations flags. */ +enum + { + /* For the sentinel at the end of the mode changes array. */ + MODE_DONE, + + /* The typical case. */ + MODE_ORDINARY_CHANGE, + + /* In addition to the typical case, affect the execute bits if at + least one execute bit is set already, or if the file is a + directory. */ + MODE_X_IF_ANY_X, -/* All the mode bits that can be affected by chmod. */ -#define CHMOD_MODE_BITS \ - (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO) + /* Instead of the typical case, copy some existing permissions for + u, g, or o onto the other two. Which of u, g, or o is copied + is determined by which bits are set in the `value' field. */ + MODE_COPY_EXISTING + }; -/* Return newly allocated memory to hold one element of type TYPE. */ -#define talloc(type) ((type *) malloc (sizeof (type))) +/* Description of a mode change. */ +struct mode_change +{ + char op; /* One of "=+-". */ + char flag; /* Special operations flag. */ + mode_t affected; /* Set for u, g, o, or a. */ + mode_t value; /* Bits to add/remove. */ +}; -/* Create a mode_change entry with the specified `=ddd'-style - mode change operation, where NEW_MODE is `ddd'. Return the - new entry, or NULL upon failure. */ +/* Return a mode_change array with the specified `=ddd'-style + mode change operation, where NEW_MODE is `ddd'. */ static struct mode_change * make_node_op_equals (mode_t new_mode) { - struct mode_change *p; - p = talloc (struct mode_change); - if (p == NULL) - return p; - p->next = NULL; + struct mode_change *p = xmalloc (2 * sizeof *p); p->op = '='; - p->flags = 0; + p->flag = MODE_ORDINARY_CHANGE; + p->affected = CHMOD_MODE_BITS; p->value = new_mode; - p->affected = CHMOD_MODE_BITS; /* Affect all permissions. */ + p[1].flag = MODE_DONE; return p; } -/* Append entry E to the end of the link list with the specified - HEAD and TAIL. */ - -static void -mode_append_entry (struct mode_change **head, - struct mode_change **tail, - struct mode_change *e) -{ - if (*head == NULL) - *head = *tail = e; - else - { - (*tail)->next = e; - *tail = e; - } -} - -/* Return a linked list of file mode change operations created from +/* Return a pointer to an array of file mode change operations created from MODE_STRING, an ASCII string that contains either an octal number specifying an absolute mode, or symbolic mode change operations with the form: [ugoa...][[+-=][rwxXstugo...]...][,...] - MASKED_OPS is a bitmask indicating which symbolic mode operators (=+-) - should not affect bits set in the umask when no users are given. - Operators not selected in MASKED_OPS ignore the umask. - Return MODE_INVALID if `mode_string' does not contain a valid - representation of file mode change operations; - return MODE_MEMORY_EXHAUSTED if there is insufficient memory. */ + Return NULL if `mode_string' does not contain a valid + representation of file mode change operations. */ struct mode_change * -mode_compile (const char *mode_string, unsigned int masked_ops) +mode_compile (char const *mode_string) { - struct mode_change *head; /* First element of the linked list. */ - struct mode_change *tail; /* An element of the linked list. */ - unsigned long octal_value; /* The mode value, if octal. */ - mode_t umask_value; /* The umask value (surprise). */ + /* The array of mode-change directives to be returned. */ + struct mode_change *mc; + size_t used = 0; - head = NULL; -#ifdef lint - tail = NULL; -#endif + if ('0' <= *mode_string && *mode_string < '8') + { + mode_t mode; + unsigned int octal_value = 0; - if (xstrtoul (mode_string, NULL, 8, &octal_value, "") == LONGINT_OK) - { - struct mode_change *p; - mode_t mode; - if (octal_value != (octal_value & ALLM)) - return MODE_INVALID; + do + { + octal_value = 8 * octal_value + *mode_string++ - '0'; + if (ALLM < octal_value) + return NULL; + } + while ('0' <= *mode_string && *mode_string < '8'); /* Help the compiler optimize the usual case where mode_t uses the traditional octal representation. */ @@ -202,276 +144,207 @@ | (octal_value & WOTH ? S_IWOTH : 0) | (octal_value & XOTH ? S_IXOTH : 0))); - p = make_node_op_equals (mode); - if (p == NULL) - return MODE_MEMORY_EXHAUSTED; - mode_append_entry (&head, &tail, p); - return head; + return make_node_op_equals (mode); } - umask_value = umask (0); - umask (umask_value); /* Restore the old value. */ + /* Allocate enough space to hold the result. */ + { + size_t needed = 1; + char const *p; + for (p = mode_string; *p; p++) + needed += (*p == '=' || *p == '+' || *p == '-'); + mc = xnmalloc (needed, sizeof *mc); + } - /* One loop iteration for each "ugoa...=+-rwxXstugo...[=+-rwxXstugo...]". */ + /* One loop iteration for each `[ugoa]*([-+=]([rwxXst]*|[ugo]))+'. */ for (;; mode_string++) { - /* Which bits in the mode are operated on. */ - mode_t affected_bits = 0; - /* `affected_bits' modified by umask. */ - mode_t affected_masked; - /* Operators to actually use umask on. */ - unsigned int ops_to_mask = 0; + /* Which bits in the mode are operated on. */ + mode_t affected = 0; - bool who_specified_p; - - /* Turn on all the bits in `affected_bits' for each group given. */ + /* Turn on all the bits in `affected' for each group given. */ for (;; mode_string++) switch (*mode_string) { + default: + goto invalid; case 'u': - affected_bits |= S_ISUID | S_IRWXU; + affected |= S_ISUID | S_IRWXU; break; case 'g': - affected_bits |= S_ISGID | S_IRWXG; + affected |= S_ISGID | S_IRWXG; break; case 'o': - affected_bits |= S_ISVTX | S_IRWXO; + affected |= S_ISVTX | S_IRWXO; break; case 'a': - affected_bits |= CHMOD_MODE_BITS; + affected |= CHMOD_MODE_BITS; break; - default: + case '=': case '+': case '-': goto no_more_affected; } + no_more_affected:; - no_more_affected: - /* If none specified, affect all bits, except perhaps those - set in the umask. */ - if (affected_bits) - who_specified_p = true; - else + do { - who_specified_p = false; - affected_bits = CHMOD_MODE_BITS; - ops_to_mask = masked_ops; - } + char op = *mode_string++; + mode_t value; + char flag = MODE_COPY_EXISTING; + struct mode_change *change; - while (*mode_string == '=' || *mode_string == '+' || *mode_string == '-') - { - struct mode_change *change = talloc (struct mode_change); - if (change == NULL) + switch (*mode_string++) { - mode_free (head); - return MODE_MEMORY_EXHAUSTED; - } + case 'u': + /* Set the affected bits to the value of the `u' bits + on the same file. */ + value = S_IRWXU; + break; + case 'g': + /* Set the affected bits to the value of the `g' bits + on the same file. */ + value = S_IRWXG; + break; + case 'o': + /* Set the affected bits to the value of the `o' bits + on the same file. */ + value = S_IRWXO; + break; - change->next = NULL; - change->op = *mode_string; /* One of "=+-". */ - affected_masked = affected_bits; + default: + value = 0; + flag = MODE_ORDINARY_CHANGE; - /* Per the Single Unix Spec, if `who' is not specified and the - `=' operator is used, then clear all the bits first. */ - if (!who_specified_p && - ops_to_mask & (*mode_string == '=' ? MODE_MASK_EQUALS : 0)) - { - struct mode_change *p = make_node_op_equals (0); - if (p == NULL) - return MODE_MEMORY_EXHAUSTED; - mode_append_entry (&head, &tail, p); + for (mode_string--;; mode_string++) + switch (*mode_string) + { + case 'r': + value |= S_IRUSR | S_IRGRP | S_IROTH; + break; + case 'w': + value |= S_IWUSR | S_IWGRP | S_IWOTH; + break; + case 'x': + value |= S_IXUSR | S_IXGRP | S_IXOTH; + break; + case 'X': + flag = MODE_X_IF_ANY_X; + break; + case 's': + /* Set the setuid/gid bits if `u' or `g' is selected. */ + value |= S_ISUID | S_ISGID; + break; + case 't': + /* Set the "save text image" bit if `o' is selected. */ + value |= S_ISVTX; + break; + default: + goto no_more_values; + } + no_more_values:; } - if (ops_to_mask & (*mode_string == '=' ? MODE_MASK_EQUALS - : *mode_string == '+' ? MODE_MASK_PLUS - : MODE_MASK_MINUS)) - affected_masked &= ~umask_value; - change->affected = affected_masked; - change->value = 0; - change->flags = 0; - - /* Add the element to the tail of the list, so the operations - are performed in the correct order. */ - mode_append_entry (&head, &tail, change); - - /* Set `value' according to the bits set in `affected_masked'. */ - for (++mode_string;; ++mode_string) - switch (*mode_string) - { - case 'r': - change->value |= ((S_IRUSR | S_IRGRP | S_IROTH) - & affected_masked); - break; - case 'w': - change->value |= ((S_IWUSR | S_IWGRP | S_IWOTH) - & affected_masked); - break; - case 'X': - change->flags |= MODE_X_IF_ANY_X; - /* Fall through. */ - case 'x': - change->value |= ((S_IXUSR | S_IXGRP | S_IXOTH) - & affected_masked); - break; - case 's': - /* Set the setuid/gid bits if `u' or `g' is selected. */ - change->value |= (S_ISUID | S_ISGID) & affected_masked; - break; - case 't': - /* Set the "save text image" bit if `o' is selected. */ - change->value |= S_ISVTX & affected_masked; - break; - case 'u': - /* Set the affected bits to the value of the `u' bits - on the same file. */ - if (change->value) - goto invalid; - change->value = S_IRWXU; - change->flags |= MODE_COPY_EXISTING; - break; - case 'g': - /* Set the affected bits to the value of the `g' bits - on the same file. */ - if (change->value) - goto invalid; - change->value = S_IRWXG; - change->flags |= MODE_COPY_EXISTING; - break; - case 'o': - /* Set the affected bits to the value of the `o' bits - on the same file. */ - if (change->value) - goto invalid; - change->value = S_IRWXO; - change->flags |= MODE_COPY_EXISTING; - break; - default: - goto no_more_values; - } - no_more_values:; + change = &mc[used++]; + change->op = op; + change->flag = flag; + change->affected = affected; + change->value = value; } + while (*mode_string == '=' || *mode_string == '+' + || *mode_string == '-'); if (*mode_string != ',') break; } if (*mode_string == 0) - return head; + { + mc[used].flag = MODE_DONE; + return mc; + } + invalid: - mode_free (head); - return MODE_INVALID; + free (mc); + return NULL; } /* Return a file mode change operation that sets permissions to match those - of REF_FILE. Return MODE_BAD_REFERENCE if REF_FILE can't be accessed. */ + of REF_FILE. Return NULL (setting errno) if REF_FILE can't be accessed. */ struct mode_change * mode_create_from_ref (const char *ref_file) { - struct mode_change *change; /* the only change element */ struct stat ref_stats; - if (stat (ref_file, &ref_stats)) - return MODE_BAD_REFERENCE; - - change = talloc (struct mode_change); - - if (change == NULL) - return MODE_MEMORY_EXHAUSTED; - - change->op = '='; - change->flags = 0; - change->affected = CHMOD_MODE_BITS; - change->value = ref_stats.st_mode; - change->next = NULL; - - return change; + if (stat (ref_file, &ref_stats) != 0) + return NULL; + return make_node_op_equals (ref_stats.st_mode); } /* Return file mode OLDMODE, adjusted as indicated by the list of change - operations CHANGES. If OLDMODE is a directory, the type `X' + operations CHANGES, which are interpreted assuming the umask is + UMASK_VALUE. If OLDMODE is a directory, the type `X' change affects it even if no execute bits were set in OLDMODE. - The returned value has the S_IFMT bits cleared. */ + The returned value has the S_IFMT bits cleared. */ mode_t -mode_adjust (mode_t oldmode, const struct mode_change *changes) +mode_adjust (mode_t oldmode, struct mode_change const *changes, + mode_t umask_value) { - mode_t newmode; /* The adjusted mode and one operand. */ - mode_t value; /* The other operand. */ - - newmode = oldmode & CHMOD_MODE_BITS; + /* The adjusted mode. */ + mode_t newmode = oldmode & CHMOD_MODE_BITS; - for (; changes; changes = changes->next) + for (; changes->flag != MODE_DONE; changes++) { - if (changes->flags & MODE_COPY_EXISTING) + mode_t affected = changes->affected; + mode_t value = changes->value; + + switch (changes->flag) { - /* Isolate in `value' the bits in `newmode' to copy, given in - the mask `changes->value'. */ - value = newmode & changes->value; + case MODE_ORDINARY_CHANGE: + break; + + case MODE_COPY_EXISTING: + /* Isolate in `value' the bits in `newmode' to copy. */ + value &= newmode; - if (changes->value & S_IRWXU) - /* Copy `u' permissions onto `g' and `o'. */ - value |= ( (value & S_IRUSR ? S_IRGRP | S_IROTH : 0) - | (value & S_IWUSR ? S_IWGRP | S_IWOTH : 0) - | (value & S_IXUSR ? S_IXGRP | S_IXOTH : 0)); - else if (changes->value & S_IRWXG) - /* Copy `g' permissions onto `u' and `o'. */ - value |= ( (value & S_IRGRP ? S_IRUSR | S_IROTH : 0) - | (value & S_IWGRP ? S_IWUSR | S_IWOTH : 0) - | (value & S_IXGRP ? S_IXUSR | S_IXOTH : 0)); - else - /* Copy `o' permissions onto `u' and `g'. */ - value |= ( (value & S_IROTH ? S_IRUSR | S_IRGRP : 0) - | (value & S_IWOTH ? S_IWUSR | S_IWGRP : 0) - | (value & S_IXOTH ? S_IXUSR | S_IXGRP : 0)); + /* Copy the isolated bits to the other two parts. */ + value |= ((value & (S_IRUSR | S_IRGRP | S_IROTH) + ? S_IRUSR | S_IRGRP | S_IROTH : 0) + | (value & (S_IWUSR | S_IWGRP | S_IWOTH) + ? S_IWUSR | S_IWGRP | S_IWOTH : 0) + | (value & (S_IXUSR | S_IXGRP | S_IXOTH) + ? S_IXUSR | S_IXGRP | S_IXOTH : 0)); + break; - /* In order to change only `u', `g', or `o' permissions, - or some combination thereof, clear unselected bits. - This cannot be done in mode_compile because the value - to which the `changes->affected' mask is applied depends - on the old mode of each file. */ - value &= changes->affected; + case MODE_X_IF_ANY_X: + /* Affect the execute bits if execute bits are already set + or if the file is a directory. */ + if ((newmode & (S_IXUSR | S_IXGRP | S_IXOTH)) || S_ISDIR (oldmode)) + value |= S_IXUSR | S_IXGRP | S_IXOTH; + break; } - else - { - value = changes->value; - /* If `X', do not affect the execute bits if the file is not a - directory and no execute bits are already set. */ - if ((changes->flags & MODE_X_IF_ANY_X) - && !S_ISDIR (oldmode) - && (newmode & (S_IXUSR | S_IXGRP | S_IXOTH)) == 0) - /* Clear the execute bits. */ - value &= ~ (S_IXUSR | S_IXGRP | S_IXOTH); - } + + /* If WHO was specified, limit the change to the affected bits. + Otherwise, apply the umask. */ + value &= (affected ? affected : ~umask_value); switch (changes->op) { case '=': - /* Preserve the previous values in `newmode' of bits that are - not affected by this change operation. */ - newmode = (newmode & ~changes->affected) | value; - break; + /* If WHO was specified, preserve the previous values of + bits that are not affected by this change operation. + Otherwise, clear all the bits. */ + newmode = (affected ? newmode & ~affected : 0); + /* Fall through. */ case '+': newmode |= value; break; + case '-': newmode &= ~value; break; } } + return newmode; } - -/* Free the memory used by the list of file mode change operations - CHANGES. */ - -void -mode_free (register struct mode_change *changes) -{ - register struct mode_change *next; - - while (changes) - { - next = changes->next; - free (changes); - changes = next; - } -}
--- a/lib/modechange.h +++ b/lib/modechange.h @@ -1,5 +1,7 @@ /* modechange.h -- definitions for file mode manipulation - Copyright (C) 1989, 1990, 1997, 2003, 2004 Free Software Foundation, Inc. + + Copyright (C) 1989, 1990, 1997, 2003, 2004, 2005 Free Software + Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,38 +24,8 @@ # include <sys/types.h> -/* Affect the execute bits only if at least one execute bit is set already, - or if the file is a directory. */ -# define MODE_X_IF_ANY_X 01 - -/* If set, copy some existing permissions for u, g, or o onto the other two. - Which of u, g, or o is copied is determined by which bits are set in the - `value' field. */ -# define MODE_COPY_EXISTING 02 - -struct mode_change -{ - char op; /* One of "=+-". */ - char flags; /* Special operations. */ - mode_t affected; /* Set for u/g/o/s/s/t, if to be affected. */ - mode_t value; /* Bits to add/remove. */ - struct mode_change *next; /* Link to next change in list. */ -}; - -/* Masks for mode_compile argument. */ -# define MODE_MASK_EQUALS 1 -# define MODE_MASK_PLUS 2 -# define MODE_MASK_MINUS 4 -# define MODE_MASK_ALL (MODE_MASK_EQUALS | MODE_MASK_PLUS | MODE_MASK_MINUS) - -/* Error return values for mode_compile. */ -# define MODE_INVALID (struct mode_change *) 0 -# define MODE_MEMORY_EXHAUSTED (struct mode_change *) 1 -# define MODE_BAD_REFERENCE (struct mode_change *) 2 - -struct mode_change *mode_compile (const char *, unsigned int); +struct mode_change *mode_compile (const char *); struct mode_change *mode_create_from_ref (const char *); -mode_t mode_adjust (mode_t, const struct mode_change *); -void mode_free (struct mode_change *); +mode_t mode_adjust (mode_t, struct mode_change const *, mode_t); #endif
--- a/lib/nanosleep.c +++ b/lib/nanosleep.c @@ -1,5 +1,5 @@ /* Provide a replacement for the POSIX nanosleep function. - Copyright (C) 1999, 2000, 2002, 2004 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2002, 2004, 2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,6 +34,8 @@ # include <unistd.h> #endif +#include "timespec.h" + /* Some systems (MSDOS) don't have SIGCONT. Using SIGTERM here turns the signal-handling code below into a no-op on such systems. */ @@ -41,7 +43,9 @@ # define SIGCONT SIGTERM #endif -#include "timespec.h" +#if ! HAVE_SIGINTERRUPT +# define siginterrupt(sig, flag) /* empty */ +#endif static sig_atomic_t volatile suspended; @@ -66,7 +70,7 @@ tv_delay.tv_sec++; tv_delay.tv_usec = 0; } - select (0, (void *) 0, (void *) 0, (void *) 0, &tv_delay); + select (0, NULL, NULL, NULL, &tv_delay); } /* FIXME: comment */ @@ -77,16 +81,11 @@ { static bool initialized; -#ifdef SA_NOCLDSTOP - struct sigaction oldact, newact; -#endif - - suspended = 0; - /* set up sig handler */ if (! initialized) { #ifdef SA_NOCLDSTOP + struct sigaction oldact, newact; newact.sa_handler = sighandler; sigemptyset (&newact.sa_mask); newact.sa_flags = 0; @@ -96,11 +95,16 @@ sigaction (SIGCONT, &newact, NULL); #else if (signal (SIGCONT, SIG_IGN) != SIG_IGN) - signal (SIGCONT, sighandler); + { + signal (SIGCONT, sighandler); + siginterrupt (SIGCONT, 1); + } #endif initialized = true; } + suspended = 0; + my_usleep (requested_delay); if (suspended)
deleted file mode 100644 --- a/lib/open-safer.c +++ /dev/null @@ -1,75 +0,0 @@ -/* Invoke open, but avoid some glitches. - - Copyright (C) 2004 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Written by Paul Eggert. */ - -#if HAVE_CONFIG_H -# include <config.h> -#endif - -#include <fcntl-safer.h> - -#include <unistd-safer.h> - -#include <errno.h> -#include <stdarg.h> - -#if HAVE_FCNTL_H -# include <fcntl.h> -#endif - -#if HAVE_UNISTD_H -# include <unistd.h> -#endif -#ifndef STDERR_FILENO -# define STDERR_FILENO 2 -#endif - -/* Like open, but do not return STDIN_FILENO, STDOUT_FILENO, or - STDERR_FILENO. */ - -int -open_safer (char const *file, int oflag, ...) -{ - int fd; - mode_t mode = 0; - - if (oflag & O_CREAT) - { - va_list args; - va_start (args, oflag); - if (sizeof (int) <= sizeof (mode_t)) - mode = va_arg (args, mode_t); - else - mode = va_arg (args, int); - va_end (args); - } - - fd = open (file, oflag, mode); - - if (0 <= fd && fd <= STDERR_FILENO) - { - int f = dup_safer (fd); - int e = errno; - close (fd); - errno = e; - fd = f; - } - - return fd; -}
--- a/lib/readutmp.c +++ b/lib/readutmp.c @@ -1,5 +1,5 @@ /* GNU's read utmp module. - Copyright (C) 1992-2001, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 1992-2001, 2003, 2004, 2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,6 +26,8 @@ #include <sys/types.h> #include <sys/stat.h> +#include <signal.h> +#include <stdbool.h> #include <string.h> #include <stdlib.h> @@ -35,6 +37,10 @@ # include "unlocked-io.h" #endif +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif + /* Copy UT->ut_name into storage obtained from malloc. Then remove any trailing spaces from the copy, NUL terminate it, and return the copy. */ @@ -56,19 +62,32 @@ return trimmed_name; } +/* Is the utmp entry U desired by the user who asked for OPTIONS? */ + +static inline bool +desirable_utmp_entry (STRUCT_UTMP const *u, int options) +{ + return ! (options & READ_UTMP_CHECK_PIDS + && (UT_PID (u) <= 0 + || (kill (UT_PID (u), 0) < 0 && errno == ESRCH))); +} + /* Read the utmp entries corresponding to file FILENAME into freshly- malloc'd storage, set *UTMP_BUF to that pointer, set *N_ENTRIES to the number of entries, and return zero. If there is any error, - return -1, setting errno, and don't modify the parameters. */ + return -1, setting errno, and don't modify the parameters. + If OPTIONS & READ_UTMP_CHECK_PIDS is nonzero, omit entries whose + process-IDs do not currently exist. */ #ifdef UTMP_NAME_FUNCTION int -read_utmp (const char *filename, size_t *n_entries, STRUCT_UTMP **utmp_buf) +read_utmp (const char *filename, size_t *n_entries, STRUCT_UTMP **utmp_buf, + int options) { - size_t n_read; - size_t n_alloc = 4; - STRUCT_UTMP *utmp = xmalloc (n_alloc * sizeof *utmp); + size_t n_read = 0; + size_t n_alloc = 0; + STRUCT_UTMP *utmp = NULL; STRUCT_UTMP *u; /* Ignore the return value for now. @@ -79,17 +98,14 @@ SET_UTMP_ENT (); - n_read = 0; while ((u = GET_UTMP_ENT ()) != NULL) - { - if (n_read == n_alloc) - { - utmp = xnrealloc (utmp, n_alloc, 2 * sizeof *utmp); - n_alloc *= 2; - } - ++n_read; - utmp[n_read - 1] = *u; - } + if (desirable_utmp_entry (u, options)) + { + if (n_read == n_alloc) + utmp = x2nrealloc (utmp, &n_alloc, sizeof *utmp); + + utmp[n_read++] = *u; + } END_UTMP_ENT (); @@ -102,46 +118,39 @@ #else int -read_utmp (const char *filename, size_t *n_entries, STRUCT_UTMP **utmp_buf) +read_utmp (const char *filename, size_t *n_entries, STRUCT_UTMP **utmp_buf, + int options) { - FILE *utmp; - struct stat file_stats; - size_t n_read; - size_t size; - STRUCT_UTMP *buf; + size_t n_read = 0; + size_t n_alloc = 0; + STRUCT_UTMP *utmp = NULL; + int saved_errno; + FILE *f = fopen (filename, "r"); - utmp = fopen (filename, "r"); - if (utmp == NULL) + if (! f) return -1; - if (fstat (fileno (utmp), &file_stats) != 0) - { - int e = errno; - fclose (utmp); - errno = e; - return -1; - } - size = file_stats.st_size; - buf = xmalloc (size); - n_read = fread (buf, sizeof *buf, size / sizeof *buf, utmp); - if (ferror (utmp)) + for (;;) { - int e = errno; - free (buf); - fclose (utmp); - errno = e; - return -1; + if (n_read == n_alloc) + utmp = x2nrealloc (utmp, &n_alloc, sizeof *utmp); + if (fread (&utmp[n_read], sizeof utmp[n_read], 1, f) == 0) + break; + n_read += desirable_utmp_entry (&utmp[n_read], options); } - if (fclose (utmp) != 0) + + saved_errno = ferror (f) ? errno : 0; + if (fclose (f) != 0) + saved_errno = errno; + if (saved_errno != 0) { - int e = errno; - free (buf); - errno = e; + free (utmp); + errno = saved_errno; return -1; } *n_entries = n_read; - *utmp_buf = buf; + *utmp_buf = utmp; return 0; }
--- a/lib/readutmp.h +++ b/lib/readutmp.h @@ -1,7 +1,7 @@ /* Declarations for GNU's read utmp module. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -167,6 +167,12 @@ # define WTMP_FILE "/etc/wtmp" # endif +# if HAVE_STRUCT_XTMP_UT_PID +# define UT_PID(U) ((U)->ut_pid) +# else +# define UT_PID(U) 0 +# endif + # if HAVE_STRUCT_UTMP_UT_TYPE || HAVE_STRUCT_UTMPX_UT_TYPE # define UT_TYPE_EQ(U, V) ((U)->ut_type == (V)) # define UT_TYPE_NOT_DEFINED 0 @@ -192,7 +198,14 @@ && (UT_TYPE_USER_PROCESS (U) \ || (UT_TYPE_NOT_DEFINED && UT_TIME_MEMBER (U) != 0))) +/* Options for read_utmp. */ +enum + { + READ_UTMP_CHECK_PIDS = 1 + }; + char *extract_trimmed_name (const STRUCT_UTMP *ut); -int read_utmp (const char *filename, size_t *n_entries, STRUCT_UTMP **utmp_buf); +int read_utmp (const char *filename, size_t *n_entries, STRUCT_UTMP **utmp_buf, + int options); #endif /* __READUTMP_H__ */
--- a/lib/save-cwd.c +++ b/lib/save-cwd.c @@ -42,6 +42,7 @@ #include <errno.h> #include "chdir-long.h" +#include "unistd-safer.h" #include "xgetcwd.h" /* On systems without the fchdir function (WOE), pretend that open @@ -49,7 +50,7 @@ Since chdir_long requires fchdir, use chdir instead. */ #if !HAVE_FCHDIR # undef open -# define open(File, Flags) -1 +# define open(File, Flags) (-1) # undef fchdir # define fchdir(Fd) (abort (), -1) # undef chdir_long @@ -81,10 +82,10 @@ { cwd->name = NULL; - cwd->desc = open (".", O_RDONLY); + cwd->desc = fd_safer (open (".", O_RDONLY)); if (cwd->desc < 0) { - cwd->desc = open (".", O_WRONLY); + cwd->desc = fd_safer (open (".", O_WRONLY)); if (cwd->desc < 0) { cwd->name = xgetcwd ();
--- a/lib/tempname.c +++ b/lib/tempname.c @@ -1,7 +1,7 @@ /* tempname.c - generate the name of a temporary file. Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + 2000, 2001, 2002, 2003, 2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -67,34 +67,11 @@ #endif #include <sys/stat.h> -#if STAT_MACROS_BROKEN -# undef S_ISDIR -#endif -#if !defined S_ISDIR && defined S_IFDIR -# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) -#endif -#if !S_IRUSR && S_IREAD -# define S_IRUSR S_IREAD -#endif -#if !S_IRUSR -# define S_IRUSR 00400 -#endif -#if !S_IWUSR && S_IWRITE -# define S_IWUSR S_IWRITE -#endif -#if !S_IWUSR -# define S_IWUSR 00200 -#endif -#if !S_IXUSR && S_IEXEC -# define S_IXUSR S_IEXEC -#endif -#if !S_IXUSR -# define S_IXUSR 00100 -#endif #if _LIBC # define struct_stat64 struct stat64 #else +# include "stat-macros.h" # define struct_stat64 struct stat # define __getpid getpid # define __gettimeofday gettimeofday
--- a/lib/unistd-safer.h +++ b/lib/unistd-safer.h @@ -1,6 +1,6 @@ -/* Invoke unistd functions, but avoid some glitches. +/* Invoke unistd-like functions, but avoid some glitches. - Copyright (C) 2001, 2003 Free Software Foundation, Inc. + Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,3 +19,4 @@ /* Written by Paul Eggert. */ int dup_safer (int); +int fd_safer (int);
--- a/m4/ChangeLog +++ b/m4/ChangeLog @@ -1,3 +1,41 @@ +2005-05-01 Paul Eggert <eggert@cs.ucla.edu> + + * euidaccess.m4 (gl_PREREQ_EUIDACCESS): Don't require AC_HEADER_STAT. + * lchown.m4 (gl_FUNC_CHOWN): Likewise. + (gl_PREREQ_CHOWN): Remove. + * lstat.m4 (gl_FUNC_LSTAT): Require AC_FUNC_LSTAT instead of calling + it. Don't require AC_HEADER_STAT. + (gl_PREREQ_LSTAT): Remove. + * mkstemp.m4 (gl_PREREQ_TEMPNAME): Check stdint.h only once. + Don't require AC_HEADER_STAT. + * rmdir.m4 (gl_FUNC_RMDIR): Don't require AC_HEADER_STAT. + (gl_PREREQ_RMDIR): Remove. + * canonicalize.m4 (AC_FUNC_CANONICALIZE_FILE_NAME): Don't + mention stat-macros.h or AC_HEADER_STAT, since we'll make + the stat-macros module a prerequisite. + * file-type.m4 (gl_FILE_TYPE): Likewise. + * filemode.m4 (gl_FILEMODE): Likewise. + * makepath.m4 (gl_MAKEPATH): Likewise. + * modechange.m4 (gl_MODECHANGE): Likewise. + * clock_time.m4 (gl_CLOCK_TIME): Use gl_ rather than fetish_ for + variable names. + * rmdir-errno.m4 (gl_FUNC_RMDIR_NOTEMPTY): Renamed from + fetish_FUNC_RMDIR_NOTEMPTY. All uses changed. Use gl_ for + variable prefixes. + * fcntl-safer.m4: Remove. + * stdio-safer.m4 (gl_STDIO_SAFER): Use AC_LIBSOURCES and AC_LIBOBJ. + * unistd-safer.m4 (gl_UNISTD_SAFER): Likewise. + Invoke gl_PREREQ_FD_SAFER. + (gl_PREREQ_FD_SAFER): New macro. + * nanosleep.m4 (gl_PREREQ_NANOSLEEP): Check for siginterrupt. + * readutmp.m4 (gl_READUTMP): Require AC_C_INLINE. + Use AC_CHECK_HEADERS_ONCE and AC_CHECK_FUNCS_ONCE when possible. + Remove duplicate call to AC_LIBOBJ(readutmp). + (gl_PREREQ_READUTMP): Remove. All uses inlined. + + * mmap-anon.m4 (gl_FUNC_MMAP_ANON): Check for message, not for + MAP_ANON. Problem reported by Moriyoshi Koizumi to bug-cvs. + 2005-05-01 Oskar Liljeblad <oskar@osk.mine.nu> * byteswap.m4: New file.
--- a/m4/canonicalize.m4 +++ b/m4/canonicalize.m4 @@ -1,4 +1,4 @@ -#serial 6 +#serial 7 # Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation @@ -9,11 +9,10 @@ AC_DEFUN([AC_FUNC_CANONICALIZE_FILE_NAME], [ - AC_LIBSOURCES([canonicalize.c, canonicalize.h, stat-macros.h]) + AC_LIBSOURCES([canonicalize.c, canonicalize.h]) AC_LIBOBJ([canonicalize]) AC_REQUIRE([AC_HEADER_STDC]) AC_CHECK_HEADERS(string.h sys/param.h stddef.h) AC_CHECK_FUNCS(resolvepath canonicalize_file_name) - AC_REQUIRE([AC_HEADER_STAT]) ])
--- a/m4/clock_time.m4 +++ b/m4/clock_time.m4 @@ -1,5 +1,5 @@ -# clock_time.m4 serial 5 -dnl Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. +# clock_time.m4 serial 6 +dnl Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. @@ -16,11 +16,11 @@ # Save and restore LIBS so e.g., -lrt, isn't added to it. Otherwise, *all* # programs in the package would end up linked with that potentially-shared # library, inducing unnecessary run-time overhead. - fetish_saved_libs=$LIBS + gl_saved_libs=$LIBS AC_SEARCH_LIBS(clock_gettime, [rt posix4], [test "$ac_cv_search_clock_gettime" = "none required" || LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime]) AC_SUBST(LIB_CLOCK_GETTIME) AC_CHECK_FUNCS(clock_gettime clock_settime) - LIBS=$fetish_saved_libs + LIBS=$gl_saved_libs ])
--- a/m4/euidaccess.m4 +++ b/m4/euidaccess.m4 @@ -1,5 +1,5 @@ -# euidaccess.m4 serial 5 -dnl Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. +# euidaccess.m4 serial 6 +dnl Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. @@ -32,7 +32,6 @@ AC_CHECK_HEADERS_ONCE(libgen.h) AC_CHECK_DECLS_ONCE(setregid) AC_REQUIRE([AC_FUNC_GETGROUPS]) - AC_REQUIRE([AC_HEADER_STAT]) # Solaris 9 needs -lgen to get the eaccess function. # Save and restore LIBS so -lgen isn't added to it. Otherwise, *all*
deleted file mode 100644 --- a/m4/fcntl-safer.m4 +++ /dev/null @@ -1,18 +0,0 @@ -# fcntl-safer.m4 serial 3 - -# Copyright (C) 2004 Free Software Foundation, Inc. -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# Written by Paul Eggert. - -AC_DEFUN([gl_FCNTL_SAFER], -[ - gl_PREREQ_OPEN_SAFER -]) - -# Prerequisites of lib/open-safer.c. -AC_DEFUN([gl_PREREQ_OPEN_SAFER], [ - AC_CHECK_HEADERS_ONCE(fcntl.h unistd.h) -])
--- a/m4/file-type.m4 +++ b/m4/file-type.m4 @@ -1,4 +1,4 @@ -# file-type.m4 serial 4 +# file-type.m4 serial 5 dnl Copyright (C) 2002, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -6,9 +6,6 @@ AC_DEFUN([gl_FILE_TYPE], [ - AC_LIBSOURCES([file-type.c, file-type.h, stat-macros.h]) + AC_LIBSOURCES([file-type.c, file-type.h]) AC_LIBOBJ([file-type]) - - dnl Prerequisites of lib/file-type.h. - AC_REQUIRE([AC_HEADER_STAT]) ])
--- a/m4/filemode.m4 +++ b/m4/filemode.m4 @@ -1,4 +1,4 @@ -# filemode.m4 serial 4 +# filemode.m4 serial 5 dnl Copyright (C) 2002, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -6,9 +6,6 @@ AC_DEFUN([gl_FILEMODE], [ - AC_LIBSOURCES([filemode.c, filemode.h, stat-macros.h]) + AC_LIBSOURCES([filemode.c, filemode.h]) AC_LIBOBJ([filemode]) - - dnl Prerequisites of lib/filemode.c. - AC_REQUIRE([AC_HEADER_STAT]) ])
--- a/m4/lchown.m4 +++ b/m4/lchown.m4 @@ -1,6 +1,6 @@ -#serial 6 +#serial 7 -dnl Copyright (C) 1998, 2001, 2003, 2004 Free Software Foundation, Inc. +dnl Copyright (C) 1998, 2001, 2003, 2004, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. @@ -13,14 +13,4 @@ AC_LIBSOURCES([lchown.c, lchown.h]) AC_REQUIRE([AC_TYPE_UID_T]) AC_REPLACE_FUNCS(lchown) - if test $ac_cv_func_lchown = no; then - gl_PREREQ_LCHOWN - fi ]) - -# Prerequisites of lib/lchown.c. -AC_DEFUN([gl_PREREQ_LCHOWN], -[ - AC_REQUIRE([AC_HEADER_STAT]) - : -])
--- a/m4/lstat.m4 +++ b/m4/lstat.m4 @@ -1,6 +1,6 @@ -#serial 12 +#serial 13 -# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004 Free Software +# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation @@ -18,16 +18,7 @@ AC_DEFUN([gl_FUNC_LSTAT], [ - AC_FUNC_LSTAT + AC_REQUIRE([AC_FUNC_LSTAT]) dnl Note: AC_FUNC_LSTAT does AC_LIBOBJ(lstat). - if test $ac_cv_func_lstat_empty_string_bug = yes; then - gl_PREREQ_LSTAT - fi -]) - -# Prerequisites of lib/lstat.c. -AC_DEFUN([gl_PREREQ_LSTAT], -[ - AC_REQUIRE([AC_HEADER_STAT]) : ])
--- a/m4/makepath.m4 +++ b/m4/makepath.m4 @@ -1,4 +1,4 @@ -# makepath.m4 serial 6 +# makepath.m4 serial 7 dnl Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -6,12 +6,11 @@ AC_DEFUN([gl_MAKEPATH], [ - AC_LIBSOURCES([makepath.c, makepath.h, stat-macros.h]) + AC_LIBSOURCES([makepath.c, makepath.h]) AC_LIBOBJ([makepath]) dnl Prerequisites of lib/makepath.c. AC_REQUIRE([AC_FUNC_ALLOCA]) AC_CHECK_HEADERS_ONCE(unistd.h) - AC_REQUIRE([AC_HEADER_STAT]) AC_REQUIRE([gl_AFS]) ])
--- a/m4/mkstemp.m4 +++ b/m4/mkstemp.m4 @@ -1,4 +1,4 @@ -#serial 9 +#serial 10 # Copyright (C) 2001, 2003, 2004, 2005 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation @@ -65,9 +65,7 @@ # Prerequisites of lib/tempname.c. AC_DEFUN([gl_PREREQ_TEMPNAME], [ - AC_REQUIRE([AC_HEADER_STAT]) - AC_CHECK_HEADERS_ONCE(fcntl.h sys/time.h unistd.h) - AC_CHECK_HEADERS(stdint.h) + AC_CHECK_HEADERS_ONCE(fcntl.h sys/time.h stdint.h unistd.h) AC_CHECK_FUNCS(__secure_getenv gettimeofday) AC_CHECK_DECLS_ONCE(getenv) AC_REQUIRE([gl_AC_TYPE_UINTMAX_T])
--- a/m4/modechange.m4 +++ b/m4/modechange.m4 @@ -1,4 +1,4 @@ -# modechange.m4 serial 4 +# modechange.m4 serial 5 dnl Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -8,6 +8,4 @@ [ AC_LIBSOURCES([modechange.c, modechange.h]) AC_LIBOBJ([modechange]) - - AC_REQUIRE([AC_HEADER_STAT]) ])
--- a/m4/nanosleep.m4 +++ b/m4/nanosleep.m4 @@ -1,4 +1,4 @@ -#serial 12 +#serial 13 dnl From Jim Meyering. dnl Check for the nanosleep function. @@ -68,4 +68,5 @@ AC_DEFUN([gl_PREREQ_NANOSLEEP], [ AC_CHECK_HEADERS_ONCE(unistd.h) + AC_CHECK_FUNCS_ONCE(siginterrupt) ])
--- a/m4/readutmp.m4 +++ b/m4/readutmp.m4 @@ -1,4 +1,4 @@ -# readutmp.m4 serial 7 +# readutmp.m4 serial 9 dnl Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -9,9 +9,11 @@ AC_LIBSOURCES([readutmp.c, readutmp.h]) AC_LIBOBJ([readutmp]) - dnl Prerequisites of lib/readutmp.h. - AC_CHECK_HEADERS(utmp.h utmpx.h) - AC_CHECK_FUNCS(utmpname utmpxname) + dnl Prerequisites of lib/readutmp.h and lib/readutmp.c. + AC_REQUIRE([AC_C_INLINE]) + AC_REQUIRE([gl_FUNC_FREE]) + AC_CHECK_HEADERS_ONCE(utmp.h utmpx.h) + AC_CHECK_FUNCS_ONCE(utmpname utmpxname) AC_CHECK_DECLS(getutent,,,[ #ifdef HAVE_UTMP_H # include <utmp.h> @@ -49,14 +51,5 @@ AC_CHECK_MEMBERS([struct utmp.ut_exit.ut_termination],,,[$utmp_includes]) AC_CHECK_MEMBERS([struct utmpx.ut_exit.e_termination],,,[$utmp_includes]) AC_CHECK_MEMBERS([struct utmp.ut_exit.e_termination],,,[$utmp_includes]) - - AC_LIBOBJ(readutmp) - gl_PREREQ_READUTMP fi ]) - -# Prerequisites of lib/readutmp.c. -AC_DEFUN([gl_PREREQ_READUTMP], -[ - AC_REQUIRE([gl_FUNC_FREE]) -])
--- a/m4/rmdir-errno.m4 +++ b/m4/rmdir-errno.m4 @@ -1,6 +1,6 @@ -#serial 4 +#serial 5 -# Copyright (C) 2000, 2001, Free Software Foundation, Inc. +# Copyright (C) 2000, 2001, 2005 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -10,10 +10,10 @@ # ENOTEMPTY is mistakenly defined to be EEXIST. To work around this, and # in general, to avoid depending on the use of any particular symbol, this # test runs a test to determine the actual numeric value. -AC_DEFUN([fetish_FUNC_RMDIR_NOTEMPTY], +AC_DEFUN([gl_FUNC_RMDIR_NOTEMPTY], [dnl AC_CACHE_CHECK([for rmdir-not-empty errno value], - fetish_cv_func_rmdir_errno_not_empty, + gl_cv_func_rmdir_errno_not_empty, [ # Arrange for deletion of the temporary directory this test creates. ac_clean_files="$ac_clean_files confdir2" @@ -35,14 +35,14 @@ exit (0); } ], - fetish_cv_func_rmdir_errno_not_empty=`cat confdir2/errno`, - fetish_cv_func_rmdir_errno_not_empty='configure error in rmdir-errno.m4', - fetish_cv_func_rmdir_errno_not_empty=ENOTEMPTY + gl_cv_func_rmdir_errno_not_empty=`cat confdir2/errno`, + gl_cv_func_rmdir_errno_not_empty='configure error in rmdir-errno.m4', + gl_cv_func_rmdir_errno_not_empty=ENOTEMPTY ) ] ) AC_DEFINE_UNQUOTED([RMDIR_ERRNO_NOT_EMPTY], - $fetish_cv_func_rmdir_errno_not_empty, + $gl_cv_func_rmdir_errno_not_empty, [the value to which errno is set when rmdir fails on a nonempty directory]) ])
--- a/m4/rmdir.m4 +++ b/m4/rmdir.m4 @@ -1,5 +1,5 @@ -# rmdir.m4 serial 2 -dnl Copyright (C) 2002 Free Software Foundation, Inc. +# rmdir.m4 serial 3 +dnl Copyright (C) 2002, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. @@ -7,13 +7,4 @@ AC_DEFUN([gl_FUNC_RMDIR], [ AC_REPLACE_FUNCS(rmdir) - if test $ac_cv_func_rmdir = no; then - gl_PREREQ_RMDIR - fi ]) - -# Prerequisites of lib/rmdir.c. -AC_DEFUN([gl_PREREQ_RMDIR], [ - AC_REQUIRE([AC_HEADER_STAT]) - : -])
--- a/m4/stat-macros.m4 +++ b/m4/stat-macros.m4 @@ -1,4 +1,4 @@ -#serial 1 +#serial 2 # Copyright (C) 2005 Free Software Foundation, Inc. # @@ -9,4 +9,6 @@ AC_DEFUN([gl_STAT_MACROS], [ AC_LIBSOURCES([stat-macros.h]) + + AC_REQUIRE([AC_HEADER_STAT]) ])
--- a/m4/stdio-safer.m4 +++ b/m4/stdio-safer.m4 @@ -1,11 +1,14 @@ -# stdio-safer.m4 serial 2 -dnl Copyright (C) 2002 Free Software Foundation, Inc. +# stdio-safer.m4 serial 3 +dnl Copyright (C) 2002, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_STDIO_SAFER], [ + AC_LIBSOURCES([fopen-safer.c, stdio-safer.h]) + AC_LIBOBJ([fopen-safer]) + dnl Prerequisites of lib/fopen-safer.c. AC_CHECK_HEADERS_ONCE(unistd.h) ])
--- a/m4/unistd-safer.m4 +++ b/m4/unistd-safer.m4 @@ -1,15 +1,25 @@ -# unistd-safer.m4 serial 2 -dnl Copyright (C) 2002 Free Software Foundation, Inc. +# unistd-safer.m4 serial 3 +dnl Copyright (C) 2002, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_UNISTD_SAFER], [ + AC_LIBSOURCES([dup-safer.c, fd-safer.c, unistd-safer.h]) + AC_LIBOBJ([dup-safer]) + AC_LIBOBJ([fd-safer]) + gl_PREREQ_DUP_SAFER + gl_PREREQ_FD_SAFER ]) # Prerequisites of lib/dup-safer.c. AC_DEFUN([gl_PREREQ_DUP_SAFER], [ AC_CHECK_HEADERS_ONCE(fcntl.h unistd.h) ]) + +# Prerequisites of lib/fd-safer.c. +AC_DEFUN([gl_PREREQ_FD_SAFER], [ + AC_CHECK_HEADERS_ONCE(unistd.h) +])
deleted file mode 100644 --- a/modules/fcntl-safer +++ /dev/null @@ -1,26 +0,0 @@ -Description: -File control functions that avoid clobbering std{in,out,err}. - -Files: -lib/fcntl-safer.h -lib/open-safer.c -m4/fcntl-safer.m4 - -Depends-on: -unistd-safer - -configure.ac: -gl_FCNTL_SAFER - -Makefile.am: -lib_SOURCES += fcntl-safer.h open-safer.c - -Include: -"fcntl-safer.h" - -License: -GPL - -Maintainer: -Paul Eggert, Jim Meyering -
--- a/modules/getloadavg +++ b/modules/getloadavg @@ -9,6 +9,7 @@ cloexec xalloc c-strtod +unistd-safer configure.ac: AC_FUNC_GETLOADAVG
--- a/modules/getusershell +++ b/modules/getusershell @@ -6,6 +6,7 @@ m4/getusershell.m4 Depends-on: +stdio-safer xalloc configure.ac: @@ -20,4 +21,3 @@ Maintainer: Jim Meyering -
--- a/modules/lstat +++ b/modules/lstat @@ -7,7 +7,6 @@ Depends-on: stat -xalloc configure.ac: gl_FUNC_LSTAT @@ -22,4 +21,3 @@ Maintainer: Jim Meyering -
--- a/modules/mkstemp +++ b/modules/mkstemp @@ -11,6 +11,7 @@ m4/mkstemp.m4 Depends-on: +stat-macros configure.ac: gl_FUNC_MKSTEMP
--- a/modules/modechange +++ b/modules/modechange @@ -8,7 +8,8 @@ m4/modechange.m4 Depends-on: -xstrtol +stat-macros +xalloc configure.ac: gl_MODECHANGE
--- a/modules/save-cwd +++ b/modules/save-cwd @@ -8,6 +8,7 @@ Depends-on: chdir-long +unistd-safer xgetcwd configure.ac:
--- a/modules/stdio-safer +++ b/modules/stdio-safer @@ -13,7 +13,6 @@ gl_STDIO_SAFER Makefile.am: -lib_SOURCES += stdio-safer.h fopen-safer.c Include: "stdio-safer.h" @@ -23,4 +22,3 @@ Maintainer: Paul Eggert, Jim Meyering -
--- a/modules/unistd-safer +++ b/modules/unistd-safer @@ -4,6 +4,7 @@ Files: lib/unistd-safer.h lib/dup-safer.c +lib/fd-safer.c m4/unistd-safer.m4 Depends-on: @@ -12,7 +13,6 @@ gl_UNISTD_SAFER Makefile.am: -lib_SOURCES += unistd-safer.h dup-safer.c Include: "unistd-safer.h" @@ -22,4 +22,3 @@ Maintainer: Paul Eggert, Jim Meyering -