Paul Eggert [Fri, 23 Sep 2005 19:41:05 +0000 (19:41 +0000)]
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Problem reported by Eric Blake.
(getaddrinfo): Initialize se so that it's not garbage.
Redo internal storage allocation so that it doesn't make unportable
assumptions about alignment.
Fix a memory leak.
* m4/getaddrinfo.m4 (gl_PREREQ_GETADDRINFO): Undo previous change;
not needed, since socklen is a prerequisite module.
Paul Eggert [Fri, 23 Sep 2005 19:18:06 +0000 (19:18 +0000)]
* lib/utimens.c (futimens): Use futimesat if available.
Prefer it to futimes since it doesn't have the futimes bug.
* m4/utimens.m4 (gl_UTIMENS): Check for futimesat.
Paul Eggert [Fri, 23 Sep 2005 17:48:14 +0000 (17:48 +0000)]
(GL_CONCAT0, GL_CONCAT): Remove.
(verify): Don't use the __LINE__ trick, as it doesn't work in general.
Instead, declare a function that returns a pointer to an array,
and use verify_type__ to declare the size of the array.
Problem and germ of a solution reported by Bruno Haible.
Jim Meyering [Fri, 23 Sep 2005 15:49:05 +0000 (15:49 +0000)]
Sync from coreutils.
Correct build failure (socklen_t not defined) on at least
mips-sgi-irix6.5 and alphaev67-dec-osf5.1.
(gl_PREREQ_GETADDRINFO): Require gl_SOCKLEN_T.
Sync from coreutils.
(gl_PREREQ_GETADDRINFO): Check for netinet/in.h.
Paul Eggert [Fri, 23 Sep 2005 04:15:13 +0000 (04:15 +0000)]
Sync from coreutils.
* .cppi-disable: Add regcomp.c, regex_internal.c, regex_internal.h,
stat-time.h.
* argmatch.h: Include verify.h
(ARGMATCH_VERIFY): Use verify rather than rolling our own.
(ARGMATCH_ASSERT): Remove; unused.
* canonicalize.c: Assume STDC_HEADERS.
* exclude.c: Include "strcase.h".
* regex_internal.h [!defined _LIBC]: Likewise.
* getusershell.c: Include stdio--.h rather than stdio.h
and stdio-safer.h.
(getusershell): Call fopen, not fopen_safer.
* save-cwd.c: Include fcntl--.h rather than fcntl.h.
Do not include unistd-safer.h.
(save_cwd): Don't call fd_safer; no longer needed
now that we include fcntl--.h.
* modules/argmatch (Depends-on): Add verify.
* modules/getloadavg (Depends-on): Depend on fcntl-safer, not
unistd-safer.
* modules/save-cwd (Depends-on): Likewise.
* backupfile.c: Use ARGMATCH_VERIFY, just in case.
* posixtm.c (posixtime) [lint]: Initialize *all* of tm0, not just
the .tm_year member, since otherwise gcc-4.0 would now warn about
tm_zone, tm_gmtoff, tm_isdst, tm_yday, tm_wday.
* quotearg.c (quotearg_n_options): Change code to be suboptimal, in
order to avoid an unsuppressible warning from gcc on 64-bit systems.
* lstat.m4 (gl_FUNC_LSTAT):
Use AC_LIBSOURCES to require lstat.c and lstat.h.
Remove obsolete comment.
* xreadlink.m4: Use AC_LIBSOURCES and AC_LIBOBJ.
* xstrtod.m4: Likewise.
Paul Eggert [Thu, 22 Sep 2005 23:37:18 +0000 (23:37 +0000)]
* strftime.c (my_strftime): Rewrite the previous change slightly,
to make it a bit faster and (I hope) clearer.
* strftime.c (my_strftime): Add support for %:z, %::z, %:::z.
Fix bug in formats like %2N.
* strftime.c [FPRINTFTIME] (fprintftime): Provide a new interface:
size_t fprintftime (FILE *fp, char const *fmt, struct tm const *tm,
int utc, int nanoseconds);
Background:
date should not have to allocate a megabyte of virtual memory to
handle a format argument like +%1048575T. When implemented with
strftime, it must allocate such a buffer, use strftime to fill it
in, print it, then free it.
With fprintftime, it simply prints everything and exits.
With no need for memory allocation, that's one fewer way to fail.
* strftime.c (my_strftime): Parse the colons of %:::z *after* the
optional field width, not before, so we accept %9:z, not %:9z.
(my_strftime): Be sure to use L_('x') for literals.
Paul Eggert [Thu, 22 Sep 2005 23:30:37 +0000 (23:30 +0000)]
* modules/openat (Files): Add lib/openat-die.c.
(Depends-on): Remove error, exitfail.
Add dirname.
* lib/openat.c (fdopendir): Be sure to close the supplied
file descriptor before returning. This makes our replacement
implementation a little closer to Solaris's, where fdopendir
ties the file descriptor to the returned DIR* pointer.
* lib/openat.c (unlinkat): New function.
* lib/openat.h (unlinkat): Add prototype.
* lib/openat-die.c (openat_save_fail): Rename from openat_save_die.
(openat_restore_fail): Rename from openat_restore_die.
* lib/openat.c, openat.h: Reflect s/_die/_fail/ renaming.
Provide an alternative to exiting immediately upon save_cwd or
restore_cwd failure. Now, an application can arrange e.g.,
to perform a longjump in that case.
* lib/openat.c: Include dirname.h.
Use IS_ABSOLUTE_FILE_NAME rather than testing for leading slash.
(rpl_openat, fdopendir, fstatat): Call openat_save_die
and openat_restore_die rather than calling error directly.
Don't include "error.h" or "exitfail.h"; they're no longer needed.
* lib/openat-die.c (openat_save_die, openat_restore_die): New file.
* lib/openat.h (openat_save_die, openat_restore_die): Declare and define.
* m4/openat.m4 (gl_FUNC_OPENAT): Add openat-die.c.
Paul Eggert [Thu, 22 Sep 2005 23:24:03 +0000 (23:24 +0000)]
* mkdir-p.c (ENOSYS): Define to EEXIST if not defined.
(make_dir_parents): Treat ENOSYS like EEXIST.
Improve quality of diagnostics on restore_cwd failure.
* mkdir-p.h (make_dir): Remove. All uses replaced by mkdir.
(make_dir_parents): Last arg is now int * (for errno), not bool *.
* mkdir-p.c (make_dir, make_dir_parents): Likewise.
Rewrite "mkdir -p" algorithm to avoid the need for "stat"
each time through the loop. Do not diagnose restore_cwd failure;
that is the caller's job (and perhaps the caller does not care).
* mkdir-p.c (CLEANUP_CWD, CLEANUP): Remove.
(make_dir_parents): Revamp to avoid need for CLEANUP_CWD, CLEANUP.
If the file already exists but is not a directory, don't bother
to try to make its parents.
Close potential file descriptor leak if we can't chdir("/") (!).
Don't always return true if chdir($PWD) fails; return true only
if the requested action was done successfully (except for the
chdir($PWD)).
Don't log final directory unless we actually made it.
Refactor to avoid duplicate code to fix up permissions.
Don't attempt to fix up parent permissions if chdir($PWD) fails.
* mkdir-p.c (make_dir_parents): Don't let a failed chdir($PWD)
stop us from restricting permissions of just-created absolute-named
directories.
* mkdir-p.c (CLEANUP_CWD): Return *true*, not false when failing
to restore initial working directory.
* mkdir-p.c (make_dir_parents): New parameter: different_working_dir,
to tell caller if/when we change the working directory and are
unable to return to the initial one.
* mkdir-p.h (make_dir_parents): Update prototype.
* mkdir-p.c (CLEANUP_CWD): Change one more `return 1' to
`return false'. This fixes a bug introduced on 2004-07-30.
Assume HAVE_UNISTD_H, i.e., include <unistd.h> unconditionally.
Assume HAVE_FCNTL_H (i.e., include <fcntl.h> unconditionally,
and don't include <sys/file.h>).
Paul Eggert [Thu, 22 Sep 2005 23:15:09 +0000 (23:15 +0000)]
* getloadavg.c: Include fcntl--.h rather than fcntl.h.
Do not include unistd-safer.h.
(getloadavg): Don't call fd_safer; no longer needed
now that we include fcntl--.h.
* getloadavg.c:
Assume HAVE_UNISTD_H, i.e., include <unistd.h> unconditionally.
Assume HAVE_FCNTL_H (i.e., include <fcntl.h> unconditionally,
and don't include <sys/file.h>).
* getloadavg.c (getloadavg) [__CYGWIN__]: Port to cygwin.
[__linux__]: Allocate a big enough buffer for /proc/loadavg.
[!LDAV_DONE]: Avoid unused variable warning.
Paul Eggert [Thu, 22 Sep 2005 23:08:15 +0000 (23:08 +0000)]
* m4/getdate.m4 (gl_C_COMPOUND_LITERALS): New macro.
(gl_GETDATE): Use it.
* lib/getdate.y (relative_time): New type.
(RELATIVE_TIME_0): New constant.
(parser_control): Use relative_time instead of doing it ourselves.
(%union): Add new relative_time rel member.
(tYEAR_UNIT, tMONTH_UNIT, tHOUR_UNIT, tMINUTE_UNIT, tSEC_UNIT):
Now typeless.
(relunit, relunit_snumber): Now of type rel.
(zone, rel, relunit, get_date): Adjust to above changes.
Paul Eggert [Sat, 17 Sep 2005 06:54:00 +0000 (06:54 +0000)]
(set_stat_atime, set_stat_ctime, set_stat_mtime): Remove; they were
buggy in the HAVE_STRUCT_STAT_ST_SPARE1 case, and they were dubious
anyway. I rewrote 'tar' to not use them any more.
Paul Eggert [Fri, 16 Sep 2005 07:16:21 +0000 (07:16 +0000)]
* utimecmp.c: Include stat-time.h.
(SYSCALL_RESOLUTION): Depend on whether various struct stat
members exist, not on the obsolescent ST_MTIM_NSEC.
(utimecmp): Use the new stat-time functions rater than TIMESPEC_NS.
Paul Eggert [Fri, 16 Sep 2005 06:52:14 +0000 (06:52 +0000)]
* MODULES.html.sh (File system functions): Add stat-time.
* lib/stat-time.h: New file.
* lib/timespec.h (ST_TIME_CMP_NS, ST_TIME_CMP, ATIME_CMP, CTIME_CMP):
(MTIME_CMP, TIMESPEC_NS): Remove. Now done by stat-time.h,
in a different way.
(timespec_cmp): New function.
* m4/st_mtim.m4: Remove. Superseded by...
* m4/stat-time.m4: New file.
* m4/timespec.m4 (gl_TIMESPEC): Require AC_C_INLINE.
Do not invoke AC_STRUCT_ST_MTIM_NSEC; no longer needed.
* modules/stat-time: New file.
* modules/timespec (Files): Remove m4/st_mtim.m4; this
is now done in a different way, by the stat-time module.
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
LGPL.
* modules/getaddrinfo: Add link to opengroup spec. Depend on strdup.
Make canon-host require getaddrinfo.
* m4/canon-host.m4 (gl_CANON_HOST): Remove most dependencies.
AC_LIBSOURCE canon-host.h. Call...
(gl_PREREQ_CANON_HOST): ...this new function, which requires
gl_GETADDRINFO.
* m4/getaddrinfo.m4 (gl_GETADDRINFO): Compile gai_strerror when
needed.
Return usable errors from canon-host.
* lib/canon-host.h: New file.
* lib/canon-host.c (canon_host): Wrap...
(canon_host_r): ...this new function, which now relies exclusively on
getaddrinfo.
(ch_strerror): New function.
(last_cherror): New global.
* lib/getaddrinfo.c: Move include of getaddrinfo.h first to test
interface.
(getaddrinfo): Add AI_CANONNAME functionality. Don't do arithmetic
on void *.
(freeaddrinfo): Free ai->ai_canonname when set.
* modules/glob (Files): Add glob-libc.h.
* lib/glob-libc.h: Renamed from glob_.h. The new version is
taken from libc's glob.h, except with '#ifdef __GLOB_GNULIB'
protecting things that should be done only in gnulib contexts.
* lib/glob_.h: New file, containing only the glob things needed for
gnulib.
(GLOB_PREFIX): Remove. All uses changed to look for __GLOB_GNULIB.
(__GLOB_CONCAT, __GLOB_XCONCAT, __GLOB_ID): Remove; no longer needed.
(glob, globfree, glob_pattern_p): Now defined simply in terms of
rpl_glob, rpl_globfree, rpl_glob_pattern_p.
(__GLOB_GNULIB): New macro, to keep the glob.h changes clearer
and to respect the namespace rules better.
* m4/glob.m4 (gl_GLOB_SUBSTITUTE): AC_LIBSOURCES for glob.c,
glob_.h, glob-libc.h.
(gl_PREREQ_GLOB): Remove _SYS_CDEFS_H hack; no longer needed.
Paul Eggert [Mon, 12 Sep 2005 22:05:15 +0000 (22:05 +0000)]
Merge glibc and coreutils changes into gnulib, plus a few
extra fixes.
* md5.c: Use #error rather than a string.
(CYCLIC): New macro, from glibc source. Use it instead of rol.
* md5.h (__GNUC_PREREQ, __THROW): Define if not defined already.
(__attribute__): Define to empty for non recent-GCC.
(__md5_buffer, __md5_finish_ctx, __md5_init_ctx, __md5_process_block):
(__md5_process_bytes, __md5_read_ctx, __md5_stream):
Renamed from their non-__ counterparts, with new macros replacing
them if not _LIBC. Add __THROW attribute.
(rol): Remove.
(struct md5_ctx): Align buffer if using GCC.
* sha1.h (struct sha1_ctx): Likewise.
* sha1.c (SWAP): Renamed from the NOTSWAP. All uses changed.
The old name was backwards.
(NOTSWAP): Remove; not used.
(rol): New macro, moved here from md5.h.
(sha1_process_block): Remove a FIXME that doesn't make sense.
* gai_strerror.c: Include config.h when available. Include
getaddrinfo.h before other headers to test interface.
Reported by Larry Jones <lawrence.jones@ugs.com>.
Paul Eggert [Thu, 8 Sep 2005 20:18:48 +0000 (20:18 +0000)]
* lib/glob.c (glob, globfree, __glob_pattern_p): Use old-style function
definitions, since that's the preferred style in glibc.
Fix a minor spacing issue, and update copyright notice to match glibc's.
* config/srclist.txt: Remove glibc bug 1061; it's been fixed.
Paul Eggert [Tue, 6 Sep 2005 07:36:48 +0000 (07:36 +0000)]
Change bitset word type from unsigned int to unsigned long int,
as this has better performance on typical 64-bit hosts.
Port bitset code to hosts with unusual word sizes.
* lib/regcomp.c (build_equiv_class, build_charclass):
(build_range_exp, build_collating_symbol):
Prefer bitset to re_bitset_ptr_t in prototypes, when the actual
argument is a bitset. This is merely a style issue, but it makes
it clearer that an entire array is expected.
(re_compile_fastmap_iter, init_dfa, init_word_char, optimize_subexps):
* lib/regcomp.c (lower_subexp, parse_bracket_exp):
(built_charclass_op):
Port to the case where bitset_word is not the same as unsigned int.
* lib/regex_internal.h (bitset_set, bitset_clear, bitset_contain):
(bitset_not, bitset_merge, bitset_set_all, bitset_mask):
Likewise.
* lib/regexec.c (check_dst_limits_calc_pos_1):
(check_subexp_matching_top):
(build_trtable, group_nodes_into_DFAstates):
Likewise.
* lib/regcomp.c (re_compile_fastmap_iter, utf8_sb_map):
(optimize_utf8):
Don't assume that SBC_MAX is a multiple of BITSET_WORD_BITS.
* lib/regex_internal.h (bitset_set_all, bitset_not): Likewise.
* lib/regexec.c (group_nodes_into_DFAstates): Likewise.
* lib/regcomp.c (utf8_sb_map): Don't assume UINT_MAX == 0xffffffff.
* lib/regcomp.c (optimize_subexps, lower_subexp):
Work even if bitset_word has holes in its bitwise representation.
* lib/regex_internal.h (BITSET_WORD_BITS): Likewise.
* lib/regexec.c (check_dst_limits_calc_pos_1):
(heck_subexp_matching_top): Likewise.
* lib/regex_internal.c (re_string_reconstruct):
Don't assume UCHAR_MAX == 255.
* lib/regex_internal.h (bitset_set_all): Likewise.
* lib/regex_internal.h (BITSET_WORD_BITS): Renamed from UINT_BITS.
All uses changed.
(BITSET_WORDS): Renamed from BITSET_UINTS. All uses changed.
(bitset_word): New type, replacing 'unsigned int' for bitset uses.
All uses changed.
(BITSET_WORD_MAX): New macro.
(bitset_set, bitset_clear, bitset_contain, bitset_empty):
(bitset_set_all, bitset_copy): Now inline functions, not macros.
(bitset_empty, bitset_copy):
Prefer sizeof (bitset) to multiplying it out ourselves.
(bitset_not_merge): Remove; unused.
(bitset_contain): Return bool, not unsigned int with one bit on.
All callers changed.
* lib/regexec.c (build_trtable): Don't assume bitset has no stricter
alignment than re_node_set; do this by defining a new internal
type struct dests_alloc and using it to allocate memory.
* config/srclist.txt: Add glibc bug 1302.
Paul Eggert [Fri, 2 Sep 2005 22:54:59 +0000 (22:54 +0000)]
Check for arithmetic overflow when calculating sizes, to prevent
some buffer-overflow issues. These patches are conservative, in the
sense that when I couldn't determine whether an overflow was possible,
I inserted a run-time check.
* regex_internal.h (re_xmalloc, re_xrealloc, re_x2realloc): New macros.
(SIZE_MAX) [!defined SIZE_MAX]: New macro.
(re_alloc_oversized, re_x2alloc_oversized, re_xnmalloc):
(re_xnrealloc, re_x2nrealloc): New inline functions.
* lib/regcomp.c (init_dfa, analyze, build_range_exp, parse_bracket_exp):
(build_equiv_class, build_charclass): Check for arithmetic overflow
in size expression calculations.
* lib/regex_internal.c (re_string_realloc_buffers):
(build_wcs_upper_buffer, re_node_set_add_intersect):
(re_node_set_init_union, re_node_set_insert, re_node_set_insert_last):
(re_dfa_add_node, register_state): Likewise.
* lib/regexec.c (re_search_stub, re_copy_regs, re_search_internal):
(prune_impossible_nodes, push_fail_stack, set_regs, check_arrival):
(build_trtable, extend_buffers, match_ctx_init, match_ctx_add_entry):
(match_ctx_add_subtop, match_ctx_add_sublast): Likewise.
Paul Eggert [Thu, 1 Sep 2005 22:36:04 +0000 (22:36 +0000)]
* lib/glob.c (GET_LOGIN_NAME_MAX): Renamed from LOGIN_NAME_MAX,
to avoid a collision with bits/local_lim.h in glibc.
All uses changed. Problem reported by Dmitry V. Levin in
<http://sources.redhat.com/bugzilla/show_bug.cgi?id=1060>.
Paul Eggert [Thu, 1 Sep 2005 19:41:07 +0000 (19:41 +0000)]
Use bool where appropriate.
* lib/regcomp.c (re_set_fastmap): ICASE arg is bool, not int.
All callers changed.
(calc_eclosure_iter): Likewise, for ROOT arg.
(parse_bracket_element): Likewise, for ACCEPT_HYPHEN arg.
(build_charclass_op): Likewise, for NON_MATCH arg.
* lib/regex_internal.c (re_string_allocate, re_string_construct):
(re_string_construct_common): Likewise, for ICASE arg.
* lib/regexec.c (re_search_2_stub, re_search_stub):
Likewise, for RET_LEN arg.
(check_matching): Likewise, for FL_LONGEST_MATCH arg.
(set_regs): Likewise, for FL_BACKTRACK arg.
* lib/regcomp.c (re_compile_fastmap_iter, optimize_utf8):
(duplicate_node_closure, calc_inveclosure, calc_eclosure):
(calc_eclosure_iter, parse_bracket_exp):
Use bool for internal variables that are booleans.
* lib/regexec.c (re_search_internal, check_matching):
(proceed_next_node):
(set_regs, build_sifted_states, sift_states_bkref):
(check_arrival_add_next_nodes, check_arrival_expand_ecl_sub):
(expand_bkref_cache, build_trtable, group_nodes_into_DFAstates):
(find_collation_sequence_value):
Likewise.
* lib/regex_internal.c (re_node_set_insert, re_node_set_insert_last):
(re_node_set_compare):
Return bool, not int. All callers changed.
* lib/regexec.c (check_halt_node_context, check_dst_limits):
(build_trtable, check_node_accept): Likewise.
* lib/regex_internal.h: Include stdbool.h.
Fix bugs uncovered when converting to bool.
* lib/regcomp.c (calc_eclosure_iter): Check for storage allocation
failure instead of charging ahead blindly.
* lib/regex_internal.c (register_state): Likewise.
* lib/regexec.c (re_search_2_stub): Use simpler method than boolean
for freeing internal storage.
(group_nodes_into_DFA_states): Use unsigned int, not int, for
bitset pieces used as boolean, to avoid undefined behavior
on hosts that do int overflow checking.