diff --git a/ChangeLog b/ChangeLog index 02d6720314..1c6598717e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,144 @@ -Fri Jul 3 14:35:55 1998 Andreas Schwab +1998-07-04 10:14 Ulrich Drepper + + * libio/Makefile (routines): Add iofread_u and iofwrite_u. + * libio/Versions: Add fread_unlocked and fwrite_unlocked. + + * Makerules (lib%.so): Adjust ignore pattern for last makefile change. + + * time/tzfile.c (decode): Optimize by using bswap_32. + (__tzfile_read): Use _unlocked stream functions. Correct setting of + __tzname array values. + (__tzfile_compute): Correct setting of __tzname array values. + * time/tzset.c (__tzstring): Clean up a bit. + +1998-06-29 19:01 Jim Wilson + + * posix/regex.c (re_comp): Add cast to char * before gettext calls. + +1998-06-30 Andreas Jaeger + + * sysdeps/unix/bsd/poll.c (__poll): Allocate fd_set dynamically so + that fd can be bigger than FD_SETSIZE. + +1998-07-01 Andreas Jaeger + + * nscd/grpcache.c: Include . + * nscd/pwdcache.c: Likewise. + + * nis/nis_modify.c: Include . + * nis/nis_add.c: Likewise. + * nis/nis_checkpoint.c: Likewise. + * posix/runptests.c: Likewise. + * sysdeps/generic/statvfs64.c: Likewise. + * sysdeps/generic/fstatvfs64.c: Likewise. + +1998-07-03 13:16 Ulrich Drepper + + * localedata/charmaps/ISO-8859-9: Change mapping for 0xea, 0xec, 0xef + to match data from Unicode. + Reported by Michael Deutschmann . + +1998-07-03 11:45 Ulrich Drepper + + * stdio-common/printf.h: Define printf_function and + printf_arginfo_function types using __PMT not __P. + Reported by Marc Lehmann. + +1998-07-02 14:07 -0400 Zack Weinberg + + * assert/test-assert.c: New test. + * assert/test-assert-perr.c: New test. + * assert/Makefile (tests): Add test-assert and test-assert-perr. + +1998-07-02 13:45 Zack Weinberg + + BSD-style SCM_CREDS support. + + * sysdeps/unix/sysv/linux/socket.h: Define struct cmsgcred and + SCM_CREDS. + * sysdeps/unix/sysv/linux/sendmsg.c: New file. Convert user + visible SCM_CREDS packet to what the kernel wants. + * sysdeps/unix/sysv/linux/recvmsg.c: New file. Convert + SCM_CREDS packet output by kernel to what users want. + + * sysdeps/unix/sysv/linux/sendmsg.S: Moved to... + * sysdeps/unix/sysv/linux/__sendmsg.S: here. + * sysdeps/unix/sysv/linux/recvmsg.S: Moved to... + * sysdeps/unix/sysv/linux/__recvmsg.S: here. + + * sysdeps/unix/sysv/linux/Makefile [subdir=socket]: Add + __sendmsg and __recvmsg to sysdep_routines. + * sysdeps/unix/sysv/linux/Dist: Add __sendmsg.S and __recvmsg.S. + +1998-07-02 Thorsten Kukuk + + * nscd/grpcache.c: Fix gid pointer handling and debug messages. + * nscd/pwdcache.c: Fix uid pointer handling and debug messages. + * nscd/nscd.c: Check, if pthread_create fails. + +1998-07-02 Andreas Jaeger + + * stdio-common/test_rdwr.c (main): Use %Zu for size_t in printf + format strings. + * stdio-common/bug1.c (main): Likewise. + * stdio-common/bug5.c (main): Likewise. + * stdio-common/tstgetln.c (main): Likewise. + * elf/sprof.c (generate_call_graph): Likewise. + (load_shobj): Likewise. + * posix/runptests.c (main): Likewise. + * string/tst-strlen.c (main): Likewise. + + * sysdeps/libm-ieee754/e_acos.c (__ieee754_acos): Remove unused + variable q3. + * sysdeps/libm-ieee754/e_asin.c (__ieee754_asin): Likewise + +1998-07-03 Andreas Jaeger + + * wctype/Versions: Add __towctrans. + Noticed by Alex Buell . + +1998-07-02 Mark Kettenis + + * grp/initgroups.c (compat_call): Only call dynamically loaded + functions if they are really present. + +1998-07-02 Mark Kettenis + + * sysdeps/unix/sysv/linux/bits/sched.h: Move __END_DECLS within + #ifdef that contains __BEGIN_DECLS. + +1998-07-02 Andreas Schwab + + * libio/iofwrite.c: Fix return value when size == 0. + +1998-07-01 Andreas Schwab + + * posix/Makefile (distribute): Add annexc.c. + (generated): Add $(objpfx)annexc and $(objpfx)annexc.out. + +1998-07-01 Andreas Schwab + + * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add + bits/pthreadtypes.h here, and do not clobber headers. + + * sysdeps/unix/sysv/linux/Dist: Add bits/pthreadtypes.h. + +1998-07-03 Andreas Jaeger + + * timezone/tst-timezone.c: Add tests for tzname variable. + +1998-07-03 12:17 Zack Weinberg + + * Makefile [versioning=yes]: Build the mapfiles with a pattern + rule that lists all of them as targets. + (sysd-versions): Depend only on Versions.def. Write a Makefile + fragment that defines $(vers-libs) based on contents of that file; + then include it. + (lib-noranlib): Depend on lib-mapfiles not sysd-versions. + (lib-mapfiles): New target, depends on sysd-versions and $(vers-libs). + Predicate all this on avoid-generated unset as well as versioning. + +1998-07-03 14:35 Andreas Schwab * sysdeps/unix/sysv/linux/m68k/Versions: New file. diff --git a/Makerules b/Makerules index 72caf6046c..998f866114 100644 --- a/Makerules +++ b/Makerules @@ -345,7 +345,8 @@ $(LINK.o) -shared -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS) \ $(LDFLAGS.so) $(LDFLAGS-$(@F:lib%.so=%).so) \ -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \ -Wl,--whole-archive \ - $(filter-out $(map-file) $(@F:.so=.map) $(+preinit) $(+postinit),$^) \ + $(filter-out $(map-file) $(common-objpfx)$(@F:.so=.map) \ + $(+preinit) $(+postinit),$^) \ $(no-whole-archive) $(LDLIBS-$(@F:lib%.so=%).so) endef diff --git a/assert/Makefile b/assert/Makefile index 5780457502..63fb9253ff 100644 --- a/assert/Makefile +++ b/assert/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991, 1994, 1997 Free Software Foundation, Inc. +# Copyright (C) 1991, 1994, 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 @@ -23,5 +23,6 @@ subdir := assert headers := assert.h routines := assert assert-perr +tests := test-assert test-assert-perr include ../Rules diff --git a/assert/test-assert-perr.c b/assert/test-assert-perr.c new file mode 100644 index 0000000000..824c1a9f97 --- /dev/null +++ b/assert/test-assert-perr.c @@ -0,0 +1,86 @@ +/* Test assert_perror(). + * + * This is hairier than you'd think, involving games with + * stdio and signals. + * + */ + +#include +#include +#include +#include +#include + +jmp_buf rec; +char buf[160]; + +void +sigabrt (int unused) +{ + longjmp (rec, 1); /* recover control */ +} + +#undef NDEBUG +#include +void +assert1 (void) +{ + assert_perror (1); +} + +void +assert2 (void) +{ + assert_perror (0); +} + +#define NDEBUG +#include +void +assert3 (void) +{ + assert_perror (2); +} + +int +main(void) +{ + volatile int failed = 1; /* safety in presence of longjmp() */ + + fclose (stderr); + stderr = tmpfile (); + if (!stderr) + abort (); + + signal (SIGABRT, sigabrt); + + if (!setjmp (rec)) + assert1 (); + else + failed = 0; /* should happen */ + + if (!setjmp (rec)) + assert2 (); + else + failed = 1; /* should not happen */ + + if (!setjmp (rec)) + assert3 (); + else + failed = 1; /* should not happen */ + + rewind (stderr); + fgets (buf, 160, stderr); + if (!strstr(buf, strerror (1))) + failed = 1; + + fgets (buf, 160, stderr); + if (strstr (buf, strerror (0))) + failed = 1; + + fgets (buf, 160, stderr); + if (strstr (buf, strerror (2))) + failed = 1; + + return failed; +} diff --git a/assert/test-assert.c b/assert/test-assert.c new file mode 100644 index 0000000000..045721e9cd --- /dev/null +++ b/assert/test-assert.c @@ -0,0 +1,88 @@ +/* Test assert(). + * + * This is hairier than you'd think, involving games with + * stdio and signals. + * + */ + +#include +#include +#include +#include +#include + +jmp_buf rec; +char buf[160]; + +void +sigabrt (int unused) +{ + longjmp (rec, 1); /* recover control */ +} + +#undef NDEBUG +#include +void +assert1 (void) +{ + assert (1 == 2); +} + +void +assert2 (void) +{ + assert (1 == 1); +} + + +#define NDEBUG +#include +void +assert3 (void) +{ + assert (2 == 3); +} + +int +main (void) +{ + + volatile int failed = 1; + + fclose (stderr); + stderr = tmpfile (); + if(!stderr) + abort (); + + signal (SIGABRT, sigabrt); + + if (!setjmp (rec)) + assert1 (); + else + failed = 0; /* should happen */ + + if (!setjmp (rec)) + assert2 (); + else + failed = 1; /* should not happen */ + + if (!setjmp (rec)) + assert3 (); + else + failed = 1; /* should not happen */ + + rewind (stderr); + fgets (buf, 160, stderr); + if (!strstr (buf, "1 == 2")) + failed = 1; + + fgets (buf, 160, stderr); + if (strstr (buf, "1 == 1")) + failed = 1; + + fgets (buf, 160, stderr); + if (strstr (buf, "2 == 3")) + failed = 1; + + return failed; +} diff --git a/elf/sprof.c b/elf/sprof.c index f54a61657f..c6a9b305e2 100644 --- a/elf/sprof.c +++ b/elf/sprof.c @@ -449,7 +449,7 @@ load_shobj (const char *name) else log_hashfraction = -1; if (do_test) - printf ("hashfraction = %d\ndivider = %d\n", + printf ("hashfraction = %d\ndivider = %Zu\n", result->hashfraction, result->hashfraction * sizeof (struct here_fromstruct)); result->tossize = textsize / HASHFRACTION; @@ -1197,7 +1197,7 @@ generate_call_graph (struct profdata *profdata) } /* Info abount the function itself. */ - n = printf ("[%d]", cnt); + n = printf ("[%Zu]", cnt); printf ("%*s%5.1f%8.2f%8.2f%9" PRIdMAX " %s [%Zd]\n", 7 - n, " ", total_ticks ? (100.0 * sortsym[cnt]->ticks) / total_ticks : 0, diff --git a/grp/initgroups.c b/grp/initgroups.c index f42c92db9a..454882e0af 100644 --- a/grp/initgroups.c +++ b/grp/initgroups.c @@ -59,12 +59,18 @@ compat_call (service_user *nip, const char *user, gid_t group, long int *start, get_function getgrent_fct; end_function endgrent_fct; - setgrent_fct = __nss_lookup_function (nip, "setgrent"); - status = _CALL_DL_FCT (setgrent_fct, ()); - if (status != NSS_STATUS_SUCCESS) - return status; - getgrent_fct = __nss_lookup_function (nip, "getgrent_r"); + if (getgrent_fct == NULL) + return NSS_STATUS_UNAVAIL; + + setgrent_fct = __nss_lookup_function (nip, "setgrent"); + if (setgrent_fct) + { + status = _CALL_DL_FCT (setgrent_fct, ()); + if (status != NSS_STATUS_SUCCESS) + return status; + } + endgrent_fct = __nss_lookup_function (nip, "endgrent"); tmpbuf = __alloca (buflen); @@ -115,7 +121,8 @@ compat_call (service_user *nip, const char *user, gid_t group, long int *start, while (status == NSS_STATUS_SUCCESS); done: - _CALL_DL_FCT (endgrent_fct, ()); + if (endgrent_fct) + _CALL_DL_FCT (endgrent_fct, ()); return NSS_STATUS_SUCCESS; } diff --git a/libio/Makefile b/libio/Makefile index 61bd54f400..3c75183987 100644 --- a/libio/Makefile +++ b/libio/Makefile @@ -34,7 +34,7 @@ routines := \ clearerr feof ferror fgetc fileno fputc freopen fseek getc getchar \ memstream pclose putc putchar rewind setbuf setlinebuf vasprintf \ iovdprintf vscanf vsnprintf obprintf fcloseall fseeko ftello \ - freopen64 fseeko64 ftello64 \ + freopen64 fseeko64 ftello64 iofread_u iofwrite_u \ \ libc_fatal diff --git a/libio/Versions b/libio/Versions index ea58a29321..12277ae29f 100644 --- a/libio/Versions +++ b/libio/Versions @@ -98,6 +98,6 @@ libc { # f* fgetpos64; fopen64; freopen64; fseeko; fseeko64; fsetpos64; ftello; - ftello64; fopen; fclose; fdopen; + ftello64; fopen; fclose; fdopen; fread_unlocked; fwrite_unlocked; } } diff --git a/libio/iofread_u.c b/libio/iofread_u.c new file mode 100644 index 0000000000..bd7ceaf379 --- /dev/null +++ b/libio/iofread_u.c @@ -0,0 +1,42 @@ +/* Copyright (C) 1993, 1995, 1997, 1998 Free Software Foundation, Inc. + This file is part of the GNU IO Library. + + This library 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 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 + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this library; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. + + As a special exception, if you link this library with files + compiled with a GNU compiler to produce an executable, this does + not cause the resulting executable to be covered by the GNU General + Public License. This exception does not however invalidate any + other reasons why the executable file might be covered by the GNU + General Public License. */ + +#include "libioP.h" + +_IO_size_t +fread_unlocked (buf, size, count, fp) + void *buf; + _IO_size_t size; + _IO_size_t count; + _IO_FILE *fp; +{ + _IO_size_t bytes_requested = size*count; + _IO_size_t bytes_read; + CHECK_FILE (fp, 0); + if (bytes_requested == 0) + return 0; + bytes_read = _IO_sgetn (fp, (char *) buf, bytes_requested); + return bytes_requested == bytes_read ? count : bytes_read / size; +} diff --git a/libio/iofwrite.c b/libio/iofwrite.c index 0f82797ecf..d163d29361 100644 --- a/libio/iofwrite.c +++ b/libio/iofwrite.c @@ -35,15 +35,15 @@ _IO_fwrite (buf, size, count, fp) _IO_size_t request = size * count; _IO_size_t written; CHECK_FILE (fp, 0); + /* Many traditional implementations return 0 if size==0 && count > 0, + but ANSI requires us to return count in this case. */ if (request == 0) - return 0; + return count; _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp); _IO_flockfile (fp); written = _IO_sputn (fp, (const char *) buf, request); _IO_funlockfile (fp); _IO_cleanup_region_end (0); - /* Many traditional implementations return 0 if size==0 && count > 0, - but ANSI requires us to return count in this case. */ if (written == request) return count; else diff --git a/libio/iofwrite_u.c b/libio/iofwrite_u.c new file mode 100644 index 0000000000..7d1d24b758 --- /dev/null +++ b/libio/iofwrite_u.c @@ -0,0 +1,47 @@ +/* Copyright (C) 1993, 1996, 1997, 1998 Free Software Foundation, Inc. + This file is part of the GNU IO Library. + + This library 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 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 + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this library; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. + + As a special exception, if you link this library with files + compiled with a GNU compiler to produce an executable, this does + not cause the resulting executable to be covered by the GNU General + Public License. This exception does not however invalidate any + other reasons why the executable file might be covered by the GNU + General Public License. */ + +#include "libioP.h" + +_IO_size_t +fwrite_unlocked (buf, size, count, fp) + const void *buf; + _IO_size_t size; + _IO_size_t count; + _IO_FILE *fp; +{ + _IO_size_t request = size * count; + _IO_size_t written; + CHECK_FILE (fp, 0); + /* Many traditional implementations return 0 if size==0 && count > 0, + but ANSI requires us to return count in this case. */ + if (request == 0) + return count; + written = _IO_sputn (fp, (const char *) buf, request); + if (written == request) + return count; + else + return written / size; +} diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 08525005b6..9619ae48f0 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,7 @@ +1998-07-01 Andreas Jaeger + + * attr.c: Include . + 1998-06-30 11:47 Ulrich Drepper * attr.c: Include errno.h. Use memcpy to copy sched_param. diff --git a/linuxthreads/attr.c b/linuxthreads/attr.c index cdd27d6012..b5610030b5 100644 --- a/linuxthreads/attr.c +++ b/linuxthreads/attr.c @@ -15,6 +15,7 @@ /* Handling of thread attributes */ #include +#include #include #include #include "pthread.h" diff --git a/localedata/charmaps/ISO-8859-9 b/localedata/charmaps/ISO-8859-9 index 43fd5f6bf7..12455ecb5b 100644 --- a/localedata/charmaps/ISO-8859-9 +++ b/localedata/charmaps/ISO-8859-9 @@ -245,12 +245,12 @@ CHARMAP /xE7 LATIN SMALL LETTER C WITH CEDILLA /xE8 LATIN SMALL LETTER E WITH GRAVE /xE9 LATIN SMALL LETTER E WITH ACUTE - /xEA LATIN SMALL LETTER E WITH OGONEK +> /xEA LATIN SMALL LETTER E WITH CIRCUMFLEX /xEB LATIN SMALL LETTER E WITH DIAERESIS - /xEC LATIN SMALL LETTER E WITH DOT ABOVE + /xEC LATIN SMALL LETTER I WITH GRAVE /xED LATIN SMALL LETTER I WITH ACUTE > /xEE LATIN SMALL LETTER I WITH CIRCUMFLEX - /xEF LATIN SMALL LETTER I WITH MACRON + /xEF LATIN SMALL LETTER I WITH DIAERESIS /xF0 LATIN SMALL LETTER G WITH BREVE /xF1 LATIN SMALL LETTER N WITH TILDE /xF2 LATIN SMALL LETTER O WITH GRAVE diff --git a/nis/nis_add.c b/nis/nis_add.c index 10b46aff18..9618ad87c7 100644 --- a/nis/nis_add.c +++ b/nis/nis_add.c @@ -17,6 +17,7 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include #include #include "nis_xdr.h" diff --git a/nis/nis_checkpoint.c b/nis/nis_checkpoint.c index 585214a3b4..f1e860f7b8 100644 --- a/nis/nis_checkpoint.c +++ b/nis/nis_checkpoint.c @@ -17,6 +17,7 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include #include #include "nis_xdr.h" diff --git a/nis/nis_modify.c b/nis/nis_modify.c index 57efe82bf2..a1bcd7ff9c 100644 --- a/nis/nis_modify.c +++ b/nis/nis_modify.c @@ -17,6 +17,7 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include #include #include "nis_xdr.h" diff --git a/nscd/grpcache.c b/nscd/grpcache.c index 3f3f4ba0ec..2806ddd52e 100644 --- a/nscd/grpcache.c +++ b/nscd/grpcache.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -48,7 +49,7 @@ typedef struct grphash grphash; struct gidhash { struct gidhash *next; - struct grphash *grptr; + struct group *grptr; }; typedef struct gidhash gidhash; @@ -176,6 +177,7 @@ static int add_cache (struct group *grp) { grphash *work; + gidhash *gidwork; unsigned long int hash = __nis_hash (grp->gr_name, strlen (grp->gr_name)) % modulo; @@ -197,7 +199,17 @@ add_cache (struct group *grp) } time (&work->create); - gidtbl[grp->gr_gid % modulo].grptr = work; + gidwork = &gidtbl[grp->gr_gid % modulo]; + if (gidwork->grptr == NULL) + gidwork->grptr = work->grp; + else + { + while (gidwork->next != NULL) + gidwork = gidwork->next; + + gidwork->next = calloc (1, sizeof (gidhash)); + gidwork->next->grptr = work->grp; + } return 0; } @@ -231,8 +243,8 @@ cache_search_gid (gid_t gid) while (work->grptr != NULL) { - if (work->grptr->grp->gr_gid == gid) - return work->grptr->grp; + if (work->grptr->gr_gid == gid) + return work->grptr; if (work->next != NULL) work = work->next; else @@ -475,7 +487,7 @@ cache_getgrgid (void *v_param) return NULL; } -void * +static void * grptable_update (void *v) { time_t now; @@ -509,7 +521,7 @@ grptable_update (void *v) while (uh && uh->grptr) { - if (uh->grptr->grp->gr_gid == work->grp->gr_gid) + if (uh->grptr->gr_gid == work->grp->gr_gid) { if (debug_flag > 3) dbg_log (_("Give gid for \"%s\" free"), @@ -543,14 +555,14 @@ grptable_update (void *v) } } if (debug_flag > 2) - dbg_log (_("(pwdtable_update) Release wait lock\n")); + dbg_log (_("(grptable_update) Release wait lock")); pthread_rwlock_unlock (&grplock); sleep (20); } return NULL; } -void * +static void * negtable_update (void *v) { time_t now; @@ -561,12 +573,12 @@ negtable_update (void *v) while (!do_shutdown) { if (debug_flag > 2) - dbg_log (_("(negtable_update) Wait for write lock!")); + dbg_log (_("(neggrptable_update) Wait for write lock!")); pthread_rwlock_wrlock (&neglock); if (debug_flag > 2) - dbg_log (_("(negtable_update) Have write lock")); + dbg_log (_("(neggrptable_update) Have write lock")); time (&now); for (i = 0; i < modulo; ++i) @@ -597,7 +609,7 @@ negtable_update (void *v) } } if (debug_flag > 2) - dbg_log (_("(negtable_update) Release wait lock")); + dbg_log (_("(neggrptable_update) Release wait lock")); pthread_rwlock_unlock (&neglock); sleep (10); } diff --git a/nscd/nscd.c b/nscd/nscd.c index 9f167d2daa..e1c636775f 100644 --- a/nscd/nscd.c +++ b/nscd/nscd.c @@ -309,7 +309,7 @@ write_pid (const char *file) typedef int (*pwbyname_function) (const char *name, struct passwd *pw, char *buffer, size_t buflen); -/* Hanlde incoming requests. */ +/* Handle incoming requests. */ static void handle_requests (void) { @@ -317,6 +317,12 @@ void handle_requests (void) int conn; /* Handle on which connection (client) the request came from. */ int done = 0; char *key; + pthread_attr_t th_attr; + + /* We will create all threads detached. Therefore prepare an attribute + now. */ + pthread_attr_init (&th_attr); + pthread_attr_setdetachstate (&th_attr, PTHREAD_CREATE_DETACHED); while (!done) { @@ -331,15 +337,23 @@ void handle_requests (void) { param_t *param = malloc (sizeof (param_t)); pthread_t thread; + int status; if (debug_flag) dbg_log ("\tGETPWBYNAME (%s)", key); param->key = key; param->conn = conn; if (disabled_passwd) - pthread_create (&thread, NULL, cache_pw_disabled, (void *)param); + status = pthread_create (&thread, &th_attr, cache_pw_disabled, + (void *)param); else - pthread_create (&thread, NULL, cache_getpwnam, (void *)param); + status = pthread_create (&thread, &th_attr, cache_getpwnam, + (void *)param); + if (status != 0) + { + dbg_log (_("Creation of thread failed: %s"), strerror (errno)); + close_socket (conn); + } pthread_detach (thread); } break; @@ -347,48 +361,69 @@ void handle_requests (void) { param_t *param = malloc (sizeof (param_t)); pthread_t thread; + int status; if (debug_flag) dbg_log ("\tGETPWBYUID (%s)", key); param->key = key; param->conn = conn; if (disabled_passwd) - pthread_create (&thread, NULL, cache_pw_disabled, (void *)param); + status = pthread_create (&thread, &th_attr, cache_pw_disabled, + (void *)param); else - pthread_create (&thread, NULL, cache_getpwuid, (void *)param); - pthread_detach (thread); + status = pthread_create (&thread, &th_attr, cache_getpwuid, + (void *)param); + if (status != 0) + { + dbg_log (_("Creation of thread failed: %s"), strerror (errno)); + close_socket (conn); + } } break; case GETGRBYNAME: { param_t *param = malloc (sizeof (param_t)); pthread_t thread; + int status; if (debug_flag) dbg_log ("\tGETGRBYNAME (%s)", key); param->key = key; param->conn = conn; if (disabled_group) - pthread_create (&thread, NULL, cache_gr_disabled, (void *)param); + status = pthread_create (&thread, &th_attr, cache_gr_disabled, + (void *)param); else - pthread_create (&thread, NULL, cache_getgrnam, (void *)param); - pthread_detach (thread); + status = pthread_create (&thread, &th_attr, cache_getgrnam, + (void *)param); + if (status != 0) + { + dbg_log (_("Creation of thread failed: %s"), strerror (errno)); + close_socket (conn); + } } break; case GETGRBYGID: { param_t *param = malloc (sizeof (param_t)); pthread_t thread; + int status; if (debug_flag) dbg_log ("\tGETGRBYGID (%s)", key); param->key = key; param->conn = conn; if (disabled_group) - pthread_create (&thread, NULL, cache_gr_disabled, (void *)param); + status = pthread_create (&thread, &th_attr, cache_gr_disabled, + (void *)param); else - pthread_create (&thread, NULL, cache_getgrgid, (void *)param); - pthread_detach (thread); + status = pthread_create (&thread, &th_attr, cache_getgrgid, + (void *)param); + if (status != 0) + { + dbg_log (_("Creation of thread failed: %s"), strerror (errno)); + close_socket (conn); + } } break; case GETHOSTBYNAME: @@ -432,4 +467,6 @@ void handle_requests (void) break; } } + + pthread_attr_destroy (&th_attr); } diff --git a/nscd/pwdcache.c b/nscd/pwdcache.c index 721e77b7c9..e2bf73afc1 100644 --- a/nscd/pwdcache.c +++ b/nscd/pwdcache.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -48,7 +49,7 @@ typedef struct pwdhash pwdhash; struct uidhash { struct uidhash *next; - struct pwdhash *pwptr; + struct passwd *pwptr; }; typedef struct uidhash uidhash; @@ -159,6 +160,7 @@ static int add_cache (struct passwd *pwd) { pwdhash *work; + uidhash *uidwork; unsigned long int hash = __nis_hash (pwd->pw_name, strlen (pwd->pw_name)) % modulo; @@ -180,8 +182,17 @@ add_cache (struct passwd *pwd) } /* Set a pointer from the pwuid hash table to the pwname hash table */ time (&work->create); - uidtbl[pwd->pw_uid % modulo].pwptr = work; + uidwork = &uidtbl[pwd->pw_uid % modulo]; + if (uidwork->pwptr == NULL) + uidwork->pwptr = work->pwd; + else + { + while (uidwork->next != NULL) + uidwork = uidwork->next; + uidwork->next = calloc (1, sizeof (uidhash)); + uidwork->next->pwptr = work->pwd; + } return 0; } @@ -214,8 +225,8 @@ cache_search_uid (uid_t uid) while (work->pwptr != NULL) { - if (work->pwptr->pwd->pw_uid == uid) - return work->pwptr->pwd; + if (work->pwptr->pw_uid == uid) + return work->pwptr; if (work->next != NULL) work = work->next; else @@ -458,7 +469,7 @@ cache_getpwuid (void *v_param) return NULL; } -void * +static void * pwdtable_update (void *v) { time_t now; @@ -492,7 +503,7 @@ pwdtable_update (void *v) while (uh != NULL && uh->pwptr) { - if (uh->pwptr->pwd->pw_uid == work->pwd->pw_uid) + if (uh->pwptr->pw_uid == work->pwd->pw_uid) { if (debug_flag) dbg_log (_("Give uid for \"%s\" free"), @@ -533,7 +544,7 @@ pwdtable_update (void *v) return NULL; } -void * +static void * negtable_update (void *v) { time_t now; @@ -544,12 +555,12 @@ negtable_update (void *v) while (!do_shutdown) { if (debug_flag > 2) - dbg_log (_("(negtable_update) Wait for write lock!")); + dbg_log (_("(negpwdtable_update) Wait for write lock!")); pthread_rwlock_wrlock (&neglock); - if (debug_flag) - dbg_log (_("(negtable_update) Have write lock")); + if (debug_flag > 2) + dbg_log (_("(negpwdtable_update) Have write lock")); time (&now); for (i = 0; i < modulo; ++i) @@ -579,8 +590,8 @@ negtable_update (void *v) work = work->next; } } - if (debug_flag) - dbg_log (_("(negtable_update) Release wait lock")); + if (debug_flag > 2) + dbg_log (_("(negpwdtable_update) Release wait lock")); pthread_rwlock_unlock (&neglock); sleep (10); diff --git a/posix/Makefile b/posix/Makefile index 5a37df6325..ad70fddd63 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -30,7 +30,7 @@ headers := sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h \ distribute := confstr.h TESTS TESTS2C.sed testcases.h \ PTESTS PTESTS2C.sed ptestcases.h \ - globtest.c globtest.sh wordexp-tst.sh + globtest.c globtest.sh wordexp-tst.sh annexc.c routines := \ uname \ @@ -63,7 +63,8 @@ gpl2lgpl := getopt.c getopt1.c getopt.h regex.c regex.h before-compile := testcases.h ptestcases.h # So they get cleaned up. -generated := $(addprefix wordexp-test-result, 1 2 3 4 5 6 7 8 9 10) +generated := $(addprefix wordexp-test-result, 1 2 3 4 5 6 7 8 9 10) \ + $(objpfx)annexc $(objpfx)annexc.out include ../Rules diff --git a/posix/regex.c b/posix/regex.c index 26c876a155..3868da3eb7 100644 --- a/posix/regex.c +++ b/posix/regex.c @@ -5509,12 +5509,12 @@ re_comp (s) { re_comp_buf.buffer = (unsigned char *) malloc (200); if (re_comp_buf.buffer == NULL) - return gettext (re_error_msgid[(int) REG_ESPACE]); + return (char *) gettext (re_error_msgid[(int) REG_ESPACE]); re_comp_buf.allocated = 200; re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH); if (re_comp_buf.fastmap == NULL) - return gettext (re_error_msgid[(int) REG_ESPACE]); + return (char *) gettext (re_error_msgid[(int) REG_ESPACE]); } /* Since `re_exec' always passes NULL for the `regs' argument, we diff --git a/posix/runptests.c b/posix/runptests.c index 50b157b76f..b1eabb9ebd 100644 --- a/posix/runptests.c +++ b/posix/runptests.c @@ -21,6 +21,7 @@ #include #include #include +#include /* Data structure to describe the tests. */ struct test @@ -108,7 +109,7 @@ main (int argc, char *argv[]) regfree (&re); } - printf ("\n%u tests, %d errors\n", cnt, errors); + printf ("\n%Zu tests, %d errors\n", cnt, errors); /* We should return here the error status but since some tests are known to fail this would only cause the libc testsuite to fail. */ diff --git a/stdio-common/bug1.c b/stdio-common/bug1.c index 455b14d7cf..51639d3476 100644 --- a/stdio-common/bug1.c +++ b/stdio-common/bug1.c @@ -12,12 +12,12 @@ main (void) stream = open_memstream (&bp, &size); fprintf (stream, "hello"); fflush (stream); - printf ("buf = %s, size = %d\n", bp, size); + printf ("buf = %s, size = %Zu\n", bp, size); lose |= size != 5; lose |= strncmp (bp, "hello", size); fprintf (stream, ", world"); fclose (stream); - printf ("buf = %s, size = %d\n", bp, size); + printf ("buf = %s, size = %Zu\n", bp, size); lose |= size != 12; lose |= strncmp (bp, "hello, world", 12); diff --git a/stdio-common/bug5.c b/stdio-common/bug5.c index 8c3d0e3bc7..f655845891 100644 --- a/stdio-common/bug5.c +++ b/stdio-common/bug5.c @@ -28,7 +28,7 @@ main (void) return 1; } for (i = 0; i < 1000; ++i) - fprintf (in, "%u\n", i); + fprintf (in, "%Zu\n", i); out = fopen (outname, "w"); if (out == NULL) diff --git a/stdio-common/printf.h b/stdio-common/printf.h index 8b3b4eb967..852027ce21 100644 --- a/stdio-common/printf.h +++ b/stdio-common/printf.h @@ -59,17 +59,17 @@ struct printf_info The function should return the number of characters written, or -1 for errors. */ -typedef int printf_function __P ((FILE *__stream, - __const struct printf_info *__info, - __const void *__const *__args)); +typedef int printf_function __PMT ((FILE *__stream, + __const struct printf_info *__info, + __const void *__const *__args)); /* Type of a printf specifier-arginfo function. INFO gives information about the format specification. N, ARGTYPES, and return value are as for printf_parse_format. */ -typedef int printf_arginfo_function __P ((__const struct printf_info *__info, - size_t __n, - int *__argtypes)); +typedef int printf_arginfo_function __PMT ((__const struct printf_info *__info, + size_t __n, + int *__argtypes)); /* Register FUNC to be called to format SPEC specifiers; ARGINFO must be diff --git a/stdio-common/test_rdwr.c b/stdio-common/test_rdwr.c index 32bce5b77a..e274dcc665 100644 --- a/stdio-common/test_rdwr.c +++ b/stdio-common/test_rdwr.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1992, 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 @@ -61,13 +61,13 @@ main (int argc, char **argv) int c = getc (f); if (c == EOF) { - printf ("EOF at %u.\n", i); + printf ("EOF at %Zu.\n", i); lose = 1; break; } else if (c != hello[i]) { - printf ("Got '%c' instead of '%c' at %u.\n", + printf ("Got '%c' instead of '%c' at %Zu.\n", (unsigned char) c, hello[i], i); lose = 1; break; @@ -83,7 +83,7 @@ main (int argc, char **argv) for (i = replace_from; i < replace_to; ++i) if (putc(replace[i], f) == EOF) { - printf ("putc('%c') got %s at %u.\n", + printf ("putc('%c') got %s at %Zu.\n", replace[i], strerror (errno), i); lose = 1; break; @@ -97,7 +97,7 @@ main (int argc, char **argv) } else { - printf ("ftell returns %lu; should be %u.\n", where, replace_from); + printf ("ftell returns %lu; should be %Zu.\n", where, replace_from); lose = 1; } } diff --git a/stdio-common/tstgetln.c b/stdio-common/tstgetln.c index fe37672703..d6ff2c139d 100644 --- a/stdio-common/tstgetln.c +++ b/stdio-common/tstgetln.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 1995, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1992, 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 @@ -32,7 +32,7 @@ main (int argc, char *argv[]) while ((len = getline (&buf, &size, stdin)) != -1) { - printf ("bufsize %u; read %d: ", size, len); + printf ("bufsize %Zu; read %Zd: ", size, len); if (fwrite (buf, len, 1, stdout) != 1) { perror ("fwrite"); diff --git a/string/tst-strlen.c b/string/tst-strlen.c index c43cb1a4d6..1b1f8344b8 100644 --- a/string/tst-strlen.c +++ b/string/tst-strlen.c @@ -33,7 +33,7 @@ main(int argc, char *argv[]) if (strlen (buf) != words * 4 + lens[last]) { - printf ("failed for base=%d, words=%d, and last=%d\n", + printf ("failed for base=%Zu, words=%Zu, and last=%Zu\n", base, words, last); return 1; } diff --git a/sysdeps/generic/fstatvfs64.c b/sysdeps/generic/fstatvfs64.c index a96c7bdec2..8ede56eec3 100644 --- a/sysdeps/generic/fstatvfs64.c +++ b/sysdeps/generic/fstatvfs64.c @@ -19,6 +19,7 @@ #include #include +#include /* Return information about the filesystem on which FD resides. */ int diff --git a/sysdeps/generic/statvfs64.c b/sysdeps/generic/statvfs64.c index 349760362b..d88bd5945b 100644 --- a/sysdeps/generic/statvfs64.c +++ b/sysdeps/generic/statvfs64.c @@ -20,6 +20,7 @@ #include #include #include +#include /* Return information about the filesystem on which FILE resides. */ int diff --git a/sysdeps/libm-ieee754/e_acos.c b/sysdeps/libm-ieee754/e_acos.c index fa858defc5..eb4080a8b8 100644 --- a/sysdeps/libm-ieee754/e_acos.c +++ b/sysdeps/libm-ieee754/e_acos.c @@ -71,7 +71,7 @@ qS[] ={1.0, -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */ double x; #endif { - double z,p,q,r,w,s,c,df,p1,p2,p3,q1,q2,q3,z2,z4,z6; + double z,p,q,r,w,s,c,df,p1,p2,p3,q1,q2,z2,z4,z6; int32_t hx,ix; GET_HIGH_WORD(hx,x); ix = hx&0x7fffffff; diff --git a/sysdeps/libm-ieee754/e_asin.c b/sysdeps/libm-ieee754/e_asin.c index 65dc318db3..aa19598848 100644 --- a/sysdeps/libm-ieee754/e_asin.c +++ b/sysdeps/libm-ieee754/e_asin.c @@ -79,7 +79,7 @@ qS[] = {1.0, -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */ double x; #endif { - double t,w,p,q,c,r,s,p1,p2,p3,q1,q2,q3,z2,z4,z6; + double t,w,p,q,c,r,s,p1,p2,p3,q1,q2,z2,z4,z6; int32_t hx,ix; GET_HIGH_WORD(hx,x); ix = hx&0x7fffffff; diff --git a/sysdeps/unix/bsd/poll.c b/sysdeps/unix/bsd/poll.c index e92b718022..23ae6e21be 100644 --- a/sysdeps/unix/bsd/poll.c +++ b/sysdeps/unix/bsd/poll.c @@ -16,11 +16,14 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include #include #include #include #include #include +#include +#include /* Poll the file descriptors described by the NFDS structures starting at FDS. If TIMEOUT is nonzero and not -1, allow TIMEOUT milliseconds for @@ -34,25 +37,37 @@ __poll (fds, nfds, timeout) unsigned long int nfds; int timeout; { + static int max_fd_size; struct timeval tv; - fd_set rset, wset, xset; + fd_set *rset, *wset, *xset; struct pollfd *f; int ready; int maxfd = 0; + int bytes; - FD_ZERO (&rset); - FD_ZERO (&wset); - FD_ZERO (&xset); + if (!max_fd_size) + max_fd_size = __getdtablesize (); + + bytes = howmany (max_fd_size, __NFDBITS); + rset = alloca (bytes); + wset = alloca (bytes); + xset = alloca (bytes); + + /* We can't call FD_ZERO, since FD_ZERO only works with sets + of exactly __FD_SETSIZE size. */ + __bzero (rset, bytes); + __bzero (wset, bytes); + __bzero (xset, bytes); for (f = fds; f < &fds[nfds]; ++f) if (f->fd >= 0) { if (f->events & POLLIN) - FD_SET (f->fd, &rset); + FD_SET (f->fd, rset); if (f->events & POLLOUT) - FD_SET (f->fd, &wset); + FD_SET (f->fd, wset); if (f->events & POLLPRI) - FD_SET (f->fd, &xset); + FD_SET (f->fd, xset); if (f->fd > maxfd && (f->events & (POLLIN|POLLOUT|POLLPRI))) maxfd = f->fd; } @@ -60,19 +75,18 @@ __poll (fds, nfds, timeout) tv.tv_sec = timeout / 1000; tv.tv_usec = (timeout % 1000) * 1000; - ready = __select (maxfd + 1, &rset, &wset, &xset, - timeout == -1 ? NULL : &tv); + ready = __select (maxfd + 1, rset, wset, xset, timeout == -1 ? NULL : &tv); if (ready > 0) for (f = fds; f < &fds[nfds]; ++f) { f->revents = 0; if (f->fd >= 0) { - if (FD_ISSET (f->fd, &rset)) + if (FD_ISSET (f->fd, rset)) f->revents |= POLLIN; - if (FD_ISSET (f->fd, &wset)) + if (FD_ISSET (f->fd, wset)) f->revents |= POLLOUT; - if (FD_ISSET (f->fd, &xset)) + if (FD_ISSET (f->fd, xset)) f->revents |= POLLPRI; } } diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist index 27b3077a65..89758cd3a8 100644 --- a/sysdeps/unix/sysv/linux/Dist +++ b/sysdeps/unix/sysv/linux/Dist @@ -1,3 +1,4 @@ +bits/pthreadtypes.h stdio_lim.h.in cmsg_nxthdr.c errlist.h @@ -74,3 +75,5 @@ sys/user.h sys/vt.h xstatconv.c getdents64.c +__sendmsg.S +__recvmsg.S diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index ec42e776c0..7de1008716 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -58,7 +58,7 @@ ifeq ($(subdir),socket) sysdep_headers += net/if.h net/if_ppp.h net/ppp-comp.h \ net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \ net/if_slip.h net/if_packet.h -sysdep_routines += cmsg_nxthdr sa_len +sysdep_routines += cmsg_nxthdr sa_len __sendmsg __recvmsg endif ifeq ($(subdir),sunrpc) @@ -75,7 +75,7 @@ inhibit-siglist := yes endif ifeq ($(subdir),posix) -headers := bits/pthreadtypes.h +sysdep_headers += bits/pthreadtypes.h endif ifeq ($(subdir),inet) diff --git a/sysdeps/unix/sysv/linux/recvmsg.S b/sysdeps/unix/sysv/linux/__recvmsg.S similarity index 51% rename from sysdeps/unix/sysv/linux/recvmsg.S rename to sysdeps/unix/sysv/linux/__recvmsg.S index 98be36be5b..515ff552aa 100644 --- a/sysdeps/unix/sysv/linux/recvmsg.S +++ b/sysdeps/unix/sysv/linux/__recvmsg.S @@ -1,5 +1,5 @@ -#define socket recvmsg +#define socket __recvmsg #define __socket __libc_recvmsg +#define SOCKOP___recvmsg SOCKOP_recvmsg #define NARGS 3 #include -weak_alias (__libc_recvmsg, __recvmsg) diff --git a/sysdeps/unix/sysv/linux/sendmsg.S b/sysdeps/unix/sysv/linux/__sendmsg.S similarity index 51% rename from sysdeps/unix/sysv/linux/sendmsg.S rename to sysdeps/unix/sysv/linux/__sendmsg.S index c01d9b68e7..165ee14698 100644 --- a/sysdeps/unix/sysv/linux/sendmsg.S +++ b/sysdeps/unix/sysv/linux/__sendmsg.S @@ -1,5 +1,5 @@ -#define socket sendmsg +#define socket __sendmsg #define __socket __libc_sendmsg +#define SOCKOP___sendmsg SOCKOP_sendmsg #define NARGS 3 #include -weak_alias (__libc_sendmsg, __sendmsg) diff --git a/sysdeps/unix/sysv/linux/aio_sigqueue.c b/sysdeps/unix/sysv/linux/aio_sigqueue.c index fc1187b443..5dea29fcf6 100644 --- a/sysdeps/unix/sysv/linux/aio_sigqueue.c +++ b/sysdeps/unix/sysv/linux/aio_sigqueue.c @@ -24,9 +24,6 @@ extern int __syscall_rt_sigqueueinfo (int, int, siginfo_t *); -/* This variable is used quite often in the libc code. */ -extern pid_t __libc_pid; - /* Return any pending signal or wait for one for the given time. */ int @@ -40,10 +37,8 @@ __aio_sigqueue (sig, val) info.si_signo = sig; info.si_errno = 0; info.si_code = SI_ASYNCIO; - info.si_pid = getpid (); info.si_uid = getuid (); - info.si_value = val; return __syscall_rt_sigqueueinfo (info.si_pid, sig, &info); diff --git a/sysdeps/unix/sysv/linux/bits/sched.h b/sysdeps/unix/sysv/linux/bits/sched.h index c7f6d8d902..9d5d5e65df 100644 --- a/sysdeps/unix/sysv/linux/bits/sched.h +++ b/sysdeps/unix/sysv/linux/bits/sched.h @@ -57,6 +57,8 @@ extern int clone __P ((int (*__fn) (void *__arg), void *__child_stack, int __flags, void *__arg)); #endif +__END_DECLS + #endif /* need schedparam */ #if !defined __defined_schedparam \ @@ -69,5 +71,3 @@ struct __sched_param }; # undef __need_schedparam #endif - -__END_DECLS diff --git a/sysdeps/unix/sysv/linux/bits/socket.h b/sysdeps/unix/sysv/linux/bits/socket.h index 5517ba8803..c1f752ec29 100644 --- a/sysdeps/unix/sysv/linux/bits/socket.h +++ b/sysdeps/unix/sysv/linux/bits/socket.h @@ -222,12 +222,32 @@ __cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg) . */ enum { - SCM_RIGHTS = 0x01, /* Data array contains access rights. */ + SCM_RIGHTS = 0x01, /* Transfer file descriptors. */ #define SCM_RIGHTS SCM_RIGHTS - __SCM_CREDENTIALS = 0x02, /* Data array is `struct ucred'. */ - __SCM_CONNECT = 0x03 /* Data array is `struct scm_connect'. */ +#ifdef __USE_BSD + SCM_CREDS = 0x02, /* BSD-compatible credentials passing. */ +# define SCM_CREDS SCM_CREDS +#endif + __SCM_CONNECT = 0x03, /* Data array is `struct scm_connect'. */ }; +#ifdef __USE_BSD + +/* User visible structure for SCM_CREDS message + (chosen for BSD source compatibility) */ + +# define CMGROUP_MAX 16 /* Linux does not provide this info, so it doesn't + matter... use what bsd does. */ +struct cmsgcred +{ + pid_t cmcred_pid; /* PID of sending process. */ + uid_t cmcred_uid; /* Real UID of sending process. */ + uid_t cmcred_euid; /* Effective UID of sending process. */ + gid_t cmcred_gid; /* Real GID of sending process. */ + short int cmcred_ngroups; /* Number or groups. */ + gid_t cmcred_groups[CMGROUP_MAX]; /* Groups. */ +}; +#endif /* Get socket manipulation related informations from kernel headers. */ #include diff --git a/sysdeps/unix/sysv/linux/recvmsg.c b/sysdeps/unix/sysv/linux/recvmsg.c new file mode 100644 index 0000000000..04cf230828 --- /dev/null +++ b/sysdeps/unix/sysv/linux/recvmsg.c @@ -0,0 +1,93 @@ +/* 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 + 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 +#include +#include + +#include + +/* The kernel expects this structure in SCM_CREDS messages. + * Note: sizeof(struct __kernel_ucred) <= sizeof(struct cmsgcred) must hold. + */ +struct __kernel_ucred +{ + __kernel_pid_t pid; + __kernel_uid_t uid; + __kernel_gid_t gid; +}; + +extern int __recvmsg (int, struct msghdr *, int); + +int +recvmsg (fd, message, flags) + int fd; + struct msghdr *message; + int flags; +{ + struct cmsghdr *cm; + int ret; + int found_creds = 0; + + /* Must check for space first. */ + cm = CMSG_FIRSTHDR (message); + while (cm) + { + if (cm->cmsg_type == SCM_CREDS) + { + if (cm->cmsg_len < CMSG_SPACE (sizeof (struct cmsgcred))) + { + __set_errno (EINVAL); + return -1; + } + found_creds = 1; + } + cm = CMSG_NXTHDR (message, cm); + } + + + ret = __recvmsg (fd, message, flags); + + if (ret == -1) + return ret; + + /* Postprocess the message control block for SCM_CREDS. */ + cm = CMSG_FIRSTHDR (message); + if (found_creds) + while (cm) + { + if (cm->cmsg_type == SCM_CREDS) + { + struct cmsgcred *c = (struct cmsgcred *) CMSG_DATA (cm); + struct __kernel_ucred u; + int i; + memcpy (&u, CMSG_DATA (cm), sizeof (struct __kernel_ucred)); + + c->cmcred_pid = u.pid; + c->cmcred_uid = u.uid; + c->cmcred_gid = u.gid; + + c->cmcred_euid = -1; + c->cmcred_ngroups = 0; + for (i = 0; i < CMGROUP_MAX; i++) + c->cmcred_groups[i] = -1; + } + cm = CMSG_NXTHDR (message, cm); + } + return ret; +} diff --git a/sysdeps/unix/sysv/linux/sendmsg.c b/sysdeps/unix/sysv/linux/sendmsg.c new file mode 100644 index 0000000000..8902530c2b --- /dev/null +++ b/sysdeps/unix/sysv/linux/sendmsg.c @@ -0,0 +1,91 @@ +/* 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 + 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 +#include +#include + +#include + +/* The kernel expects this structure in SCM_CREDS messages. + * Note: sizeof(struct __kernel_ucred) <= sizeof(struct cmsgcred) must hold. + */ +struct __kernel_ucred +{ + __kernel_pid_t pid; + __kernel_uid_t uid; + __kernel_gid_t gid; +}; + +extern int __sendmsg (int, const struct msghdr *, int); + +/* Send a message described by MESSAGE on socket FD. + Returns the number of bytes sent, or -1 for errors. */ +int +sendmsg (fd, message, flags) + int fd; + const struct msghdr *message; + int flags; +{ + struct cmsghdr *cm; + struct cmsgcred *cc; + struct __kernel_ucred *u; + pid_t pid; + + /* Preprocess the message control block for SCM_CREDS. */ + cm = CMSG_FIRSTHDR (message); + while (cm) + { + if (cm->cmsg_type == SCM_CREDS) + { + if (cm->cmsg_len < CMSG_SPACE (sizeof (struct cmsgcred))) + { + __set_errno (EINVAL); + return -1; + } + + u = (struct __kernel_ucred *) CMSG_DATA (cm); + cc = (struct cmsgcred *) CMSG_DATA (cm); + /* Linux expects the calling process to pass in + its credentials, and sanity checks them. + You can send real, effective, or set- uid and gid. + If the user hasn't filled in the buffer, we default to + real uid and gid. */ + pid = getpid (); + if (cc->cmcred_pid != pid) + { + u->pid = pid; + u->uid = getuid (); + u->gid = getgid (); + } + else + { + struct __kernel_ucred v; + v.pid = cc->cmcred_pid; + v.uid = cc->cmcred_uid; + v.gid = cc->cmcred_gid; + u->pid = v.pid; + u->uid = v.uid; + u->gid = v.gid; + } + } + cm = CMSG_NXTHDR ((struct msghdr *) message, cm); + } + + return __sendmsg (fd, message, flags); +} diff --git a/time/tzfile.c b/time/tzfile.c index 1d51a695ff..eca09e2bbb 100644 --- a/time/tzfile.c +++ b/time/tzfile.c @@ -60,6 +60,7 @@ static size_t num_leaps; static struct leap *leaps = NULL; #include +#include /* Decode the four bytes at PTR as a signed integer in network byte order. */ static inline int @@ -67,6 +68,8 @@ decode (const void *ptr) { if ((BYTE_ORDER == BIG_ENDIAN) && sizeof (int) == 4) return *(const int *) ptr; + else if (BYTE_ORDER == LITTLE_ENDIAN && sizeof (int) == 4) + return bswap_32 (*(const int *) ptr); else { const unsigned char *p = ptr; @@ -157,7 +160,7 @@ __tzfile_read (const char *file) if (f == NULL) return; - if (fread ((void *) &tzhead, sizeof (tzhead), 1, f) != 1) + if (fread_unlocked ((void *) &tzhead, sizeof (tzhead), 1, f) != 1) goto lose; num_transitions = (size_t) decode (tzhead.tzh_timecnt); @@ -198,8 +201,8 @@ __tzfile_read (const char *file) if (sizeof (time_t) < 4) abort (); - if (fread(transitions, 4, num_transitions, f) != num_transitions || - fread(type_idxs, 1, num_transitions, f) != num_transitions) + if (fread_unlocked (transitions, 4, num_transitions, f) != num_transitions + || fread_unlocked (type_idxs, 1, num_transitions, f) != num_transitions) goto lose; /* Check for bogus indices in the data file, so we can hereafter @@ -222,32 +225,32 @@ __tzfile_read (const char *file) for (i = 0; i < num_types; ++i) { unsigned char x[4]; - if (fread (x, 1, 4, f) != 4 || - fread (&types[i].isdst, 1, 1, f) != 1 || - fread (&types[i].idx, 1, 1, f) != 1) + if (fread_unlocked (x, 1, 4, f) != 4 + || fread_unlocked (&types[i].isdst, 1, 1, f) != 1 + || fread_unlocked (&types[i].idx, 1, 1, f) != 1) goto lose; if (types[i].idx >= chars) /* Bogus index in data file. */ goto lose; types[i].offset = (long int) decode (x); } - if (fread (zone_names, 1, chars, f) != chars) + if (fread_unlocked (zone_names, 1, chars, f) != chars) goto lose; for (i = 0; i < num_leaps; ++i) { unsigned char x[4]; - if (fread (x, 1, sizeof (x), f) != sizeof (x)) + if (fread_unlocked (x, 1, sizeof (x), f) != sizeof (x)) goto lose; leaps[i].transition = (time_t) decode (x); - if (fread (x, 1, sizeof (x), f) != sizeof (x)) + if (fread_unlocked (x, 1, sizeof (x), f) != sizeof (x)) goto lose; leaps[i].change = (long int) decode (x); } for (i = 0; i < num_isstd; ++i) { - int c = getc (f); + int c = getc_unlocked (f); if (c == EOF) goto lose; types[i].isstd = c != 0; @@ -257,7 +260,7 @@ __tzfile_read (const char *file) for (i = 0; i < num_isgmt; ++i) { - int c = getc (f); + int c = getc_unlocked (f); if (c == EOF) goto lose; types[i].isgmt = c != 0; @@ -271,8 +274,7 @@ __tzfile_read (const char *file) We choose the offsets in the types of each flavor that are transitioned to earliest in time. */ __tzname[1] = NULL; - for (i = 0; i < num_types && i < sizeof (__tzname) / sizeof (__tzname[0]); - ++i) + for (i = 0; i < num_types; ++i) __tzname[types[i].isdst] = __tzstring (&zone_names[types[i].idx]); if (__tzname[1] == NULL) __tzname[1] = __tzname[0]; @@ -296,8 +298,8 @@ __tzfile_read (const char *file) __use_tzfile = 1; return; - lose:; - fclose(f); + lose: + fclose (f); } /* The user specified a hand-made timezone, but not its DST rules. @@ -425,10 +427,8 @@ __tzfile_compute (time_t timer, int use_localtime, __daylight = rule_stdoff != rule_dstoff; __timezone = -rule_stdoff; __tzname[1] = NULL; - for (i = 0; - i < num_types && i < sizeof (__tzname) / sizeof (__tzname[0]); - ++i) - __tzname[types[i].isdst] = &zone_names[types[i].idx]; + for (i = 0; i < num_types; ++i) + __tzname[types[i].isdst] = __tzstring (&zone_names[types[i].idx]); if (__tzname[1] == NULL) /* There is no daylight saving time. */ __tzname[1] = __tzname[0]; @@ -455,9 +455,9 @@ __tzfile_compute (time_t timer, int use_localtime, leaps[i].change > leaps[i - 1].change)) { *leap_hit = 1; - while (i > 0 && - leaps[i].transition == leaps[i - 1].transition + 1 && - leaps[i].change == leaps[i - 1].change + 1) + while (i > 0 + && leaps[i].transition == leaps[i - 1].transition + 1 + && leaps[i].change == leaps[i - 1].change + 1) { ++*leap_hit; --i; @@ -483,5 +483,6 @@ compute_tzname_max (size_t chars) ++p; if ((size_t) (p - start) > __tzname_cur_max) __tzname_cur_max = p - start; - } while (++p < &zone_names[chars]); + } + while (++p < &zone_names[chars]); } diff --git a/time/tzset.c b/time/tzset.c index 4b8fa41021..9c8e5d7b9c 100644 --- a/time/tzset.c +++ b/time/tzset.c @@ -115,7 +115,7 @@ char * __tzstring (string) const char *string; { - struct tzstring_head *h = &tzstring_list.head; + struct tzstring_head *h; size_t needed; char *p; @@ -139,7 +139,8 @@ __tzstring (string) size_t buffer_size = tzstring_last_buffer_size; while ((buffer_size *= 2) < needed) continue; - if (! (h = h->next = malloc (sizeof *h + buffer_size))) + h = malloc (sizeof *h + buffer_size); + if (h == NULL) return NULL; h->next = NULL; tzstring_last_buffer_size = buffer_size; diff --git a/timezone/tst-timezone.c b/timezone/tst-timezone.c index 49b3621128..d05632d272 100644 --- a/timezone/tst-timezone.c +++ b/timezone/tst-timezone.c @@ -20,6 +20,7 @@ #include #include #include +#include #include int failed = 0; @@ -29,14 +30,16 @@ struct test_times const char *name; int daylight; int timezone; + const char *tzname[2]; }; static const struct test_times tests[] = { - { "Europe/Berlin", 1, -3600 }, - { "Universal", 0, 0 }, - { "Australia/Melbourne", 1, -36000 }, - { "America/Sao_Paulo", 1, 10800 }, + { "Europe/Berlin", 1, -3600, { "CET", "CEST" }}, + { "Universal", 0, 0, {"UTC", "UTC" }}, + { "Australia/Melbourne", 1, -36000, { "EST", "EST" }}, + { "America/Sao_Paulo", 1, 10800, {"EST", "EDT" }}, + { "America/Los_Angeles", 1, 28800, {"PST", "PDT" }}, { NULL, 0, 0 } }; @@ -52,8 +55,10 @@ print_tzvars (void) void -check_tzvars (const char *name, int dayl, int timez) +check_tzvars (const char *name, int dayl, int timez, const char *const tznam[]) { + int i; + if (daylight != dayl) { printf ("Timezone: %s, daylight is: %d but should be: %d\n", @@ -66,6 +71,13 @@ check_tzvars (const char *name, int dayl, int timez) name, timezone, timez); ++failed; } + for (i = 0; i <= 1; ++i) + if (strcmp (tzname[i], tznam[i]) != 0) + { + printf ("Timezone: %s, tzname[%d] is: %s but should be: %s\n", + name, i, tzname[i], tznam[i]); + ++failed; + } } @@ -92,12 +104,12 @@ main (int argc, char ** argv) } tzset (); print_tzvars (); - check_tzvars (pt->name, pt->daylight, pt->timezone); + check_tzvars (pt->name, pt->daylight, pt->timezone, pt->tzname); /* calling localtime shouldn't make a difference */ localtime (&t); print_tzvars (); - check_tzvars (pt->name, pt->daylight, pt->timezone); + check_tzvars (pt->name, pt->daylight, pt->timezone, pt->tzname); } return failed ? EXIT_FAILURE : EXIT_SUCCESS; diff --git a/wctype/Versions b/wctype/Versions index 3c24c22570..9b4fc57b1b 100644 --- a/wctype/Versions +++ b/wctype/Versions @@ -14,6 +14,9 @@ libc { wctrans; wctype; wcwidth; } GLIBC_2.1 { + # functions used in inline functions or macros + __towctrans; + # i* iswblank; }