diff options
32 files changed, 552 insertions, 188 deletions
@@ -1,3 +1,73 @@ +1998-06-22 17:02 Ulrich Drepper <drepper@cygnus.com> + + * sysdeps/generic/enbl-secure.c: Don't use __libc_uid. + * sysdeps/unix/sysv/linux/aio_sigqueue.c: Likewise. + * sysdeps/unix/sysv/linux/sigqueue.c: Likewise. + * sysdeps/unix/sysv/linux/init-first.c: Don't initialize __libc_uid. + +1998-06-02 Gordon Matzigkeit <gord@profitpress.com> + + * mach/Makefile: Change `mv' invocations to `mv -f'. + * mach/Machrules: Likewise. + +1998-06-22 Andreas Jaeger <aj@arthur.rhein-neckar.de> + + * config.make.in (old-glibc-headers): Add it. + + * configure.in: Add test for glibc 2.0.x headers. + + * Makefile (headers2_0): New variable - contains so far only + Linux/Intel glibc 2.0.x headers. + (remove-old-headers): New rule to remove headers from glibc 2.0.x. + (install): Depend on remove-old-headers. + +1998-06-19 Mark Kettenis <kettenis@phys.uva.nl> + + * sysdeps/generic/ftruncate.c: Define function as __ftruncate and + make ftruncate a weak alias. + * sysdeps/mach/hurd/ftruncate.c: Really define function as + __ftruncate. + * sysdeps/mach/hurd/truncate.c: Include <unistd.h>. + (truncate): Fix function defenition to match prototype. + +1998-06-20 Mark Kettenis <kettenis@phys.uva.nl> + + * manual/terminal.texi: Document ttyname_r, getpt, grantpt, + unlockpt, ptsname, ptsname_r, openpty and forkpty. + +1998-06-22 Ulrich Drepper <drepper@cygnus.com> + + * sysdeps/generic/glob.c: Make it possible to include glob.h + before loading glob.c. + Reported by Felix von Leitner <leitner@math.fu-berlin.de>. + +1998-06-22 Andreas Jaeger <aj@arthur.rhein-neckar.de> + + * nscd/connections.c: Use poll() instead of select(). + +1998-06-22 14:08 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * sysdeps/generic/Dist: Fix typo. + +1998-06-20 Thorsten Kukuk <kukuk@vt.uni-paderborn.de> + + * nis/nis_add.c: Avoid unnecessary strlen () calls. + * nis/nis_addmember.c: Likewise. + * nis/nis_call.c: Likewise. + * nis/nis_creategroup.c: Likewise. + * nis/nis_destroygroup.c: Likewise. + * nis/nis_findserv.c: Likewise. + * nis/nis_ismember.c: Likewise. + * nis/nis_print.c: Likewise. + * nis/nis_print_group_entry.c: Likewise. + * nis/nis_removemember.c: Likewise. + * nis/nis_verifygroup.c: Likewise. + * nis/ypclnt.c: Likewise. + + * nis/nis_file.c: Close file handles. + + * nis/nis_callback.c: Fix typo. + 1998-06-10 Thorsten Kukuk <kukuk@vt.uni-paderborn.de> * nis/Makefile: Add nis-initgroups and compat-initgroups. @@ -284,3 +284,29 @@ iconvdata/%: # need the only-MD5 based one as well. md5-crypt/libmd5crypt: $(MAKE) $(PARALLELMFLAGS) -C $(@D) $(@F) + +# glibc 2.0 contains some header files which aren't used with glibc 2.1 +# anymore. +# These rules should remove those headers +ifeq (,$(install_root)) +ifeq ($(old-glibc-headers),yes) +install: remove-old-headers +endif +endif + +headers2_0 := __math.h bytesex.h confname.h direntry.h elfclass.h \ + errnos.h fcntlbits.h huge_val.h ioctl-types.h \ + ioctls.h iovec.h jmp_buf.h libc-lock.h local_lim.h \ + mathcalls.h mpool.h nan.h ndbm.h posix1_lim.h \ + posix2_lim.h posix_opt.h resourcebits.h schedbits.h \ + selectbits.h semaphorebits.h sigaction.h sigcontext.h \ + signum.h sigset.h sockaddrcom.h socketbits.h stab.def \ + statbuf.h statfsbuf.h stdio-lock.h stdio_lim.h \ + syscall-list.h termbits.h timebits.h ustatbits.h \ + utmpbits.h utsnamelen.h waitflags.h waitstatus.h \ + xopen_lim.h gnu/types.h sys/ipc_buf.h \ + sys/kernel_termios.h sys/msq_buf.h sys/sem_buf.h \ + sys/shm_buf.h sys/socketcall.h + +remove-old-headers: + rm -f $(addprefix $(inst_includedir)/, $(headers2_0)) diff --git a/config.make.in b/config.make.in index 0a76b10..f87169f 100644 --- a/config.make.in +++ b/config.make.in @@ -35,6 +35,7 @@ elf = @elf@ have-initfini = @libc_cv_have_initfini@ need-nopic-initfini = @nopic_initfini@ with-cvs = @with_cvs@ +old-glibc-headers = @old_glibc_headers@ versioning = @VERSIONING@ no-whole-archive = @no_whole_archive@ @@ -2795,17 +2795,21 @@ default) stdio=stdio ;; esac echo "$ac_t""$stdio" 1>&6 -echo $ac_n "checking ldap selection""... $ac_c" 1>&6 -echo "configure:2800: checking ldap selection" >&5 - -case $add_ons in -*ldap*) - ldap=yes - LDAP=ldap ;; -*) ldap=no - LDAP= ;; -esac -echo "$ac_t""$ldap" 1>&6 +# Test for old glibc 2.0.x headers so that they can be removed properly +# Search only in includedir. +echo $ac_n "checking for old glibc 2.0.x headers""... $ac_c" 1>&6 +echo "configure:2802: checking for old glibc 2.0.x headers" >&5 +if eval test -e "${includedir}/elfclass.h" -a -e "${includedir}/fcntlbits.h" +then + old_glibc_headers=yes +else + old_glibc_headers=no +fi +echo "$ac_t""$old_glibc_headers" 1>&6 +if test ${old_glibc_headers} = yes; then + echo "configure: warning: *** During \"make install\" old headers from glibc 2.0.x will" 1>&2 + echo "configure: warning: *** be removed." 1>&2 +fi @@ -2847,7 +2851,7 @@ if test $shared = default; then fi echo $ac_n "checking whether -fPIC is default""... $ac_c" 1>&6 -echo "configure:2851: checking whether -fPIC is default" >&5 +echo "configure:2855: checking whether -fPIC is default" >&5 if eval "test \"`echo '$''{'pic_default'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3060,7 +3064,6 @@ s%@uname_sysname@%$uname_sysname%g s%@uname_release@%$uname_release%g s%@uname_version@%$uname_version%g s%@stdio@%$stdio%g -s%@LDAP@%$LDAP%g s%@libc_cv_slibdir@%$libc_cv_slibdir%g s%@libc_cv_sysconfdir@%$libc_cv_sysconfdir%g s%@libc_cv_rootsbindir@%$libc_cv_rootsbindir%g diff --git a/configure.in b/configure.in index 5084d8e..997cace 100644 --- a/configure.in +++ b/configure.in @@ -1101,16 +1101,20 @@ default) stdio=stdio ;; esac AC_MSG_RESULT($stdio) -AC_MSG_CHECKING(ldap selection) -AC_SUBST(LDAP) -case $add_ons in -*ldap*) - ldap=yes - LDAP=ldap ;; -*) ldap=no - LDAP= ;; -esac -AC_MSG_RESULT($ldap) +# Test for old glibc 2.0.x headers so that they can be removed properly +# Search only in includedir. +AC_MSG_CHECKING(for old glibc 2.0.x headers) +if eval test -e "${includedir}/elfclass.h" -a -e "${includedir}/fcntlbits.h" +then + old_glibc_headers=yes +else + old_glibc_headers=no +fi +AC_MSG_RESULT($old_glibc_headers) +if test ${old_glibc_headers} = yes; then + AC_MSG_WARN(*** During \"make install\" old headers from glibc 2.0.x will) + AC_MSG_WARN(*** be removed.) +fi AC_SUBST(libc_cv_slibdir) AC_SUBST(libc_cv_sysconfdir) diff --git a/mach/Machrules b/mach/Machrules index b5ae381..f78b15d 100644 --- a/mach/Machrules +++ b/mach/Machrules @@ -87,7 +87,7 @@ $(objpfx)%.ir: $(objpfx)%.uh $(objpfx)%.h { printf \"$*-calls += %s\\n\", \$$3 }" $< ;\ echo '$$($*-calls:%=$$(objpfx)R\%C_%.c): $$(objpfx)$*.ustamp ;';\ ) > $@-new - mv $@-new $@ + mv -f $@-new $@ vpath Machrules ../mach # Find ourselves. ifndef transform-user-stub-output @@ -161,7 +161,7 @@ $(objpfx)%.h: $(objpfx)%.__h $(objpfx)%.uh # The last line of foo.__h is "#endif _foo_user_". # The first two lines of foo.uh are "#ifndef _foo_user_"/"#define _foo_user_". (sed -e '$$d' $<; sed -e '1,2d' $(word 2,$^)) > $@-new - mv $@-new $@ + mv -f $@-new $@ interface-routines := $(foreach if,$(user-interfaces), \ $(addprefix RPC_,$($(if)-calls))) \ diff --git a/mach/Makefile b/mach/Makefile index 12de148..2081266 100644 --- a/mach/Makefile +++ b/mach/Makefile @@ -77,7 +77,7 @@ $(objpfx)mach-syscalls.mk: syscalls.awk Makefile sed -n -e 's/^kernel_trap(\(.*\),\([-0-9]*\),\([0-9]*\))$$/\1 \2 \3/p'\ | $(AWK) -f $< > $@-new cat $@-dep >> $@-new; rm -f $@-dep - mv $@-new $@ + mv -f $@-new $@ generated += mach-syscalls.mk ifndef mach-syscalls @@ -89,7 +89,7 @@ $(mach-syscalls:%=$(objpfx)%.S): $(objpfx)%.S: $(objpfx)mach-syscalls.mk (echo '#include <sysdep.h>'; \ echo 'kernel_trap(__$*,$(sysno-$*),$(nargs-$*))'; \ echo 'weak_alias (__$*, $*)') > $@-new - mv $@-new $@ + mv -f $@-new $@ generated += $(mach-syscalls:=.S) endif # mach-syscalls @@ -119,7 +119,7 @@ $(mach-shortcuts:%=$(objpfx)%.c): $(objpfx)%.c: shortcut.awk \ $(objpfx)RPC_%_rpc.c $(AWK) -v alias=$* -v call=__$* -v rpc=__$*_rpc \ -v syscall=__syscall_$* -f $^ > $@-new - mv $@-new $@ + mv -f $@-new $@ generated += $(mach-shortcuts:%=%.c) endif # mach-shortcuts @@ -134,7 +134,7 @@ $(objpfx)mach-shortcuts.h: $(objpfx)mach/mach_interface.h \ cat $^ | tr \\012 @ | sed s/@@/@%/g | tr % \\012 \ | grep '^/\* Routine [a-z0-9_]*_rpc \*/' \ | sed 's/_rpc//g' | tr @ \\012 > $@-new - mv $@-new $@ + mv -f $@-new $@ generated += mach-shortcuts.h before-compile += $(objpfx)mach-shortcuts.h @@ -149,4 +149,4 @@ generated += errsystems.c $(objpfx)errsystems.c: errsystems.awk err_*.sub \ $(wildcard $(addsuffix /err_*.sub,$(+sysdep_dirs))) $(AWK) -v subsys='$(filter-out $<,$^)' -f $^ > $@.n - mv $@.n $@ + mv -f $@.n $@ diff --git a/manual/terminal.texi b/manual/terminal.texi index 4e4be88..e6dc36d 100644 --- a/manual/terminal.texi +++ b/manual/terminal.texi @@ -22,6 +22,7 @@ descriptor is and how to open a file descriptor for a terminal device. * Line Control:: Sending break sequences, clearing terminal buffers @dots{} * Noncanon Example:: How to read single characters without echo. +* Pseudo-Terminals:: How to open a pseudo-terminal. @end menu @node Is It a Terminal @@ -35,14 +36,14 @@ descriptor is associated with a terminal by using the @code{isatty} function. @pindex unistd.h -Prototypes for both @code{isatty} and @code{ttyname} are declared in -the header file @file{unistd.h}. +Prototypes for the functions in this section are declared in the header +file @file{unistd.h}. @comment unistd.h @comment POSIX.1 @deftypefun int isatty (int @var{filedes}) This function returns @code{1} if @var{filedes} is a file descriptor -associated with an open terminal device, and @code{0} otherwise. +associated with an open terminal device, and @math{0} otherwise. @end deftypefun If a file descriptor is associated with a terminal, you can get its @@ -59,6 +60,30 @@ the terminal file. The value is a null pointer if the file descriptor isn't associated with a terminal, or the file name cannot be determined. @end deftypefun +@comment unistd.h +@comment POSIX.1 +@deftypefun int ttyname_r (int @var{filedes}, char *@var{buf}, size_t @var{len}) +The @code{ttyname_r} function is similar to the @code{ttyname} function +except that it places its result into the user-specified buffer starting +at @var{buf} with length @var{len}. + +The normal return value from @code{ttyname_r} is @math{0}. Otherwise an +error number is returned to indicate the error. The following +@code{errno} error conditions are defined for this function: + +@table @code +@item EBADF +The @var{filedes} argument is not a valid file descriptor. + +@item ENOTTY +The @var{filedes} is not associated with a terminal. + +@item ERANGE +The buffer length @var{len} is too small to store the string to be +returned. +@end table +@end deftypefun + @node I/O Queues @section I/O Queues @@ -237,7 +262,7 @@ This function is used to examine the attributes of the terminal device with file descriptor @var{filedes}. The attributes are returned in the structure that @var{termios-p} points to. -If successful, @code{tcgetattr} returns @code{0}. A return value of @code{-1} +If successful, @code{tcgetattr} returns @math{0}. A return value of @math{-1} indicates an error. The following @code{errno} error conditions are defined for this function: @@ -302,8 +327,8 @@ write to the terminal. The exception is if the calling process itself is ignoring or blocking @code{SIGTTOU} signals, in which case the operation is performed and no signal is sent. @xref{Job Control}. -If successful, @code{tcsetattr} returns @code{0}. A return value of -@code{-1} indicates an error. The following @code{errno} error +If successful, @code{tcsetattr} returns @math{0}. A return value of +@math{-1} indicates an error. The following @code{errno} error conditions are defined for this function: @table @code @@ -997,27 +1022,27 @@ This function returns the input line speed stored in the structure @comment POSIX.1 @deftypefun int cfsetospeed (struct termios *@var{termios-p}, speed_t @var{speed}) This function stores @var{speed} in @code{*@var{termios-p}} as the output -speed. The normal return value is @code{0}; a value of @code{-1} +speed. The normal return value is @math{0}; a value of @math{-1} indicates an error. If @var{speed} is not a speed, @code{cfsetospeed} -returns @code{-1}. +returns @math{-1}. @end deftypefun @comment termios.h @comment POSIX.1 @deftypefun int cfsetispeed (struct termios *@var{termios-p}, speed_t @var{speed}) This function stores @var{speed} in @code{*@var{termios-p}} as the input -speed. The normal return value is @code{0}; a value of @code{-1} +speed. The normal return value is @math{0}; a value of @math{-1} indicates an error. If @var{speed} is not a speed, @code{cfsetospeed} -returns @code{-1}. +returns @math{-1}. @end deftypefun @comment termios.h @comment BSD @deftypefun int cfsetspeed (struct termios *@var{termios-p}, speed_t @var{speed}) This function stores @var{speed} in @code{*@var{termios-p}} as both the -input and output speeds. The normal return value is @code{0}; a value -of @code{-1} indicates an error. If @var{speed} is not a speed, -@code{cfsetspeed} returns @code{-1}. This function is an extension in +input and output speeds. The normal return value is @math{0}; a value +of @math{-1} indicates an error. If @var{speed} is not a speed, +@code{cfsetspeed} returns @math{-1}. This function is an extension in 4.4 BSD. @end deftypefun @@ -1035,7 +1060,7 @@ will succeed. But they do not check that a particular hardware device can actually support the specified speeds---in fact, they don't know which device you plan to set the speed for. If you use @code{tcsetattr} to set the speed of a particular device to a value that it cannot -handle, @code{tcsetattr} returns @code{-1}. +handle, @code{tcsetattr} returns @math{-1}. @strong{Portability note:} In the GNU library, the functions above accept speeds measured in bits per second as input, and return speed @@ -1629,7 +1654,7 @@ This function does nothing if the terminal is not an asynchronous serial data port. The return value is normally zero. In the event of an error, a value -of @code{-1} is returned. The following @code{errno} error conditions +of @math{-1} is returned. The following @code{errno} error conditions are defined for this function: @table @code @@ -1659,7 +1684,7 @@ protected using cancelation handlers. @c ref pthread_cleanup_push / pthread_cleanup_pop The return value is normally zero. In the event of an error, a value -of @code{-1} is returned. The following @code{errno} error conditions +of @math{-1} is returned. The following @code{errno} error conditions are defined for this function: @table @code @@ -1705,7 +1730,7 @@ Clear both queued input and output. @end table The return value is normally zero. In the event of an error, a value -of @code{-1} is returned. The following @code{errno} error conditions +of @math{-1} is returned. The following @code{errno} error conditions are defined for this function: @table @code @@ -1759,7 +1784,7 @@ For more information about the STOP and START characters, see @ref{Special Characters}. The return value is normally zero. In the event of an error, a value -of @code{-1} is returned. The following @code{errno} error conditions +of @math{-1} is returned. The following @code{errno} error conditions are defined for this function: @table @code @@ -1805,3 +1830,231 @@ a process is stopped or continued; see @ref{Job Control}. But some existing shells do not actually do this, so you may wish to establish handlers for job control signals that reset terminal modes. The above example does so. + + +@node Pseudo-Terminals +@section Pseudo-Terminals +@cindex pseudo-terminals + +A @dfn{pseudo-terminal} is a special interprocess communication channel +that acts like a terminal. On one end of the channel is called the +@dfn{master} side or @dfn{master pseudo-terminal device}, the other side +is called the @dfn{slave} side. Data written to the the master side is +received by the slave side as if it was the result of a user typing at +an ordinary terminal, and data written to the slave side is sent to the +master side as if it was written on an ordinary terminal. + +Pseudo terminals are the way programs like @code{xterm} and @code{emacs} +implement their terminal emulation functionality. + +@menu +* Allocation:: Allocating a pseudo terminal. +* Pseudo-Terminal Pairs:: How to open both sides of a + pseudo-terminal in a single operation. +@end menu + +@node Allocation +@subsection Allocating Pseudo-Terminals +@cindex allocating pseudo-terminals + +@pindex stdlib.h +This subsection describes functions for allocating a pseudo-terminals, +and for making this pseudo-terminal available for actual use. These +functions are declared in the header file @file{stdlib.h}. + +@comment stdlib.h +@comment GNU +@deftypefun int getpt (void) +The @code{getpt} function returns a new file descriptor for the next +available master pseudo-terminal. The normal return value from +@code{getpt} is a non-negative integer file descriptor. In the case of +an error, a value of @math{-1} is returned instead. The following +@code{errno} conditions are defined for this function: + +@table @code +@item ENFILE +There are no master pseudo-terminals available. +@end table + +This function is a GNU extension. +@end deftypefun + +@comment stdlib.h +@comment SVID, XPG4.2 +@deftypefun int grantpt (int @var{filedes}) +The @code{grantpt} function changes the ownership and access permission +of the slave pseudo-terminal device corresponding to the master +pseudo-terminal device associated with the file descriptor +@var{filedes}. The owner is set from the real user ID of the calling +process (@pxref{Process Persona}), and the group is set to a special +group (typically @dfn{tty}) or from the real group ID of the calling +process. The access permission is set such that the file is both +readable and writable by the owner and only writable by the group. + +On some systems this function is implemented by invoking a special +@code{setuid} root program (@pxref{How Change Persona}). As a +consequence, installing a signal handler for the @code{SIGCHLD} signal +(@pxref{Job Control Signals}) may interfere with a call to +@code{grantpt}. + +The normal return value from @code{grantpt} is @math{0}; a value of +@math{-1} is returned in case of failure. The following @code{errno} +error conditions are defined for this function: + +@table @code +@item EBADF +The @var{filedes} argument is not a valid file descriptor. + +@item ENINVAL +The @var{filedes} argument is not associated with a master pseudo-terminal +device. + +@item EACCESS +The slave pseudo-terminal device corresponding to the master associated +with @var{filedes} could not be accessed. +@end table + +@end deftypefun + +@comment stdlib.h +@comment SVID, XPG4.2 +@deftypefun int unlockpt (int @var{filedes}) +The @code{unlockpt} function unlocks the slave pseudo-terminal device +corresponding to the master pseudo-terminal device associated with the +file descriptor @var{filedes}. On many systems, the slave can only be +opened after unlocking, so portable applications should always call +@code{unlockpt} before trying to open the slave. + +The normal return value from @code{unlockpt} is @math{0}; a value of +@math{-1} is returned in case of failure. The following @code{errno} +error conditions are defined for this function: + +@table @code +@item EBADF +The @var{filedes} argument is not a valid file descriptor. + +@item EINVAL +The @var{filedes} argument is not associated with a master pseudo-terminal +device. +@end table +@end deftypefun + +@comment stdlib.h +@comment SVID, XPG4.2 +@deftypefun {char *} ptsname (int @var{filedes}) +If the file descriptor @var{filedes} is associated with a +master pseudo-terminal device, the @code{ptsname} function returns a +pointer to a statically-allocated, null-terminated string containing the +file name of the associated slave pseudo-terminal file. This string +might be overwritten by subsequent calls to @code{ptsname}. +@end deftypefun + +@comment stdlib.h +@comment GNU +@deftypefun int ptsname_r (int @var{filedes}, char *@var{buf}, size_t @var{len}) +The @code{ptsname_r} function is similar to the @code{ptsname} function +except that it places its result into the user-specified buffer starting +at @var{buf} with length @var{len}. + +This function is a GNU extension. +@end deftypefun + +@strong{Portability Note:} On @w{System V} derived systems, the file +returned by the @code{ptsname} and @code{ptsname_r} functions may be +STREAMS-based, and therefore require additional processing after opening +before it actually behaves as a pseudo terminal. +@c FIXME: xref STREAMS + +Typical usage of these functions is illustrated by the following example: +@smallexample +int +open_pty_pair (int *amaster, int *aslave) +@{ + int master, slave; + char *name + + master = getpt (); + if (master < 0) + return 0; + + if (grantpt (master) < 0 || unlockpt (master) < 0) + goto close_master; + name = ptsname (master); + if (name == NULL) + goto close_master; + + slave open (name, O_RDWR); + if (slave == -1) + goto close_master; + + if (isastream (slave)) + @{ + if (ioctl (slave, I_PUSH, "ptem") < 0 + || ioctl (slave, I_PUSH, "ldterm") < 0) + goto close_slave; + @} + + *amaster = master; + *aslave = slave; + return 1; + +close_slave: + close (slave); + +close_master: + close (master); + return 0; +@} +@end smallexample + +@node Pseudo-Terminal Pairs +@subsection Opening a Pseudo-Terminal Pair +@cindex opening a pseudo-terminal pair + +These functions, derived from BSD, are available in the separate +@file{libutil} library, and declared in @file{pty.h}. + +@comment pty.h +@comment BSD +@deftypefun int openpty (int *@var{amaster}, int *@var{aslave}, char *@var{name}, struct termios *@var{termp}, struct winsize *@var{winp}) +This function allocates and opens a pseudo-terminal pair, returning the +file descriptor for the master in @var{*amaster}, and the file +descriptor for the slave in @var{*aslave}. If the argument @var{name} +is not a null pointer, the name file name of the slave pseudo-terminal +device is stored in @code{*name}. If @var{termp} is not a null pointer, +the terminal attributes of the slave are set to the ones specified in +the structure that @var{termp} points to (@pxref{Terminal Modes}). +Likewise, if the @var{winp} is not a null pointer, the screen size of +the slave is set to the values specified in the structure that +@var{winp} points to. + +The normal return value from @code{openpty} is @math{0}; a value of +@math{-1} is returned in case of failure. + +@strong{Warning:} Using the @code{openpty} with @var{name} not set to +@code{NULL} is @strong{very dangerous} because it provides no protection +against overflowing the string @var{name}. You should use the +@code{ttyname} function on the file descriptor returned in @var{*slave} +to find out the file name of the slave pseudo-terminal device instead. +@end deftypefun + +@comment pty.h +@comment BSD +@deftypefun int forkpty (int *@var{amaster}, char *@var{name}, struct termios *@var{termp}, struct winsize *@var{winp}) +This function is similar to the @code{openpty} function, but in +addition, forks creates a new process (@pxref{Creating a Process}) and +makes the newly opened slave pseudo-terminal device the controlling +terminal (@pxref{Controlling Terminal}) for the child process. + +If the operation is successful, there are then both parent and child +processes and both see @code{forkpty} return, but with different values: +it returns a value of @math{0} in the child process and returns the child's +process ID in the parent process. + +If the allocation of a pseudo-terminal pair or the process creation +failed, @code{forkpty} returns a value of @math{-1} in the parent +process. + +@strong{Warning:} The @code{forkpty} function has the same problems with +respect to the @var{name} argument as @code{openpty}. +@end deftypefun diff --git a/nis/nis_add.c b/nis/nis_add.c index 07fa0fb..10b46af 100644 --- a/nis/nis_add.c +++ b/nis/nis_add.c @@ -29,8 +29,9 @@ nis_add (const_nis_name name, const nis_object *obj2) nis_result *res; nis_error status; struct ns_request req; - char buf1 [strlen (name) + 20]; - char buf4 [strlen (name) + 20]; + size_t namelen = strlen (name); + char buf1 [namelen + 20]; + char buf4 [namelen + 20]; res = calloc (1, sizeof (nis_result)); if (res == NULL) @@ -40,13 +41,13 @@ nis_add (const_nis_name name, const nis_object *obj2) memcpy (&obj, obj2, sizeof (nis_object)); - if (obj.zo_name == NULL || strlen (obj.zo_name) == 0) + if (obj.zo_name == NULL || obj.zo_name[0] == '\0') obj.zo_name = nis_leaf_of_r (name, buf1, sizeof (buf1)); - if (obj.zo_owner == NULL || strlen (obj.zo_owner) == 0) + if (obj.zo_owner == NULL || obj.zo_owner[0] == '\0') obj.zo_owner = nis_local_principal (); - if (obj.zo_group == NULL || strlen (obj.zo_group) == 0) + if (obj.zo_group == NULL || obj.zo_group[0] == '\0') obj.zo_group = nis_local_group (); obj.zo_domain = nis_domain_of_r (name, buf4, sizeof (buf4)); @@ -59,11 +60,11 @@ nis_add (const_nis_name name, const nis_object *obj2) } req.ns_object.ns_object_len = 1; - if ((status = __do_niscall (req.ns_object.ns_object_val[0].zo_domain, - NIS_ADD, (xdrproc_t) _xdr_ns_request, - (caddr_t) &req, (xdrproc_t) _xdr_nis_result, - (caddr_t) res, MASTER_ONLY, - NULL)) != RPC_SUCCESS) + status = __do_niscall (req.ns_object.ns_object_val[0].zo_domain, + NIS_ADD, (xdrproc_t) _xdr_ns_request, + (caddr_t) &req, (xdrproc_t) _xdr_nis_result, + (caddr_t) res, MASTER_ONLY, NULL); + if (status != RPC_SUCCESS) NIS_RES_STATUS (res) = status; nis_destroy_object (req.ns_object.ns_object_val); diff --git a/nis/nis_addmember.c b/nis/nis_addmember.c index 6d55bd0..2a31903 100644 --- a/nis/nis_addmember.c +++ b/nis/nis_addmember.c @@ -1,4 +1,4 @@ -/* Copyright (c) 1997 Free Software Foundation, Inc. +/* Copyright (c) 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997. @@ -23,11 +23,12 @@ nis_error nis_addmember (const_nis_name member, const_nis_name group) { - if (group != NULL && strlen (group) > 0) + if (group != NULL && group[0] != '\0') { - char buf[strlen (group) + 14 + NIS_MAXNAMELEN]; - char leafbuf[strlen (group) + 2]; - char domainbuf[strlen (group) + 2]; + size_t grouplen = strlen (group); + char buf[grouplen + 14 + NIS_MAXNAMELEN]; + char leafbuf[grouplen + 2]; + char domainbuf[grouplen + 2]; nis_result *res, *res2; nis_error status; char *cp, *cp2; @@ -35,7 +36,7 @@ nis_addmember (const_nis_name member, const_nis_name group) cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1)); cp = stpcpy (cp, ".groups_dir"); cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1); - if (cp2 != NULL && strlen (cp2) > 0) + if (cp2 != NULL && cp2[0] != '\0') { *cp++ = '.'; stpcpy (cp, cp2); diff --git a/nis/nis_call.c b/nis/nis_call.c index ff9e768..a2bbdb5 100644 --- a/nis/nis_call.c +++ b/nis/nis_call.c @@ -484,9 +484,10 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, u_long flags, case LOWER_NAME: { directory_obj *obj; - char leaf [strlen (name) + 3]; - char domain [strlen (name) + 3]; - char ndomain [strlen (name) + 3]; + size_t namelen = strlen (name); + char leaf [namelen + 3]; + char domain [namelen + 3]; + char ndomain [namelen + 3]; char *cp; u_int run = 0; @@ -494,7 +495,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, u_long flags, do { - if (strlen (domain) == 0) + if (domain[0] == '\0') { nis_free_directory (dir); return NULL; diff --git a/nis/nis_callback.c b/nis/nis_callback.c index 4c5693a..5c8828d 100644 --- a/nis/nis_callback.c +++ b/nis/nis_callback.c @@ -313,7 +313,7 @@ __nis_create_callback (int (*callback) (const_nis_name, const nis_object *, #else cb->serv->pkey.n_len =0; cb->serv->pkey.n_bytes = NULL; - cb->serv->key_type = NIS_PK_DH; + cb->serv->key_type = NIS_PK_NONE; #endif } diff --git a/nis/nis_creategroup.c b/nis/nis_creategroup.c index 8333e09..cd882ca 100644 --- a/nis/nis_creategroup.c +++ b/nis/nis_creategroup.c @@ -23,11 +23,12 @@ nis_error nis_creategroup (const_nis_name group, u_long flags) { - if (group != NULL && strlen (group) > 0) + if (group != NULL && group[0] != '\0') { - char buf[strlen (group) + 50]; - char leafbuf[strlen (group) + 2]; - char domainbuf[strlen (group) + 2]; + size_t grouplen = strlen (group); + char buf[grouplen + 50]; + char leafbuf[grouplen + 2]; + char domainbuf[grouplen + 2]; nis_error status; nis_result *res; char *cp, *cp2; @@ -36,7 +37,7 @@ nis_creategroup (const_nis_name group, u_long flags) cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1)); cp = stpcpy (cp, ".groups_dir"); cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1); - if (cp2 != NULL && strlen (cp2) > 0) + if (cp2 != NULL && cp2[0] != '\0') { *cp++ = '.'; stpcpy (cp, cp2); diff --git a/nis/nis_destroygroup.c b/nis/nis_destroygroup.c index 5b70a67..ad56513 100644 --- a/nis/nis_destroygroup.c +++ b/nis/nis_destroygroup.c @@ -1,4 +1,4 @@ -/* Copyright (c) 1997 Free Software Foundation, Inc. +/* Copyright (c) 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997. @@ -23,11 +23,12 @@ nis_error nis_destroygroup (const_nis_name group) { - if (group != NULL && strlen (group) > 0) + if (group != NULL && group[0] != '\0') { - char buf[strlen (group) + 50]; - char leafbuf[strlen (group) + 3]; - char domainbuf[strlen (group) + 3]; + size_t grouplen = strlen (group); + char buf[grouplen + 50]; + char leafbuf[grouplen + 3]; + char domainbuf[grouplen + 3]; nis_error status; nis_result *res; char *cp, *cp2; @@ -35,7 +36,7 @@ nis_destroygroup (const_nis_name group) cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1)); cp = stpcpy (cp, ".groups_dir"); cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1); - if (cp2 != NULL && strlen (cp2) > 0) + if (cp2 != NULL && cp2[0] != '\0') { *cp++ = '.'; stpcpy (cp, cp2); diff --git a/nis/nis_file.c b/nis/nis_file.c index 4634e67..94fa4eb 100644 --- a/nis/nis_file.c +++ b/nis/nis_file.c @@ -30,6 +30,7 @@ readColdStartFile (void) { XDR xdrs; FILE *in; + bool_t status; directory_obj obj; in = fopen (cold_start_file, "rb"); @@ -37,10 +38,11 @@ readColdStartFile (void) return NULL; memset (&obj, '\0', sizeof (obj)); xdrstdio_create (&xdrs, in, XDR_DECODE); - if (!_xdr_directory_obj (&xdrs, &obj)) - return NULL; + status = _xdr_directory_obj (&xdrs, &obj); + xdr_destroy (&xdrs); + fclose (in); - return nis_clone_directory (&obj, NULL); + return status ? nis_clone_directory (&obj, NULL) : NULL; } bool_t @@ -48,16 +50,18 @@ writeColdStartFile (const directory_obj *obj) { XDR xdrs; FILE *out; + bool_t status; out = fopen (cold_start_file, "wb"); if (out == NULL) return FALSE; xdrstdio_create (&xdrs, out, XDR_ENCODE); - if (!_xdr_directory_obj (&xdrs, (directory_obj *) obj)) - return FALSE; + status = _xdr_directory_obj (&xdrs, (directory_obj *) obj); + xdr_destroy (&xdrs); + fclose (out); - return TRUE; + return status; } nis_object * @@ -65,6 +69,7 @@ nis_read_obj (const char *name) { XDR xdrs; FILE *in; + bool_t status; nis_object obj; in = fopen (name, "rb"); @@ -73,10 +78,11 @@ nis_read_obj (const char *name) memset (&obj, '\0', sizeof (obj)); xdrstdio_create (&xdrs, in, XDR_DECODE); - if (!_xdr_nis_object (&xdrs, &obj)) - return NULL; + status =_xdr_nis_object (&xdrs, &obj); + xdr_destroy (&xdrs); + fclose (in); - return nis_clone_object (&obj, NULL); + return status ? nis_clone_object (&obj, NULL) : NULL; } bool_t @@ -84,14 +90,16 @@ nis_write_obj (const char *name, const nis_object *obj) { XDR xdrs; FILE *out; + bool_t status; out = fopen (name, "wb"); if (out == NULL) return FALSE; xdrstdio_create (&xdrs, out, XDR_ENCODE); - if (!_xdr_nis_object (&xdrs, (nis_object *) obj)) - return FALSE; + status = _xdr_nis_object (&xdrs, (nis_object *) obj); + xdr_destroy (&xdrs); + fclose (out); - return TRUE; + return status; } diff --git a/nis/nis_findserv.c b/nis/nis_findserv.c index 0e9f017..832b6a5 100644 --- a/nis/nis_findserv.c +++ b/nis/nis_findserv.c @@ -138,7 +138,7 @@ __nis_findfastest (dir_binding * bind) if (strcmp (bind->server_val[i].ep.ep_val[j].family, "inet") == 0) if ((bind->server_val[i].ep.ep_val[j].proto == NULL) || (strcmp (bind->server_val[i].ep.ep_val[j].proto, "-") == 0) || - (strlen (bind->server_val[i].ep.ep_val[j].proto) == 0)) + (bind->server_val[i].ep.ep_val[j].proto[0] == '\0')) { sin.sin_addr.s_addr = inetstr2int (bind->server_val[i].ep.ep_val[j].uaddr); diff --git a/nis/nis_ismember.c b/nis/nis_ismember.c index aadd197..4a33f02 100644 --- a/nis/nis_ismember.c +++ b/nis/nis_ismember.c @@ -1,4 +1,4 @@ -/* Copyright (c) 1997 Free Software Foundation, Inc. +/* Copyright (c) 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997. @@ -27,9 +27,10 @@ static int internal_ismember (const_nis_name principal, const_nis_name group) { - char buf[strlen (group) + 50]; - char leafbuf[strlen (group) + 2]; - char domainbuf[strlen (group) + 2]; + size_t grouplen = strlen (group); + char buf[grouplen + 50]; + char leafbuf[grouplen + 2]; + char domainbuf[grouplen + 2]; nis_result *res; char *cp, *cp2; u_int i; @@ -37,7 +38,7 @@ internal_ismember (const_nis_name principal, const_nis_name group) cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1)); cp = stpcpy (cp, ".groups_dir"); cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1); - if (cp2 != NULL && strlen (cp2) > 0) + if (cp2 != NULL && cp2[0] != '\0') { *cp++ = '.'; strcpy (cp, cp2); @@ -117,7 +118,7 @@ internal_ismember (const_nis_name principal, const_nis_name group) bool_t nis_ismember (const_nis_name principal, const_nis_name group) { - if (group != NULL && strlen (group) > 0 && principal != NULL) + if (group != NULL && group[0] != '\0' && principal != NULL) return internal_ismember (principal, group) == 1 ? TRUE : FALSE; else return FALSE; diff --git a/nis/nis_print.c b/nis/nis_print.c index 0e36017..b578cbf 100644 --- a/nis/nis_print.c +++ b/nis/nis_print.c @@ -202,15 +202,15 @@ nis_print_directory (const directory_obj *dir) for (j = 0; j < sptr->ep.ep_len; j++) { printf ("\t[%d] - ", j + 1); - if (ptr->proto != NULL && strlen (ptr->proto) > 0) + if (ptr->proto != NULL && ptr->proto[0] != '\0') printf ("%s, ", ptr->proto); else printf ("-, "); - if (ptr->family != NULL && strlen (ptr->family) > 0) + if (ptr->family != NULL && ptr->family[0] != '\0') printf ("%s, ", ptr->family); else printf ("-, "); - if (ptr->uaddr != NULL && strlen (ptr->uaddr) > 0) + if (ptr->uaddr != NULL && ptr->uaddr[0] != '\0') printf ("%s\n", ptr->uaddr); else fputs ("-\n", stdout); diff --git a/nis/nis_print_group_entry.c b/nis/nis_print_group_entry.c index fbc9ad1..d5cdda0 100644 --- a/nis/nis_print_group_entry.c +++ b/nis/nis_print_group_entry.c @@ -1,4 +1,4 @@ -/* Copyright (c) 1997 Free Software Foundation, Inc. +/* Copyright (c) 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997. @@ -23,11 +23,12 @@ void nis_print_group_entry (const_nis_name group) { - if (group != NULL && strlen (group) > 0) + if (group != NULL && group[0] != '\0') { - char buf[strlen (group) + 50]; - char leafbuf[strlen (group) + 3]; - char domainbuf[strlen (group) + 3]; + size_t grouplen = strlen (group); + char buf[grouplen + 50]; + char leafbuf[grouplen + 3]; + char domainbuf[grouplen + 3]; unsigned long mem_exp_cnt = 0, mem_imp_cnt = 0, mem_rec_cnt = 0; unsigned long nomem_exp_cnt = 0, nomem_imp_cnt = 0, nomem_rec_cnt = 0; char **mem_exp, **mem_imp, **mem_rec; @@ -39,7 +40,7 @@ nis_print_group_entry (const_nis_name group) cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1)); cp = stpcpy (cp, ".groups_dir"); cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1); - if (cp2 != NULL && strlen (cp2) > 0) + if (cp2 != NULL && cp2[0] != '\0') { *cp++ = '.'; stpcpy (cp, cp2); diff --git a/nis/nis_removemember.c b/nis/nis_removemember.c index 28050a1..4fa8893 100644 --- a/nis/nis_removemember.c +++ b/nis/nis_removemember.c @@ -23,11 +23,12 @@ nis_error nis_removemember (const_nis_name member, const_nis_name group) { - if (group != NULL && strlen (group) > 0) + if (group != NULL && group[0] != '\0') { - char buf[strlen (group) + 14 + NIS_MAXNAMELEN]; - char leafbuf[strlen (group) + 2]; - char domainbuf[strlen (group) + 2]; + size_t grouplen = strlen (group); + char buf[grouplen + 14 + NIS_MAXNAMELEN]; + char leafbuf[grouplen + 2]; + char domainbuf[grouplen + 2]; nis_name *newmem; nis_result *res, *res2; nis_error status; @@ -37,7 +38,7 @@ nis_removemember (const_nis_name member, const_nis_name group) cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1)); cp = stpcpy (cp, ".groups_dir"); cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1); - if (cp2 != NULL && strlen (cp2) > 0) + if (cp2 != NULL && cp2[0] != '\0') { cp = stpcpy (cp, "."); stpcpy (cp, cp2); diff --git a/nis/nis_verifygroup.c b/nis/nis_verifygroup.c index 6d3ec7b..e04a838 100644 --- a/nis/nis_verifygroup.c +++ b/nis/nis_verifygroup.c @@ -23,11 +23,12 @@ nis_error nis_verifygroup (const_nis_name group) { - if (group != NULL && strlen (group) > 0) + if (group != NULL && group[0] != '\0') { - char buf[strlen (group) + 50]; - char leafbuf[strlen (group) + 2]; - char domainbuf[strlen (group) + 2]; + size_t grouplen = strlen (group); + char buf[grouplen + 50]; + char leafbuf[grouplen + 2]; + char domainbuf[grouplen + 2]; nis_result *res; nis_error status; char *cp, *cp2; @@ -35,7 +36,7 @@ nis_verifygroup (const_nis_name group) cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1)); cp = stpcpy (cp, ".groups_dir"); cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1); - if (cp2 != NULL && strlen (cp2) > 0) + if (cp2 != NULL && cp2[0] != '\0') { *cp++ = '.'; stpcpy (cp, cp2); diff --git a/nis/ypclnt.c b/nis/ypclnt.c index e8c016d..198c477 100644 --- a/nis/ypclnt.c +++ b/nis/ypclnt.c @@ -64,7 +64,7 @@ __yp_bind (const char *domain, dom_binding **ypdb) int is_new = 0; int try; - if ((domain == NULL) || (strlen (domain) == 0)) + if ((domain == NULL) || (domain[0] == '\0')) return YPERR_BADARGS; if (ypdb != NULL) diff --git a/nscd/connections.c b/nscd/connections.c index 36e89fa..63deac5 100644 --- a/nscd/connections.c +++ b/nscd/connections.c @@ -27,6 +27,7 @@ #include <stdio.h> #include <stdlib.h> #include <unistd.h> +#include <sys/poll.h> #include <sys/socket.h> #include <sys/stat.h> #include <sys/types.h> @@ -37,10 +38,11 @@ #include "dbg_log.h" /* Socket 0 in the array is named and exported into the file namespace - as a connection point for clients. */ + as a connection point for clients. There's a one to one + correspondence between sock[i] and read_polls[i]. */ static int sock[MAX_NUM_CONNECTIONS]; static int socks_active; -static fd_set read_set; +static struct pollfd read_polls[MAX_NUM_CONNECTIONS]; static pthread_mutex_t sock_lock = PTHREAD_MUTEX_INITIALIZER; @@ -63,6 +65,7 @@ close_sockets (void) dbg_log (_("socket [%d|%d] close: %s"), strerror (errno)); sock[i] = 0; + read_polls[i].fd = -1; --socks_active; } @@ -79,12 +82,13 @@ close_socket (int conn) close (sock[conn]); sock[conn] = 0; + read_polls[conn].fd = -1; --socks_active; pthread_mutex_unlock (&sock_lock); } -/* Local rountine, assigns a socket to a new connection request. */ +/* Local routine, assigns a socket to a new connection request. */ static void handle_new_connection (void) { @@ -107,7 +111,8 @@ handle_new_connection (void) return; } ++socks_active; - FD_SET (sock[i], &read_set); + read_polls[i].fd = sock[i]; + read_polls[i].events = POLLRDNORM; if (debug_flag > 2) dbg_log (_("handle_new_connection used socket %d|%d"), i, sock[i]); @@ -127,10 +132,9 @@ handle_new_connection (void) pthread_mutex_unlock (&sock_lock); } -/* Local routine, reads a request off a socket indicated by a selectset. */ +/* Local routine, reads a request off a socket indicated by read_polls. */ static int -handle_new_request (fd_set read_selects, int **connp, request_header **reqp, - char **key) +handle_new_request (int **connp, request_header **reqp, char **key) { ssize_t nbytes; int i; @@ -140,7 +144,7 @@ handle_new_request (fd_set read_selects, int **connp, request_header **reqp, /* Find the descriptor. */ for (i = 1; i < MAX_NUM_CONNECTIONS; ++i) - if (FD_ISSET(sock[i], &read_selects)) + if (read_polls[i].revents & (POLLRDNORM|POLLERR)) break; if (debug_flag > 2) @@ -158,7 +162,7 @@ handle_new_request (fd_set read_selects, int **connp, request_header **reqp, dbg_log (_("Real close socket %d|%d"), i, sock[i]); pthread_mutex_lock (&sock_lock); - FD_CLR (sock[i], &read_set); + read_polls[i].fd = -1; close (sock[i]); sock[i] = 0; --socks_active; @@ -191,7 +195,7 @@ handle_new_request (fd_set read_selects, int **connp, request_header **reqp, dbg_log (_("Real close socket %d|%d"), i, sock[i]); pthread_mutex_lock (&sock_lock); - FD_CLR (sock[i], &read_set); + read_polls[i].fd = -1; close (sock[i]); sock[i] = 0; --socks_active; @@ -223,8 +227,8 @@ handle_new_request (fd_set read_selects, int **connp, request_header **reqp, void get_request (int *conn, request_header *req, char **key) { - int i, nr, done = 0; - fd_set read_selects; + int done = 0; + int nr; if (debug_flag) dbg_log ("get_request"); @@ -233,35 +237,21 @@ get_request (int *conn, request_header *req, char **key) is read in on an existing connection. */ while (!done) { - /* Set up the socket descriptor mask for the select. - copy read_set into the local copy. */ - - FD_ZERO (&read_selects); - pthread_mutex_lock (&sock_lock); - for (i = 0; i < MAX_NUM_CONNECTIONS; ++i) - { - if (FD_ISSET (sock[i], &read_set)) - FD_SET (sock[i], &read_selects); - } - pthread_mutex_unlock (&sock_lock); - /* Poll active connections using select(). */ - nr = select (FD_SETSIZE, &read_selects, NULL, NULL, NULL); + /* Poll active connections. */ + nr = poll (read_polls, MAX_NUM_CONNECTIONS, -1); if (nr <= 0) { - perror (_("Select new reads")); + perror (_("Poll new reads")); exit (1); } - if (FD_ISSET (sock[0], &read_selects)) + if (read_polls[0].revents & (POLLRDNORM|POLLERR)) /* Handle the case of a new connection request on the named socket. */ handle_new_connection (); else { /* Read data from client specific descriptor. */ - if (handle_new_request (read_selects, &conn, &req, key) == 0) - { - FD_CLR (sock[*conn], &read_set); - done = 1; - } + if (handle_new_request (&conn, &req, key) == 0) + done = 1; } } /* While not_done. */ } @@ -270,10 +260,14 @@ void init_sockets (void) { struct sockaddr_un sock_addr; + int i; /* Initialize the connections db. */ socks_active = 0; - FD_ZERO (&read_set); + + /* Initialize the poll array. */ + for (i = 0; i < MAX_NUM_CONNECTIONS; i++) + read_polls[i].fd = -1; /* Create the socket. */ sock[0] = socket (AF_UNIX, SOCK_STREAM, 0); @@ -301,7 +295,8 @@ init_sockets (void) } /* Add the socket to the server's set of active sockets. */ - FD_SET (sock[0], &read_set); + read_polls[0].fd = sock[0]; + read_polls[0].events = POLLRDNORM; ++socks_active; } diff --git a/sysdeps/generic/Dist b/sysdeps/generic/Dist index 5d40754..36133eb 100644 --- a/sysdeps/generic/Dist +++ b/sysdeps/generic/Dist @@ -1,6 +1,6 @@ make_siglist.c signame.c signame.h det_endian.c entry.h -errno-loc.c. +errno-loc.c getresgid.c getresuid.c diff --git a/sysdeps/generic/enbl-secure.c b/sysdeps/generic/enbl-secure.c index 3f3fe23..7dcd439 100644 --- a/sysdeps/generic/enbl-secure.c +++ b/sysdeps/generic/enbl-secure.c @@ -1,5 +1,5 @@ /* Define and initialize the `__libc_enable_secure' flag. Generic version. - 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. The GNU C Library is free software; you can redistribute it and/or @@ -26,13 +26,9 @@ /* Safest assumption, if somehow the initializer isn't run. */ int __libc_enable_secure = 1; -/* We often need the UID. */ -extern uid_t __libc_uid; - void __libc_init_secure (void) { - __libc_uid = __getuid (); - __libc_enable_secure = (__geteuid () != __libc_uid + __libc_enable_secure = (__geteuid () != __getuid () || __getegid () != __getgid ()); } diff --git a/sysdeps/generic/ftruncate.c b/sysdeps/generic/ftruncate.c index 8e067ac..ece306f 100644 --- a/sysdeps/generic/ftruncate.c +++ b/sysdeps/generic/ftruncate.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 @@ -16,13 +16,13 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include <sys/types.h> #include <errno.h> +#include <sys/types.h> #include <unistd.h> /* Truncate the file FD refers to to LENGTH bytes. */ int -ftruncate (fd, length) +__ftruncate (fd, length) int fd; off_t length; { @@ -30,5 +30,7 @@ ftruncate (fd, length) return -1; } +weak_alias (__ftruncate, ftruncate) + stub_warning (ftruncate) #include <stub-tag.h> diff --git a/sysdeps/generic/glob.c b/sysdeps/generic/glob.c index 29697f4..c26b2a6 100644 --- a/sysdeps/generic/glob.c +++ b/sysdeps/generic/glob.c @@ -253,14 +253,16 @@ extern char *alloca (); /* Some system header files erroneously define these. We want our own definitions from <glob.h> to take precedence. */ -#undef GLOB_ERR -#undef GLOB_MARK -#undef GLOB_NOSORT -#undef GLOB_DOOFFS -#undef GLOB_NOCHECK -#undef GLOB_APPEND -#undef GLOB_NOESCAPE -#undef GLOB_PERIOD +#ifndef __GNU_LIBRARY__ +# undef GLOB_ERR +# undef GLOB_MARK +# undef GLOB_NOSORT +# undef GLOB_DOOFFS +# undef GLOB_NOCHECK +# undef GLOB_APPEND +# undef GLOB_NOESCAPE +# undef GLOB_PERIOD +#endif #include <glob.h> static diff --git a/sysdeps/mach/hurd/ftruncate.c b/sysdeps/mach/hurd/ftruncate.c index 67f428e..2e384f2 100644 --- a/sysdeps/mach/hurd/ftruncate.c +++ b/sysdeps/mach/hurd/ftruncate.c @@ -16,15 +16,15 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include <sys/types.h> #include <errno.h> +#include <sys/types.h> #include <unistd.h> #include <hurd.h> #include <hurd/fd.h> /* Truncate the file FD refers to to LENGTH bytes. */ int -ftruncate (fd, length) +__ftruncate (fd, length) int fd; __off_t length; { diff --git a/sysdeps/mach/hurd/truncate.c b/sysdeps/mach/hurd/truncate.c index ae1f7b8..438015e 100644 --- a/sysdeps/mach/hurd/truncate.c +++ b/sysdeps/mach/hurd/truncate.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 93, 94, 95, 97 Free Software Foundation, Inc. +/* Copyright (C) 1991, 92, 93, 94, 95, 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,15 +16,16 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include <sys/types.h> #include <errno.h> -#include <hurd.h> #include <fcntl.h> +#include <sys/types.h> +#include <unistd.h> +#include <hurd.h> /* Truncate FILE_NAME to LENGTH bytes. */ int truncate (file_name, length) - char *file_name; + const char *file_name; off_t length; { error_t err; diff --git a/sysdeps/unix/sysv/linux/aio_sigqueue.c b/sysdeps/unix/sysv/linux/aio_sigqueue.c index b962396..1520ee1 100644 --- a/sysdeps/unix/sysv/linux/aio_sigqueue.c +++ b/sysdeps/unix/sysv/linux/aio_sigqueue.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. +/* Copyright (C) 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 @@ -24,9 +24,8 @@ extern int __syscall_rt_sigqueueinfo (int, int, siginfo_t *); -/* These variables are used quite often in the libc code. */ +/* This variable is used quite often in the libc code. */ extern pid_t __libc_pid; -extern uid_t __libc_uid; /* Return any pending signal or wait for one for the given time. */ @@ -46,7 +45,7 @@ __aio_sigqueue (sig, val) __libc_pid = __getpid (); info.si_pid = __libc_pid; - info.si_uid = __libc_uid; + info.si_uid = getuid (); info.si_value = val; diff --git a/sysdeps/unix/sysv/linux/init-first.c b/sysdeps/unix/sysv/linux/init-first.c index acaf509..c6bf6fb 100644 --- a/sysdeps/unix/sysv/linux/init-first.c +++ b/sysdeps/unix/sysv/linux/init-first.c @@ -45,7 +45,6 @@ char **__libc_argv; /* We often need the UID and PID. Cache these values. */ pid_t __libc_pid = 0xf00baa; -uid_t __libc_uid = 0xf00baa; static void diff --git a/sysdeps/unix/sysv/linux/sigqueue.c b/sysdeps/unix/sysv/linux/sigqueue.c index 92026ef..4952386 100644 --- a/sysdeps/unix/sysv/linux/sigqueue.c +++ b/sysdeps/unix/sysv/linux/sigqueue.c @@ -23,7 +23,6 @@ extern int __syscall_rt_sigqueueinfo (int, int, siginfo_t *); /* These variables are used quite often in the libc code. */ extern pid_t __libc_pid; -extern uid_t __libc_uid; /* Return any pending signal or wait for one for the given time. */ @@ -40,14 +39,11 @@ __sigqueue (pid, sig, val) info.si_errno = 0; info.si_code = SI_QUEUE; - if (__libc_pid ==0xf00baa) + if (__libc_pid == 0xf00baa) __libc_pid = __getpid (); info.si_pid = __libc_pid; - if (__libc_uid ==0xf00baa) - __libc_pid = __getuid (); - info.si_uid = __libc_uid; - + info.si_uid = __getuid (); info.si_value = val; return __syscall_rt_sigqueueinfo (pid, sig, &info); |