diff options
44 files changed, 520 insertions, 552 deletions
@@ -1,3 +1,91 @@ +1998-08-03 16:36 Ulrich Drepper <drepper@cygnus.com> + + * catgets/catgets.c: Use mmap/munmap only is _POSIX_MAPPED_FILES + is defined. + * catgets/open_catalog.c: Likewise. + * iconv/iconv_prog.c: Likewise. + * intl/loadmsgcat.c: Likewise. + * locale/findlocale.c: Likewise. + * locale/loadlocale.c: Likewise. + * locale/programs/localedef.c: Likewise. + * malloc/malloc.c: Likewise. + + * elf/elf.h: Fix typo. + + * math/Makefile: Use $(LN_S) instead of ln. + + * sysdeps/generic/getpgid.c: Fix return type. + +1998-08-01 02:49 -0400 Zack Weinberg <zack@rabi.phys.columbia.edu> + + * sysdeps/posix/tempname.c (__stdio_gen_tempname): Rename to + __gen_tempname and simplify the interface. Strip out the + code to do path search and create FILE objects. This function + now takes a mktemp() style template and returns either a name + or a file descriptor. + (__path_search): New function; searches for directories for + temp files. + * sysdeps/generic/tempname.c: Stub out __gen_tempname and + __path_search, not __stdio_gen_tempname. + + * libio/stdio.h: Prototype __gen_tempname and __path_search, + not __stdio_gen_tempname. + * stdio/stdio.h: Likewise. + + * stdio-common/tempnam.c: Use __path_search and __gen_tempname. + * stdio-common/tmpfile.c: Likewise. + * stdio-common/tmpfile64.c: Likewise. + * stdio-common/tmpnam.c: Likewise. + * stdio-common/tmpnam_r.c: Likewise. + + * misc/mkstemp.c: New file. Use __gen_tempname. + * misc/mktemp.c: Likewise. + + * sysdeps/posix/mkstemp.c: Removed. + * sysdeps/posix/mktemp.c: Removed. + * sysdeps/generic/mkstemp.c: Removed. + * sysdeps/generic/mktemp.c: Removed. + +1998-08-02 Thorsten Kukuk <kukuk@vt.uni-paderborn.de> + + * configure.in: Check, if door add-on is installed. + * config.make.in: Add have_doors. + * sunrpc/Makefile: Add HAVE_DOOR define. + * sunrpc/key_call.c: Add keyserv/door interface. + + * sunrpc/svc_unix.c: Call setsockopt only if SO_PASSCRED is defined. + * sunrpc/clnt_unix.c: Likewise. + +1998-08-02 Andreas Jaeger <aj@arthur.rhein-neckar.de> + + * inet/netinet/in.h (IN_CLASSC): Correct mask. + Reported by Ian Staniforth <I.Staniforth@sheffield.ac.uk> [fixes + PR libc/727]. + +1998-08-03 10:23 Ulrich Drepper <drepper@cygnus.com> + + * misc/Makefile: Fix installation problem with --disable-shared. + * posix/Makefile: Likewise. + +1998-08-02 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * posix/regex.c (re_search_2): Optimize searching for anchored + pattern if '^' cannot match at embedded newlines. + (regerror): Renamed from __regerror, which it should only be + called if _LIBC. + +1998-07-31 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * sunrpc/svc_unix.c (__msgread): Check setsockopt return value. + +1998-07-31 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * sysdeps/generic/glob.c: Remove obsolete cast. + +1998-07-31 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * Rules (tests): Fix last change. + 1998-07-31 17:59 Ulrich Drepper <drepper@cygnus.com> * sysdeps/unix/sysv/linux/Makefile [subdir==misc] (sysdep_routines): @@ -89,12 +89,14 @@ else others: $(addprefix $(objpfx),$(extra-objs)) endif ifeq ($(cross-compiling),yes) -tests: $(addprefix $(objpfx),$(tests) $(tests-static) $(test-srcs)) +tests: $(addprefix $(objpfx),$(tests) $(test-srcs)) +ifeq ($(build-static),yes) +tests: $(addprefix $(objpfx),$(tests-static)) +endif else -ifneq (($build-static),yes) tests: $(tests:%=$(objpfx)%.out) -else -tests: $(tests:%=$(objpfx)%.out) $(tests-static:%=$(objpfx)%.sout) +ifeq ($(build-static),yes) +tests: $(tests-static:%=$(objpfx)%.sout) endif endif diff --git a/catgets/catgets.c b/catgets/catgets.c index ebfb2c5..b5de2fb 100644 --- a/catgets/catgets.c +++ b/catgets/catgets.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. @@ -166,15 +166,18 @@ catclose (nl_catd catalog_desc) catalog = (__nl_catd) catalog_desc; +#ifdef _POSIX_MAPPED_FILES if (catalog->status == mmapped) __munmap ((void *) catalog->file_ptr, catalog->file_size); - else if (catalog->status == malloced) - free ((void *) catalog->file_ptr); - else if (catalog->status != closed && catalog->status != nonexisting) - { - __set_errno (EBADF); - return -1; - } + else +#endif /* _POSIX_MAPPED_FILES */ + if (catalog->status == malloced) + free ((void *) catalog->file_ptr); + else if (catalog->status != closed && catalog->status != nonexisting) + { + __set_errno (EBADF); + return -1; + } if (catalog->nlspath) free ((void *) catalog->nlspath); diff --git a/catgets/open_catalog.c b/catgets/open_catalog.c index deaa871..e4b61d7 100644 --- a/catgets/open_catalog.c +++ b/catgets/open_catalog.c @@ -24,7 +24,9 @@ #include <string.h> #include <stdlib.h> #include <unistd.h> -#include <sys/mman.h> +#ifdef _POSIX_MAPPED_FILES +# include <sys/mman.h> +#endif #include <sys/stat.h> #include "catgetsinfo.h" @@ -194,19 +196,20 @@ __open_catalog (__nl_catd catalog) goto unlock_return; } -#ifndef MAP_COPY + catalog->file_size = st.st_size; +#ifdef _POSIX_MAPPED_FILES +# ifndef MAP_COPY /* Linux seems to lack read-only copy-on-write. */ -# define MAP_COPY MAP_PRIVATE -#endif -#ifndef MAP_FILE +# define MAP_COPY MAP_PRIVATE +# endif +# ifndef MAP_FILE /* Some systems do not have this flag; it is superfluous. */ -# define MAP_FILE 0 -#endif -#ifndef MAP_INHERIT +# define MAP_FILE 0 +# endif +# ifndef MAP_INHERIT /* Some systems might lack this; they lose. */ -# define MAP_INHERIT 0 -#endif - catalog->file_size = st.st_size; +# define MAP_INHERIT 0 +# endif catalog->file_ptr = (struct catalog_obj *) __mmap (NULL, st.st_size, PROT_READ, MAP_FILE|MAP_COPY|MAP_INHERIT, fd, 0); @@ -214,6 +217,7 @@ __open_catalog (__nl_catd catalog) /* Tell the world we managed to mmap the file. */ catalog->status = mmapped; else +#endif /* _POSIX_MAPPED_FILES */ { /* mmap failed perhaps because the system call is not implemented. Try to load the file. */ @@ -258,9 +262,11 @@ __open_catalog (__nl_catd catalog) invalid_file: /* Invalid file. Free the resources and mark catalog as not usable. */ +#ifdef _POSIX_MAPPED_FILES if (catalog->status == mmapped) __munmap ((void *) catalog->file_ptr, catalog->file_size); else +#endif /* _POSIX_MAPPED_FILES */ free (catalog->file_ptr); catalog->status = nonexisting; goto unlock_return; diff --git a/config.make.in b/config.make.in index 9f8ea0a..6b4dc7a 100644 --- a/config.make.in +++ b/config.make.in @@ -40,6 +40,7 @@ old-glibc-headers = @old_glibc_headers@ versioning = @VERSIONING@ no-whole-archive = @no_whole_archive@ exceptions = @exceptions@ +have_doors = @linux_doors@ have-bash2 = @libc_cv_have_bash2@ have-ksh = @libc_cv_have_ksh@ @@ -2879,6 +2879,12 @@ echo "$ac_t""$pic_default" 1>&6 +case "$add_ons" in + *door*) linux_doors=yes ;; + *) linux_doors=no ;; +esac + + if test "`(cd $srcdir; pwd)`" = "`pwd`"; then config_makefile= else @@ -3083,6 +3089,7 @@ s%@bounded@%$bounded%g s%@static_nss@%$static_nss%g s%@nopic_initfini@%$nopic_initfini%g s%@DEFINES@%$DEFINES%g +s%@linux_doors@%$linux_doors%g s%@VERSION@%$VERSION%g s%@RELEASE@%$RELEASE%g diff --git a/configure.in b/configure.in index 2f7f925..0364918 100644 --- a/configure.in +++ b/configure.in @@ -1168,6 +1168,12 @@ AC_SUBST(nopic_initfini) AC_SUBST(DEFINES) +case "$add_ons" in + *door*) linux_doors=yes ;; + *) linux_doors=no ;; +esac +AC_SUBST(linux_doors) + if test "`(cd $srcdir; pwd)`" = "`pwd`"; then config_makefile= else @@ -1170,7 +1170,7 @@ typedef struct #define DT_MIPS_AUX_DYNAMIC 0x70000031 /* Address of aux .dynamic. */ #define DT_MIPS_NUM 0x32 -/* Legal values for DT_MIPS_FLAG Elf32_Dyn entry. */ +/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry. */ #define RHF_NONE 0 /* No flags */ #define RHF_QUICKSTART (1 << 0) /* Use quickstart */ diff --git a/iconv/iconv_prog.c b/iconv/iconv_prog.c index 82ff5cf..f12a690 100644 --- a/iconv/iconv_prog.c +++ b/iconv/iconv_prog.c @@ -30,7 +30,9 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> -#include <sys/mman.h> +#ifdef _POSIX_MAPPED_FILES +# include <sys/mman.h> +#endif #include <gconv_int.h> /* Get libc version number. */ @@ -176,6 +178,7 @@ main (int argc, char *argv[]) continue; } +#ifdef _POSIX_MAPPED_FILES /* We have possibilities for reading the input file. First try to mmap() it since this will provide the fastest solution. */ if (fstat (fd, &st) == 0 @@ -206,6 +209,7 @@ main (int argc, char *argv[]) munmap ((void *) addr, st.st_size); } else +#endif /* _POSIX_MAPPED_FILES */ { /* Read the file in pieces. */ if (process_fd (cd, fd, output) != 0) diff --git a/include/bits/cmathcalls.h b/include/bits/cmathcalls.h new file mode 100644 index 0000000..dd02960 --- /dev/null +++ b/include/bits/cmathcalls.h @@ -0,0 +1 @@ +#include <math/bits/cmathcalls.h> diff --git a/include/complex.h b/include/complex.h new file mode 100644 index 0000000..acf8cf1 --- /dev/null +++ b/include/complex.h @@ -0,0 +1 @@ +#include <math/complex.h> diff --git a/include/execinfo.h b/include/execinfo.h new file mode 100644 index 0000000..d5c5216 --- /dev/null +++ b/include/execinfo.h @@ -0,0 +1 @@ +#include <debug/execinfo.h> diff --git a/include/fenv.h b/include/fenv.h new file mode 100644 index 0000000..b2da084 --- /dev/null +++ b/include/fenv.h @@ -0,0 +1 @@ +#include <math/fenv.h> diff --git a/inet/netinet/in.h b/inet/netinet/in.h index ddc0975..418c6f9 100644 --- a/inet/netinet/in.h +++ b/inet/netinet/in.h @@ -118,7 +118,7 @@ struct in_addr #define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET) #define IN_CLASSB_MAX 65536 -#define IN_CLASSC(a) ((((uint32_t) (a)) & 0xc0000000) == 0xc0000000) +#define IN_CLASSC(a) ((((uint32_t) (a)) & 0xe0000000) == 0xc0000000) #define IN_CLASSC_NET 0xffffff00 #define IN_CLASSC_NSHIFT 8 #define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET) diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c index f6214e1..480e6bc 100644 --- a/intl/loadmsgcat.c +++ b/intl/loadmsgcat.c @@ -35,8 +35,13 @@ # include <unistd.h> #endif -#if (defined HAVE_MMAP && defined HAVE_MUNMAP) || defined _LIBC +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || (defined _LIBC && defined _POSIX_MAPPED_FILES) # include <sys/mman.h> +# undef HAVE_MMAP +# define HAVE_MMAP 1 +#else +# undef HAVE_MMAP #endif #include "gettext.h" @@ -72,10 +77,7 @@ _nl_load_domain (domain_file) size_t size; struct stat st; struct mo_file_header *data = (struct mo_file_header *) -1; -#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ - || defined _LIBC int use_mmap = 0; -#endif struct loaded_domain *domain; domain_file->decided = 1; @@ -103,8 +105,7 @@ _nl_load_domain (domain_file) return; } -#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ - || defined _LIBC +#ifdef HAVE_MMAP /* Now we are ready to load the file. If mmap() is available we try this first. If not available or it failed we try to load it. */ data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, @@ -153,8 +154,7 @@ _nl_load_domain (domain_file) if (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED) { /* The magic number is wrong: not a message catalog file. */ -#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ - || defined _LIBC +#ifdef HAVE_MMAP if (use_mmap) munmap ((caddr_t) data, size); else @@ -188,9 +188,8 @@ _nl_load_domain (domain_file) ((char *) data + W (domain->must_swap, data->hash_tab_offset)); break; default: - /* This is an illegal revision. */ -#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ - || defined _LIBC + /* This is an invalid revision. */ +#ifdef HAVE_MMAP if (use_mmap) munmap ((caddr_t) data, size); else @@ -213,9 +212,11 @@ internal_function _nl_unload_domain (domain) struct loaded_domain *domain; { +#ifdef _POSIX_MAPPED_FILES if (domain->use_mmap) munmap ((caddr_t) domain->data, domain->mmap_size); else +#endif /* _POSIX_MAPPED_FILES */ free ((void *) domain->data); free (domain); diff --git a/libio/stdio.h b/libio/stdio.h index a3ae40b..7b5e4f8 100644 --- a/libio/stdio.h +++ b/libio/stdio.h @@ -72,15 +72,12 @@ typedef _G_fpos64_t fpos_t; typedef _G_fpos64_t fpos64_t; #endif -/* Generate a unique file name (and possibly open it with mode "w+b"). */ -extern char *__stdio_gen_tempname __P ((char *__buf, size_t __bufsize, - __const char *__dir, - __const char *__pfx, - int __dir_search, - size_t *__lenptr, - FILE **__streamptr, - int __large_file)); +/* Generate a unique file name (and possibly open it). */ +extern int __path_search __P ((char *__tmpl, size_t __tmpl_len, + __const char *__dir, + __const char *__pfx)); +extern int __gen_tempname __P ((char *__tmpl, int __openit, int __large_file)); /* Print out MESSAGE on the error output and abort. */ extern void __libc_fatal __P ((__const char *__message)) diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index c3f7dc3..47d8417 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,8 @@ +1998-08-02 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * Makefile (linuxthreads-version): Extract correct number from + Banner. + 1998-07-29 Xavier Leroy <Xavier.Leroy@inria.fr> * Banner: Bump version number to 0.8 diff --git a/linuxthreads/Makefile b/linuxthreads/Makefile index b7444e7..742be86 100644 --- a/linuxthreads/Makefile +++ b/linuxthreads/Makefile @@ -21,7 +21,8 @@ # subdir := linuxthreads -linuxthreads-version=0.7 +linuxthreads-version := $(shell sed -n 's/^.*$(subdir)-\([0-9.]*\).*$$/\1/p' \ + Banner) headers := pthread.h semaphore.h bits/semaphore.h distribute := internals.h queue.h restart.h spinlock.h diff --git a/locale/findlocale.c b/locale/findlocale.c index e2fdd06..af2b364 100644 --- a/locale/findlocale.c +++ b/locale/findlocale.c @@ -21,7 +21,9 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> -#include <sys/mman.h> +#ifdef _POSIX_MAPPED_FILES +# include <sys/mman.h> +#endif #include "localeinfo.h" @@ -211,6 +213,7 @@ _nl_remove_locale (int locale, struct locale_data *data) /* Free the name. */ free ((char *) data->name); +#ifdef _POSIX_MAPPED_FILES /* Really delete the data. First delete the real data. */ if (data->mmaped) { @@ -223,6 +226,7 @@ _nl_remove_locale (int locale, struct locale_data *data) } } else +#endif /* _POSIX_MAPPED_FILES */ /* The memory was malloced. */ free ((void *) data->filedata); diff --git a/locale/loadlocale.c b/locale/loadlocale.c index d856063..8649abb 100644 --- a/locale/loadlocale.c +++ b/locale/loadlocale.c @@ -23,7 +23,9 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> -#include <sys/mman.h> +#ifdef _POSIX_MAPPED_FILES +# include <sys/mman.h> +#endif #include <sys/stat.h> #include "localeinfo.h" @@ -113,24 +115,32 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) /* Map in the file's data. */ save_err = errno; -#ifndef MAP_COPY +#ifdef _POSIX_MAPPED_FILES +# ifndef MAP_COPY /* Linux seems to lack read-only copy-on-write. */ -#define MAP_COPY MAP_PRIVATE -#endif -#ifndef MAP_FILE +# define MAP_COPY MAP_PRIVATE +# endif +# ifndef MAP_FILE /* Some systems do not have this flag; it is superfluous. */ -#define MAP_FILE 0 -#endif -#ifndef MAP_INHERIT +# define MAP_FILE 0 +# endif +# ifndef MAP_INHERIT /* Some systems might lack this; they lose. */ -#define MAP_INHERIT 0 -#endif +# define MAP_INHERIT 0 +# endif filedata = (void *) __mmap ((caddr_t) 0, st.st_size, PROT_READ, MAP_FILE|MAP_COPY|MAP_INHERIT, fd, 0); - if ((void *) filedata == MAP_FAILED) + if ((void *) filedata != MAP_FAILED) + { + if (st.st_size < sizeof (*filedata)) + /* This cannot be a locale data file since it's too small. */ + goto puntfd; + } + else { if (errno == ENOSYS) { +#endif /* _POSIX_MAPPED_FILES */ /* No mmap; allocate a buffer and read from the file. */ mmaped = 0; filedata = malloc (st.st_size); @@ -156,13 +166,12 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) else goto puntfd; __set_errno (save_err); +#ifdef _POSIX_MAPPED_FILES } else goto puntfd; } - else if (st.st_size < sizeof (*filedata)) - /* This cannot be a locale data file since it's too small. */ - goto puntfd; +#endif /* _POSIX_MAPPED_FILES */ if (filedata->magic == LIMAGIC (category)) /* Good data file in our byte order. */ @@ -175,7 +184,12 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) /* Bad data file in either byte order. */ { puntmap: - __munmap ((caddr_t) filedata, st.st_size); +#ifdef _POSIX_MAPPED_FILES + if (mmaped) + __munmap ((caddr_t) filedata, st.st_size); + else +#endif /* _POSIX_MAPPED_FILES */ + free (filedata); puntfd: __close (fd); return; @@ -228,9 +242,11 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) void _nl_unload_locale (struct locale_data *locale) { +#ifdef _POSIX_MAPPED_FILES if (locale->mmaped) __munmap ((caddr_t) locale->filedata, locale->filesize); else +#endif free ((void *) locale->filedata); free (locale); diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c index 6d32a3f..94d6255 100644 --- a/locale/programs/localedef.c +++ b/locale/programs/localedef.c @@ -30,7 +30,9 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> -#include <sys/mman.h> +#ifdef _POSIX2_LOCALEDEF +# include <sys/mman.h> +#endif #include <sys/stat.h> #include "error.h" @@ -276,10 +278,12 @@ cannot `stat' locale file `%s'"), fname); localedef->len[cat] = st.st_size; +#ifdef _POSIX_MAPPED_FILES localedef->categories[cat].generic = mmap (NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if (localedef->categories[cat].generic == MAP_FAILED) +#endif /* _POSIX_MAPPED_FILES */ { size_t left = st.st_size; void *read_ptr; diff --git a/malloc/malloc.c b/malloc/malloc.c index 9c99c67..3d932db 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -493,6 +493,10 @@ do { \ #endif +#ifndef LACKS_UNISTD_H +# include <unistd.h> +#endif + /* Define HAVE_MMAP to optionally make malloc() use mmap() to allocate very large blocks. These will be returned to the @@ -500,7 +504,9 @@ do { \ */ #ifndef HAVE_MMAP -#define HAVE_MMAP 1 +# ifdef _POSIX_MAPPED_FILES +# define HAVE_MMAP 1 +# endif #endif /* @@ -541,10 +547,6 @@ do { \ bsd/gnu getpagesize.h */ -#ifndef LACKS_UNISTD_H -# include <unistd.h> -#endif - #ifndef malloc_getpagesize # ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ # ifndef _SC_PAGE_SIZE diff --git a/math/Makefile b/math/Makefile index 4bd9580..6930b20 100644 --- a/math/Makefile +++ b/math/Makefile @@ -140,7 +140,7 @@ override CFLAGS += -Wno-uninitialized -Wno-write-strings # It's not a library to make sure it is linked in instead of s_lib_version.o. $(objpfx)libieee.a: $(objpfx)ieee-math.o rm -f $@ - ln $< $@ + $(LN_S) $< $@ ifeq ($(build-shared),yes) $(addprefix $(objpfx),$(tests)): $(objpfx)libm.so$(libm.so-version) diff --git a/misc/Makefile b/misc/Makefile index 7a233f5..d7982d2 100644 --- a/misc/Makefile +++ b/misc/Makefile @@ -57,6 +57,9 @@ routines := brk sbrk sstk ioctl \ hsearch hsearch_r tsearch lsearch \ err error ustat \ getsysstats dirname regexp + +include ../Makeconfig + aux := init-misc ifeq ($(build-static),yes) install-lib := libbsd-compat.a libg.a diff --git a/sysdeps/generic/mkstemp.c b/misc/mkstemp.c index c84e8eb..3fa033b 100644 --- a/sysdeps/generic/mkstemp.c +++ b/misc/mkstemp.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 1995, 1996 Free Software Foundation, Inc. +/* Copyright (C) 1998 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,27 +16,17 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include <stdlib.h> -#include <string.h> #include <errno.h> +#include <stdio.h> +#include <unistd.h> /* Generate a unique temporary file name from TEMPLATE. The last six characters of TEMPLATE must be "XXXXXX"; they are replaced with a string that makes the filename unique. - Returns a file descriptor open on the file for reading and writing. */ + Then open the file and return a fd. */ int mkstemp (template) char *template; { - if (strcmp (&template[strlen (template) - 6], "XXXXXX")) - { - __set_errno (EINVAL); - return -1; - } - - __set_errno (ENOSYS); - return -1; + return __gen_tempname (template, 1, 0); } - -stub_warning (mkstemp) -#include <stub-tag.h> diff --git a/sysdeps/generic/mktemp.c b/misc/mktemp.c index 7d53f01..b2abc5d 100644 --- a/sysdeps/generic/mktemp.c +++ b/misc/mktemp.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1995, 1996 Free Software Foundation, Inc. +/* Copyright (C) 1998 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,9 +16,9 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include <stdlib.h> -#include <string.h> #include <errno.h> +#include <stdio.h> +#include <unistd.h> /* Generate a unique temporary file name from TEMPLATE. The last six characters of TEMPLATE must be "XXXXXX"; @@ -27,15 +27,9 @@ char * mktemp (template) char *template; { - if (strcmp (&template[strlen (template) - 6], "XXXXXX")) - { - __set_errno (EINVAL); - return template; - } + if (__gen_tempname (template, 0, 0) < 0) + /* We return the null string if we can't find a unique file name. */ + template[0] = '\0'; - __set_errno (ENOSYS); - return NULL; + return template; } - -stub_warning (mktemp) -#include <stub-tag.h> diff --git a/posix/Makefile b/posix/Makefile index daf4960..201cb78 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -52,6 +52,8 @@ routines := \ getaddrinfo gai_strerror wordexp \ pread pwrite pread64 pwrite64 +include ../Makeconfig + aux := init-posix environ tests := tstgetopt testfnm runtests wordexp-test runptests test-srcs := globtest diff --git a/posix/regex.c b/posix/regex.c index 62c41c1..484e13d 100644 --- a/posix/regex.c +++ b/posix/regex.c @@ -3525,7 +3525,11 @@ re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop) /* If the search isn't to be a backwards one, don't waste time in a search for a pattern that must be anchored. */ - if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == begbuf && range > 0) + if (bufp->used > 0 && range > 0 + && ((re_opcode_t) bufp->buffer[0] == begbuf + /* `begline' is like `begbuf' if it cannot match at newlines. */ + || ((re_opcode_t) bufp->buffer[0] == begline + && !bufp->newline_anchor))) { if (startpos > 0) return -1; @@ -5737,7 +5741,7 @@ weak_alias (__regexec, regexec) from either regcomp or regexec. We don't use PREG here. */ size_t -__regerror (errcode, preg, errbuf, errbuf_size) +regerror (errcode, preg, errbuf, errbuf_size) int errcode; const regex_t *preg; char *errbuf; diff --git a/stdio-common/tempnam.c b/stdio-common/tempnam.c index 987fbbb..8683643 100644 --- a/stdio-common/tempnam.c +++ b/stdio-common/tempnam.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1993, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1993, 1996, 1997, 1998 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,13 +16,9 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include <errno.h> -#include <stddef.h> #include <stdio.h> -#include <stdlib.h> #include <string.h> - /* Generate a unique temporary filename using up to five characters of PFX if it is not NULL. The directory to put this file in is searched for as follows: First the environment variable "TMPDIR" is checked. @@ -34,17 +30,12 @@ char * tempnam (const char *dir, const char *pfx) { char buf[FILENAME_MAX]; - size_t len; - char *s; - char *t = __stdio_gen_tempname (buf, sizeof (buf), dir, pfx, 1, - &len, (FILE **) NULL, 0); - if (t == NULL) + if (__path_search (buf, FILENAME_MAX, dir, pfx)) return NULL; - s = (char *) malloc (len); - if (s == NULL) + if (__gen_tempname (buf, 0, 0)) return NULL; - return (char *) memcpy (s, t, len); + return strdup (buf); } diff --git a/stdio-common/tmpfile.c b/stdio-common/tmpfile.c index c3afd3f..488b43b 100644 --- a/stdio-common/tmpfile.c +++ b/stdio-common/tmpfile.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1993, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1993, 1996, 1997, 1998 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 @@ -18,6 +18,9 @@ #include <stdio.h> +#ifdef _USE_IN_LIBIO +# define fdopen _IO_new_fdopen +#endif /* This returns a new stream opened on a temporary file (generated by tmpnam) The file is opened with mode "w+b" (binary read/write). @@ -27,17 +30,20 @@ FILE * tmpfile () { char buf[FILENAME_MAX]; - char *filename; + int fd; FILE *f; - filename = __stdio_gen_tempname (buf, sizeof (buf), (char *) NULL, "tmpf", 0, - (size_t *) NULL, &f, 0); - if (filename == NULL) + if (__path_search (buf, FILENAME_MAX, NULL, "tmpf")) + return NULL; + if ((fd = __gen_tempname (buf, 1, 0)) < 0) return NULL; /* Note that this relies on the Unix semantics that a file is not really removed until it is closed. */ - (void) remove (filename); + (void) remove (buf); + + if ((f = fdopen (fd, "w+b")) == NULL) + close (fd); return f; } diff --git a/stdio-common/tmpfile64.c b/stdio-common/tmpfile64.c index 5a6e323..5854f14 100644 --- a/stdio-common/tmpfile64.c +++ b/stdio-common/tmpfile64.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1993, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1993, 1996, 1997, 1998 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 @@ -19,6 +19,9 @@ #include <errno.h> #include <stdio.h> +#ifdef _USE_IN_LIBIO +# define fdopen _IO_new_fdopen +#endif /* This returns a new stream opened on a temporary file (generated by tmpnam) The file is opened with mode "w+b" (binary read/write). @@ -27,23 +30,21 @@ FILE * tmpfile64 () { -#ifdef _G_OPEN64 char buf[FILENAME_MAX]; - char *filename; + int fd; FILE *f; - filename = __stdio_gen_tempname (buf, sizeof (buf), (char *) NULL, "tmpf", 0, - (size_t *) NULL, &f, 1); - if (filename == NULL) + if (__path_search (buf, FILENAME_MAX, NULL, "tmpf")) + return NULL; + if ((fd = __gen_tempname (buf, 1, 1)) < 0) return NULL; /* Note that this relies on the Unix semantics that a file is not really removed until it is closed. */ - (void) remove (filename); + (void) remove (buf); + + if ((f = fdopen (fd, "w+b")) == NULL) + close (fd); return f; -#else - __set_errno (ENOSYS); - return NULL; -#endif } diff --git a/stdio-common/tmpnam.c b/stdio-common/tmpnam.c index 3389ff5..e5c6bf1 100644 --- a/stdio-common/tmpnam.c +++ b/stdio-common/tmpnam.c @@ -19,7 +19,6 @@ #include <stdio.h> #include <string.h> - /* Generate a unique filename in P_tmpdir. This function is *not* thread safe! */ @@ -30,20 +29,21 @@ tmpnam (char *s) where S != NULL. */ static char buf[L_tmpnam]; char tmpbuf[L_tmpnam]; - char *result; /* In the following call we use the buffer pointed to by S if non-NULL although we don't know the size. But we limit the size - to FILENAME_MAX characters in any case. */ - result = __stdio_gen_tempname (s ?: tmpbuf, L_tmpnam, (const char *) NULL, - (const char *) NULL, 0, - (size_t *) NULL, (FILE **) NULL, 0); + to L_tmpnam characters in any case. */ + if (__path_search (s ? : tmpbuf, L_tmpnam, NULL, NULL)) + return NULL; + + if (__gen_tempname (s ? : tmpbuf, 0, 0)) + return NULL; - if (result != NULL && s == NULL) + if (s == NULL) { - memcpy (buf, result, L_tmpnam); - result = buf; + memcpy (buf, tmpbuf, L_tmpnam); + return buf; } - - return result; + else + return s; } diff --git a/stdio-common/tmpnam_r.c b/stdio-common/tmpnam_r.c index 5e67cc6..07c4650 100644 --- a/stdio-common/tmpnam_r.c +++ b/stdio-common/tmpnam_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1993, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1993, 1996, 1997, 1998 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 @@ -17,8 +17,6 @@ Boston, MA 02111-1307, USA. */ #include <stdio.h> -#include <string.h> - /* Generate a unique filename in P_tmpdir. If S is NULL return NULL. This makes this function thread safe. */ @@ -28,10 +26,10 @@ tmpnam_r (char *s) if (s == NULL) return NULL; - /* In the following call we use the buffer pointed to by S if - non-NULL although we don't know the size. But we limit the size - to L_tmpnam characters in any case. */ - return __stdio_gen_tempname (s, L_tmpnam, (const char *) NULL, - (const char *) NULL, 0, - (size_t *) NULL, (FILE **) NULL, 0); + if (__path_search (s, L_tmpnam, NULL, NULL)) + return NULL; + if (__gen_tempname (s, 0, 0)) + return NULL; + + return s; } diff --git a/stdio/stdio.h b/stdio/stdio.h index 7594f13..2214302 100644 --- a/stdio/stdio.h +++ b/stdio/stdio.h @@ -155,14 +155,13 @@ extern int __stdio_open __P ((__const char *__file, __io_mode __m, __ptr_t *__cookieptr)); /* Put out an error message for when stdio needs to die. */ extern void __stdio_errmsg __P ((__const char *__msg, size_t __len)); -/* Generate a unique file name (and possibly open it with mode "w+b"). */ -extern char *__stdio_gen_tempname __P ((char *__buf, size_t __bufsize, - __const char *__dir, - __const char *__pfx, - int __dir_search, - size_t *__lenptr, - FILE **__streamptr, - int __large_file)); + +/* Generate a unique file name (and possibly open it). */ +extern int __path_search __P ((char *__tmpl, size_t __tmpl_len, + __const char *__dir, + __const char *__pfx)); + +extern int __gen_tempname __P ((char *__tmpl, int __openit, int __large_file)); /* Print out MESSAGE on the error output and abort. */ diff --git a/sunrpc/Makefile b/sunrpc/Makefile index 2dac993..c96fe4f 100644 --- a/sunrpc/Makefile +++ b/sunrpc/Makefile @@ -109,6 +109,10 @@ CFLAGS-xnfs_prot.c = -Wno-unused CFLAGS-xrquota.c = -Wno-unused CFLAGS-xkey_prot.c = -Wno-unused +ifeq (yes,$(have_doors)) +CPPFLAGS-key_call.c += -DHAVE_DOORS=1 +endif + include ../Rules $(objpfx)rpcgen: $(addprefix $(objpfx),$(rpcgen-objs)) \ diff --git a/sunrpc/clnt_unix.c b/sunrpc/clnt_unix.c index 64b9ca9..ad12d5f 100644 --- a/sunrpc/clnt_unix.c +++ b/sunrpc/clnt_unix.c @@ -458,7 +458,10 @@ __msgread (int sock, void *buf, size_t cnt) msg.msg_controllen = sizeof(struct cmessage); msg.msg_flags = 0; - setsockopt (sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof (on)); +#ifdef SO_PASSCRED + if (setsockopt (sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof (on))) + return -1; +#endif return recvmsg (sock, &msg, 0); } diff --git a/sunrpc/key_call.c b/sunrpc/key_call.c index 0219eaf..0aa49cc 100644 --- a/sunrpc/key_call.c +++ b/sunrpc/key_call.c @@ -32,8 +32,8 @@ /* * The original source is from the RPCSRC 4.0 package from Sun Microsystems. - * The Interface to keyserver protocoll 2 was added by - * Thorsten Kukuk <kukuk@vt.uni-paderborn.de> + * The Interface to keyserver protocoll 2, RPC over AF_UNIX und Linux/doors + * was added by Thorsten Kukuk <kukuk@vt.uni-paderborn.de> */ #include <stdio.h> @@ -50,6 +50,10 @@ #include <rpc/key_prot.h> #include <bits/libc-lock.h> +#ifdef HAVE_DOORS +# include "door/door.h" +#endif + #define KEY_TIMEOUT 5 /* per-try timeout in seconds */ #define KEY_NRETRY 12 /* number of retries */ @@ -479,13 +483,82 @@ key_call_socket (u_long proc, xdrproc_t xdr_arg, char *arg, return result; } -/* returns 0 on failure, 1 on success */ +#ifdef HAVE_DOORS +/* returns 0 on failure, 1 on success */ +static int +internal_function +key_call_door (u_long proc, xdrproc_t xdr_arg, char *arg, + xdrproc_t xdr_rslt, char *rslt) +{ + XDR xdrs; + int fd; + door_arg_t args; + char *data_ptr; + u_long data_len = 0; + char res[255]; + + if ((fd = open("/var/run/keyservdoor", O_RDONLY)) < 0) + return 0; + res[0] = 0; + + data_len = xdr_sizeof (xdr_arg, arg); + data_ptr = calloc (1, data_len + 2 * sizeof (u_long)); + if (data_ptr == NULL) + return 0; + + xdrmem_create (&xdrs, &data_ptr[2 * sizeof (u_long)], data_len, XDR_ENCODE); + if (!xdr_arg (&xdrs, arg)) + { + xdr_destroy (&xdrs); + free (data_ptr); + return 0; + } + xdr_destroy (&xdrs); + + memcpy (data_ptr, &proc, sizeof (u_long)); + memcpy (&data_ptr[sizeof (proc)], &data_len, sizeof (u_long)); + + args.data_ptr = data_ptr; + args.data_size = data_len + 2 * sizeof (u_long); + args.desc_ptr = NULL; + args.desc_num = 0; + args.rbuf = res; + args.rsize = sizeof (res); + + if (__door_call (fd, &args) < 0) + return 0; + + free (data_ptr); + close (fd); + + memcpy (&data_len, args.data_ptr, sizeof (u_long)); + if (data_len != 0) + return 0; + + memcpy (&data_len, &args.data_ptr[sizeof (u_long)], sizeof (u_long)); + xdrmem_create (&xdrs, &args.data_ptr[2 * sizeof (u_long)], + data_len, XDR_DECODE); + if (!xdr_rslt (&xdrs, rslt)) + { + xdr_destroy (&xdrs); + return 0; + } + xdr_destroy (&xdrs); + + return 1; +} +#endif + +/* returns 0 on failure, 1 on success */ static int internal_function key_call (u_long proc, xdrproc_t xdr_arg, char *arg, xdrproc_t xdr_rslt, char *rslt) { static int use_keyenvoy = 0; +#ifdef HAVE_DOORS + static int use_doors = 1; +#endif if (proc == KEY_ENCRYPT_PK && __key_encryptsession_pk_LOCAL) { @@ -509,6 +582,14 @@ key_call (u_long proc, xdrproc_t xdr_arg, char *arg, return 1; } +#ifdef HAVE_DOORS + if (use_doors) + { + if (key_call_door (proc, xdr_arg, arg, xdr_rslt, rslt)) + return 1; + use_doors = 0; + } +#endif if (!use_keyenvoy) { if (key_call_socket (proc, xdr_arg, arg, xdr_rslt, rslt)) diff --git a/sunrpc/svc_unix.c b/sunrpc/svc_unix.c index a8ed534..c42d30e 100644 --- a/sunrpc/svc_unix.c +++ b/sunrpc/svc_unix.c @@ -307,7 +307,10 @@ __msgread (int sock, void *buf, size_t cnt) msg.msg_controllen = sizeof (struct cmessage); msg.msg_flags = 0; - setsockopt (sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof (on)); +#ifdef SO_PASSCRED + if (setsockopt (sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof (on))) + return -1; +#endif return recvmsg (sock, &msg, 0); } diff --git a/sysdeps/generic/getpgid.c b/sysdeps/generic/getpgid.c index 7423e11..7ae2151 100644 --- a/sysdeps/generic/getpgid.c +++ b/sysdeps/generic/getpgid.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1995, 1996, 1997, 1998 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,7 +20,7 @@ #include <sys/types.h> /* Get the process group ID of process PID. */ -int +pid_t __getpgid (pid) pid_t pid; { diff --git a/sysdeps/generic/glob.c b/sysdeps/generic/glob.c index bd92d68..5fc094e 100644 --- a/sysdeps/generic/glob.c +++ b/sysdeps/generic/glob.c @@ -511,7 +511,7 @@ glob (pattern, flags, errfunc, pglob) case is nothing but a notation for a directory. */ if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~') { - dirname = (char *) pattern; + dirname = pattern; dirlen = strlen (pattern); /* Set FILENAME to NULL as a special flag. This is ugly but diff --git a/sysdeps/generic/tempname.c b/sysdeps/generic/tempname.c index f5d1ed0..c17d869 100644 --- a/sysdeps/generic/tempname.c +++ b/sysdeps/generic/tempname.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 93, 95, 96, 97 Free Software Foundation, Inc. +/* Copyright (C) 1991, 92, 93, 95, 96, 97, 98 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,31 +16,39 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include <errno.h> +#define __need_size_t +#include <stddef.h> #include <stdio.h> +#include <errno.h> -/* Generate a (hopefully) unique temporary filename - in DIR (if applicable), using prefix PFX. - If DIR_SEARCH is nonzero, perform directory searching - malarkey as per the SVID for tempnam. - Return the generated filename or NULL if one could not - be generated, putting the length of the string in *LENPTR. */ -char * -__stdio_gen_tempname (buf, bufsize, dir, pfx, dir_search, lenptr, streamptr, - large_file) - char *buf; - size_t bufsize; +/* Perform the "SVID path search malarkey" on DIR and PFX. Write a + template suitable for use in __gen_tempname into TMPL, bounded + by TMPL_LEN. */ +int +__path_search (tmpl, tmpl_len, dir, pfx) + char *tmpl; + size_t tmpl_len; const char *dir; const char *pfx; - int dir_search; - size_t *lenptr; - FILE **streamptr; +{ + __set_errno (ENOSYS); + return -1; +} +stub_warning (__path_search) + +/* Generate a (hopefully) unique temporary filename + in DIR (if applicable), using template TMPL. + If OPENIT is 1, open the file and return a fd. If LARGEFILE is 1, + use open64() to do that. */ + int + __gen_tempname (tmpl, openit, largefile) + char *tmpl; + int openit; int large_file; { - *lenptr = 0; __set_errno (ENOSYS); - return NULL; + return -1; } -stub_warning (__stdio_gen_tempname) +stub_warning (__gen_tempname) #include <stub-tag.h> diff --git a/sysdeps/posix/mkstemp.c b/sysdeps/posix/mkstemp.c deleted file mode 100644 index d380935..0000000 --- a/sysdeps/posix/mkstemp.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (C) 1991, 1992, 1996, 1998 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., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <stdint.h> -#include <stdio.h> -#include <fcntl.h> -#include <unistd.h> -#include <sys/time.h> - -/* Generate a unique temporary file name from TEMPLATE. - The last six characters of TEMPLATE must be "XXXXXX"; - they are replaced with a string that makes the filename unique. - Returns a file descriptor open on the file for reading and writing. */ -int -mkstemp (template) - char *template; -{ - static const char letters[62] - = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; - static uint64_t value; - struct timeval tv; - char *XXXXXX; - size_t len; - int count; - - len = strlen (template); - if (len < 6 || strcmp (&template[len - 6], "XXXXXX")) - { - __set_errno (EINVAL); - return -1; - } - - /* This is where the Xs start. */ - XXXXXX = &template[len - 6]; - - /* Get some more or less random data. */ - __gettimeofday (&tv, NULL); - value += ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec ^ __getpid (); - - for (count = 0; count < TMP_MAX; ++count) - { - uint64_t v = value; - int fd; - - /* Fill in the random bits. */ - XXXXXX[0] = letters[v % 62]; - v /= 62; - XXXXXX[1] = letters[v % 62]; - v /= 62; - XXXXXX[2] = letters[v % 62]; - v /= 62; - XXXXXX[3] = letters[v % 62]; - v /= 62; - XXXXXX[4] = letters[v % 62]; - v /= 62; - XXXXXX[5] = letters[v % 62]; - - fd = __open (template, O_RDWR|O_CREAT|O_EXCL, 0600); - if (fd >= 0) - /* The file does not exist. */ - return fd; - - /* This is a random value. It is only necessary that the next - TMP_MAX values generated by adding 7777 to VALUE are different - with (module 2^32). */ - value += 7777; - } - - /* We return the null string if we can't find a unique file name. */ - template[0] = '\0'; - return -1; -} diff --git a/sysdeps/posix/mktemp.c b/sysdeps/posix/mktemp.c deleted file mode 100644 index e9a576c..0000000 --- a/sysdeps/posix/mktemp.c +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (C) 1991, 1992, 1993, 1996, 1998 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., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include <errno.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/stat.h> -#include <sys/time.h> -#include <sys/types.h> - -/* Generate a unique temporary file name from TEMPLATE. - The last six characters of TEMPLATE must be "XXXXXX"; - they are replaced with a string that makes the filename unique. */ -char * -mktemp (template) - char *template; -{ - static const char letters[] - = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; - static uint64_t value; - struct timeval tv; - char *XXXXXX; - size_t len; - int count; - - len = strlen (template); - if (len < 6 || strcmp (&template[len - 6], "XXXXXX")) - { - __set_errno (EINVAL); - return NULL; - } - - /* This is where the Xs start. */ - XXXXXX = &template[len - 6]; - - /* Get some more or less random data. */ - __gettimeofday (&tv, NULL); - value += ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec ^ __getpid (); - - for (count = 0; count < TMP_MAX; ++count) - { - struct stat ignored; - uint64_t v = value; - - /* Fill in the random bits. */ - XXXXXX[0] = letters[v % 62]; - v /= 62; - XXXXXX[1] = letters[v % 62]; - v /= 62; - XXXXXX[2] = letters[v % 62]; - v /= 62; - XXXXXX[3] = letters[v % 62]; - v /= 62; - XXXXXX[4] = letters[v % 62]; - v /= 62; - XXXXXX[5] = letters[v % 62]; - - if (stat (template, &ignored) < 0 && errno == ENOENT) - /* The file does not exist. So return this name. */ - return template; - - /* This is a random value. It is only necessary that the next - TMP_MAX values generated by adding 7777 to VALUE are different - with (module 2^32). */ - value += 7777; - } - - /* We return the null string if we can't find a unique file name. */ - template[0] = '\0'; - return template; -} diff --git a/sysdeps/posix/tempname.c b/sysdeps/posix/tempname.c index 82e0243..6dd893e 100644 --- a/sysdeps/posix/tempname.c +++ b/sysdeps/posix/tempname.c @@ -28,119 +28,99 @@ #include <unistd.h> #include <sys/time.h> -#ifdef USE_IN_LIBIO -# include "libioP.h" -# include <libio.h> -#endif - /* Return nonzero if DIR is an existent directory. */ static int -diraccess (const char *dir) +direxists (const char *dir) { struct stat buf; return __stat (dir, &buf) == 0 && S_ISDIR (buf.st_mode); } -/* Return nonzero if FILE exists. */ -static int -exists (const char *file) +/* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is + non-null and exists, uses it; otherwise uses the first of $TMPDIR, + P_tmpdir, /tmp that exists. Copies into TMPL a template suitable + for use with mk[s]temp. Will fail (-1) if DIR is non-null and + doesn't exist, none of the searched dirs exists, or there's not + enough space in TMPL. */ +int +__path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx) { - /* We can stat the file even if we can't read its data. */ - struct stat st; - int save = errno; - if (__stat (file, &st) == 0) - return 1; + const char *d; + size_t dlen, plen; + + if (!pfx || !pfx[0]) + { + pfx = "file"; + plen = 4; + } else { - /* We report that the file exists if stat failed for a reason other - than nonexistence. In this case, it may or may not exist, and we - don't know; but reporting that it does exist will never cause any - trouble, while reporting that it doesn't exist when it does would - violate the interface of __stdio_gen_tempname. */ - int exists = errno != ENOENT; - __set_errno (save); - return exists; + plen = strlen (pfx); + if (plen > 5) + plen = 5; } -} - -/* These are the characters used in temporary filenames. */ -static const char letters[] = - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; - -/* Generate a temporary filename and return it (in a static buffer). If - STREAMPTR is not NULL, open a stream "w+b" on the file and set - *STREAMPTR to it. If DIR_SEARCH is nonzero, DIR and PFX are used as - described for tempnam. If not, a temporary filename in P_tmpdir with no - special prefix is generated. If LENPTR is not NULL, *LENPTR is set the - to length (including the terminating '\0') of the resultant filename, - which is returned. This goes through a cyclic pattern of all possible - filenames consisting of five decimal digits of the current pid and three - of the characters in `letters'. Data for tempnam and tmpnam is kept - separate, but when tempnam is using P_tmpdir and no prefix (i.e, it is - identical to tmpnam), the same data is used. Each potential filename is - tested for an already-existing file of the same name, and no name of an - existing file will be returned. When the cycle reaches its end - (12345ZZZ), NULL is returned. */ -char * -__stdio_gen_tempname (char *buf, size_t bufsize, const char *dir, - const char *pfx, int dir_search, size_t *lenptr, - FILE **streamptr, int large_file) -{ - int saverrno = errno; - static const char tmpdir[] = P_tmpdir; - size_t plen, dlen, len; - char *XXXXXX; - static uint64_t value; - struct timeval tv; - int count; - - if (dir_search) + d = __secure_getenv ("TMPDIR"); + if (d != NULL && direxists (d)) + dir = d; + else if (dir != NULL && direxists (dir)) + /* nothing */ ; + else if (direxists (P_tmpdir)) + dir = P_tmpdir; + else if (direxists ("/tmp")) + dir = "/tmp"; + else { - register const char *d = __secure_getenv ("TMPDIR"); - if (d != NULL && !diraccess (d)) - d = NULL; - if (d == NULL && dir != NULL && diraccess (dir)) - d = dir; - if (d == NULL && diraccess (tmpdir)) - d = tmpdir; - if (d == NULL && diraccess ("/tmp")) - d = "/tmp"; - if (d == NULL) - { - __set_errno (ENOENT); - return NULL; - } - dir = d; + __set_errno (ENOENT); + return -1; } - else - dir = tmpdir; dlen = strlen (dir); - - /* Remove trailing slashes from the directory name. */ while (dlen > 1 && dir[dlen - 1] == '/') - --dlen; + dlen--; /* remove trailing slashes */ - if (pfx != NULL && *pfx != '\0') + /* check we have room for "${dir}/${pfx}XXXXXX\0" */ + if (tmpl_len < dlen + 1 + plen + 6 + 1) { - plen = strlen (pfx); - if (plen > 5) - plen = 5; + __set_errno (EINVAL); + return -1; } - else - plen = 0; - len = __snprintf (buf, bufsize, "%.*s/%.*sXXXXXX", - (int) dlen, dir, (int) plen, pfx); + sprintf (tmpl, "%*s/%*sXXXXXX", dlen, dir, plen, pfx); + return 0; +} + +/* These are the characters used in temporary filenames. */ +static const char letters[] = +"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + +/* Generate a temporary file name based on TMPL. TMPL must match the + rules for mk[s]temp (i.e. end in "XXXXXX"). The name constructed + does not exist at the time of the call to __gen_tempname. TMPL is + overwritten with the result. If OPENIT is nonzero, creates the + file and returns a read-write fd; the file is mode 0600 modulo + umask. If LARGEFILE is nonzero, uses open64() instead of open(). + + We use a clever algorithm to get hard-to-predict names. */ +int +__gen_tempname (char *tmpl, int openit, int largefile) +{ + int len; + char *XXXXXX; + static uint64_t value; + struct timeval tv; + int count, fd; + int save_errno = errno; - if (len < dlen + plen + 7) - { + len = strlen (tmpl); + if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX")) + { __set_errno (EINVAL); - return NULL; - } + return -1; + } - XXXXXX = &buf[dlen + plen + 1]; + /* This is where the Xs start. */ + XXXXXX = &tmpl[len - 6]; /* Get some more or less random data. */ __gettimeofday (&tv, NULL); @@ -163,116 +143,45 @@ __stdio_gen_tempname (char *buf, size_t bufsize, const char *dir, v /= 62; XXXXXX[5] = letters[v % 62]; - if (streamptr != NULL) + if (openit) { - /* Try to create the file atomically. */ -#ifdef _G_OPEN64 - int fd = (large_file - ? __open (buf, O_RDWR|O_CREAT|O_EXCL, 0666) - : _G_OPEN64 (buf, O_RDWR|O_CREAT|O_EXCL, 0666)); + /* XXX Do we want to fail on largefile if 64 bit fileops + are not implemented, or just fall back to the old stuff? */ +#ifndef __stub_open64 + fd = (largefile + ? __open (tmpl, O_RDWR | O_CREAT | O_EXCL, 0666) + : __open64 (tmpl, O_RDWR | O_CREAT | O_EXCL, 0666)); #else - int fd = __open (buf, O_RDWR|O_CREAT|O_EXCL, 0666); + fd = __open (tmpl, O_RDWR | O_CREAT | O_EXCL, 0666); #endif if (fd >= 0) { - /* We got a new file that did not previously exist. - Create a stream for it. */ -#ifdef USE_IN_LIBIO - int save; - struct locked_FILE - { - struct _IO_FILE_plus fp; -#ifdef _IO_MTSAFE_IO - _IO_lock_t lock; -#endif - } *new_f; - struct _IO_FILE_plus *fp; - - new_f = (struct locked_FILE *) - malloc (sizeof (struct locked_FILE)); - if (new_f == NULL) - { - /* We lost trying to create a stream (out of memory?). - Nothing to do but remove the file, close the descriptor, - and return failure. */ - save = errno; - lose: - (void) remove (buf); - (void) __close (fd); - __set_errno (save); - return NULL; - } - fp = &new_f->fp; -#ifdef _IO_MTSAFE_IO - fp->file._lock = &new_f->lock; -#endif - _IO_init (&fp->file, 0); - _IO_JUMPS (&fp->file) = &_IO_file_jumps; - _IO_file_init (&fp->file); -# if !_IO_UNIFIED_JUMPTABLES - fp->vtable = NULL; -# endif - if (_IO_file_attach (&fp->file, fd) == NULL) - { - save = errno; - free (fp); - goto lose; - } - fp->file._flags &= ~_IO_DELETE_DONT_CLOSE; - - *streamptr = (FILE *) fp; -#else - *streamptr = __newstream (); - if (*streamptr == NULL) + __set_errno (save_errno); + return fd; + } + else if (errno != EEXIST) + /* Any other error will apply also to other names we might + try, and there are 2^32 or so of them, so give up now. */ + return -1; + } + else + { + struct stat st; + if (__stat (tmpl, &st) < 0) + { + if (errno == ENOENT) { - /* We lost trying to create a stream (out of memory?). - Nothing to do but remove the file, close the descriptor, - and return failure. */ - const int save = errno; - (void) remove (buf); - (void) __close (fd); - __set_errno (save); - return NULL; + __set_errno (save_errno); + return 0; } - (*streamptr)->__cookie = (__ptr_t) (long int) fd; - (*streamptr)->__mode.__write = 1; - (*streamptr)->__mode.__read = 1; - (*streamptr)->__mode.__binary = 1; -#endif + else + /* Give up now. */ + return -1; } -#if defined EMFILE || defined ENFILE || defined EINTR - else if (0 -# ifdef EMFILE - || errno == EMFILE -# endif -# ifdef ENFILE - || errno == ENFILE -# endif -# ifdef EINTR - || errno == EINTR -# endif - ) - /* We cannot open anymore files since all descriptors are - used or because we got a signal. */ - return NULL; -#endif - else - continue; } - else if (exists (buf)) - continue; - - /* If the file already existed we have continued the loop above, - so we only get here when we have a winning name to return. */ - - __set_errno (saverrno); - - if (lenptr != NULL) - *lenptr = len + 1; - return buf; } /* We got out of the loop because we ran out of combinations to try. */ - __set_errno (EEXIST); /* ? */ - return NULL; + __set_errno (EEXIST); + return -1; } |