Mon Mar 27 02:23:15 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>

* posix/unistd.h [__USE_BSD] (ttyslot): Declare it.

	* posix/unistd.h [__USE_BSD] (L_SET, L_INCR, L_XTND): Define
 	unless L_SET already defined.
	* misc/sys/file.h (L_SET, L_INCR, L_XTND): Don't define if L_SET
 	already defined.

	Incorporated -lutil library from 4.4-Lite.
	* misc/Makefile (extra-libs, libutil-routines): New variables.
	* misc/login.c, misc/login_tty.c, misc/logout.c, misc/logwtmp.c,
	sysdeps/generic/pty.c: New files for -lutil incorporated from 4.4-Lite.

	Support simple, light-weight unwind-protect mechanism for longjmp.
	* setjmp/longjmp.c: Call _longjmp_unwind first thing.
	* sysdeps/mach/hurd/jmp-unwind.c: New file.
	* sysdeps/stub/jmp-unwind.c: New file.
	* sysdeps/i386/jmp_buf.h (_JMPBUF_UNWINDS): New macro.
	* sysdeps/mips/jmp_buf.h (_JMPBUF_UNWINDS): New macro.
	* setjmp/Makefile (routines): Add jmp-unwind.
	* hurd/hurd/userlink.h (struct hurd_userlink): Move `next' and
 	`prevp' members into new substructure `resource'; add another such
 	substructure `thread' and members `cleanup' (function ptr) and
 	`cleanup_data' (generic ptr).
	(_hurd_userlink_link, _hurd_userlink_unlink): Insert/remove LINK
	into the `_hurd_self_sigstate ()->active_resources' list via the
	`thread' substructure.
	* hurd/hurd/port.h (_hurd_port_cleanup): Declare it.
	(_hurd_port_locked_get): Set LINK->cleanup to _hurd_port_cleanup and
	LINK->cleanup_data' to the port extracted.
	* hurd/hurd/signal.h (struct hurd_sigstate): New member
	`active_resources'.
	* hurd/port-cleanup.c: New file.
	* hurd/Makefile (routines): Add port-cleanup.

	* malloc/malloc.c: Include errno.h.

Sat Mar 25 18:24:21 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* locale/loadlocale.c (_nl_load_locale): Avoid */ inside comment.
This commit is contained in:
Roland McGrath 1995-03-27 10:00:09 +00:00
parent d365fd2cfa
commit 1474b80f01
22 changed files with 681 additions and 39 deletions

View File

@ -1,3 +1,45 @@
Mon Mar 27 02:23:15 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* posix/unistd.h [__USE_BSD] (ttyslot): Declare it.
* posix/unistd.h [__USE_BSD] (L_SET, L_INCR, L_XTND): Define
unless L_SET already defined.
* misc/sys/file.h (L_SET, L_INCR, L_XTND): Don't define if L_SET
already defined.
Incorporated -lutil library from 4.4-Lite.
* misc/Makefile (extra-libs, libutil-routines): New variables.
* misc/login.c, misc/login_tty.c, misc/logout.c, misc/logwtmp.c,
sysdeps/generic/pty.c: New files for -lutil incorporated from 4.4-Lite.
Support simple, light-weight unwind-protect mechanism for longjmp.
* setjmp/longjmp.c: Call _longjmp_unwind first thing.
* sysdeps/mach/hurd/jmp-unwind.c: New file.
* sysdeps/stub/jmp-unwind.c: New file.
* sysdeps/i386/jmp_buf.h (_JMPBUF_UNWINDS): New macro.
* sysdeps/mips/jmp_buf.h (_JMPBUF_UNWINDS): New macro.
* setjmp/Makefile (routines): Add jmp-unwind.
* hurd/hurd/userlink.h (struct hurd_userlink): Move `next' and
`prevp' members into new substructure `resource'; add another such
substructure `thread' and members `cleanup' (function ptr) and
`cleanup_data' (generic ptr).
(_hurd_userlink_link, _hurd_userlink_unlink): Insert/remove LINK
into the `_hurd_self_sigstate ()->active_resources' list via the
`thread' substructure.
* hurd/hurd/port.h (_hurd_port_cleanup): Declare it.
(_hurd_port_locked_get): Set LINK->cleanup to _hurd_port_cleanup and
LINK->cleanup_data' to the port extracted.
* hurd/hurd/signal.h (struct hurd_sigstate): New member
`active_resources'.
* hurd/port-cleanup.c: New file.
* hurd/Makefile (routines): Add port-cleanup.
* malloc/malloc.c: Include errno.h.
Sat Mar 25 18:24:21 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* locale/loadlocale.c (_nl_load_locale): Avoid */ inside comment.
Fri Mar 24 02:35:37 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* misc/Makefile (headers): Add utmp.h.

View File

@ -49,7 +49,7 @@ routines = hurdinit hurdid hurdlookup hurdpid hurdrlimit hurdprio hurdexec \
fopenport \
vpprintf \
ports-get ports-set hurdports hurdmsg \
$(sig) $(dtable) hurdinline
$(sig) $(dtable) hurdinline port-cleanup
sig = hurdsig hurdfault faultexc siginfo hurd-raise preempt-sig \
trampoline longjmp-ts catch-exc exc2signal hurdkill
dtable = dtable port2fd new-fd alloc-fd intern-fd \

View File

@ -1,5 +1,5 @@
/* Lightweight user references for ports.
Copyright (C) 1993, 1994 Free Software Foundation, Inc.
Copyright (C) 1993, 1994, 1995 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
@ -70,6 +70,9 @@ _hurd_port_init (struct hurd_port *port, mach_port_t init)
}
/* Cleanup function for non-local exits. */
extern void _hurd_port_cleanup (void *, jmp_buf, int);
/* Get a reference to *PORT, which is locked.
Pass return value and LINK to _hurd_port_free when done. */
@ -80,7 +83,11 @@ _hurd_port_locked_get (struct hurd_port *port,
mach_port_t result;
result = port->port;
if (result != MACH_PORT_NULL)
_hurd_userlink_link (&port->users, link);
{
link->cleanup = &_hurd_port_cleanup;
link->cleanup_data = (void *) result;
_hurd_userlink_link (&port->users, link);
}
__spin_unlock (&port->lock);
return result;
}

View File

@ -79,6 +79,11 @@ struct hurd_sigstate
will be passed to sigreturn after running the handler for a pending
signal, instead of examining the thread state. */
struct sigcontext *context;
/* This is the head of the thread's list of active resources; see
<hurd/userlink.h> for details. This member is only used by the
thread itself, and always inside a critical section. */
struct hurd_userlink *active_resources;
};
/* Linked list of states of all threads whose state has been asked for. */

View File

@ -1,5 +1,5 @@
/* Support for chains recording users of a resource; `struct hurd_userlink'.
Copyright (C) 1994 Free Software Foundation, Inc.
Copyright (C) 1994, 1995 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
@ -25,19 +25,48 @@ Cambridge, MA 02139, USA. */
#define __need_NULL
#include <stddef.h>
#include <hurd/signal.h>
#include <setjmp.h>
/* This structure is simply a doubly-linked list. Users of a given
resource are recorded by their presence in a list associated with that
resource. A user attaches his own link (in local storage) to a shared
chain at the time he begins using some resource. When finished with
that resource, the user removes his link from the chain. If his link is
the last (there are no other users of the resource), and his chain has
been detached from the shared cell (the resource in the cell has been
replaced), then the user deallocates the resource that he used. */
/* This structure records a link in two doubly-linked lists.
We call these the per-resource user list and the per-thread
active-resource list.
Users of a given resource are recorded by their presence in a list
associated with that resource. A user attaches his own link (in local
storage on his stack) to a shared chain at the time he begins using some
resource. When finished with that resource, the user removes his link
from the chain. If his link is the last (there are no other users of
the resource), and his chain has been detached from the shared cell (the
resource in the cell has been replaced), then the user deallocates the
resource that he used.
All uses of shared resources by a single thread are linked together by
its `active-resource' list; the head of this list is stored in the
per-thread sigstate structure. When the thread makes a non-local exit
(i.e. longjmp), it will examine its active-resource list, and each link
residing in a stack frame being jumped out of will be unlinked from both
the resource's user list and the thread's active-resource list, and
deallocate the resource if that was the last user link for that resource.
NOTE: Access to a thread's active-resource list must always be done
inside a signal-proof critical section; the functions in this file
assume they are called inside a critical section, and do no locking of
their own. Also important: the longjmp cleanup relies on all userlink
structures residing on the stack of the using thread. */
struct hurd_userlink
{
struct hurd_userlink *next, **prevp;
struct
{
struct hurd_userlink *next, **prevp;
} resource, thread;
/* This function is called when a non-local exit
unwinds the frame containing this link. */
void (*cleanup) (void *cleanup_data, jmp_buf env, int val);
void *cleanup_data;
};
@ -52,32 +81,46 @@ _EXTERN_INLINE void
_hurd_userlink_link (struct hurd_userlink **chainp,
struct hurd_userlink *link)
{
link->next = *chainp;
if (link->next)
link->next->prevp = &link->next;
link->prevp = chainp;
struct hurd_userlink **thread_chainp;
link->resource.next = *chainp;
if (link->resource.next)
link->resource.next->thread.prevp = &link->resource.next;
link->resource.prevp = chainp;
*chainp = link;
/* Also chain it on the current thread's list of active resources. */
thread_chainp = &_hurd_self_sigstate ()->active_resources;
link->thread.next = *thread_chainp;
if (link->thread.next)
link->thread.next->thread.prevp = &link->thread.next;
link->thread.prevp = thread_chainp;
*thread_chainp = link;
}
/* Detach LINK from its chain. If the return value is nonzero, the caller
should deallocate the resource he started using after attaching LINK to
the chain it's on. If the return value is zero, then someone else is
still using the resource. */
/* Detach LINK from its chain. Returns nonzero iff this was the
last user of the resource and it should be deallocated. */
_EXTERN_INLINE int
_hurd_userlink_unlink (struct hurd_userlink *link)
{
/* The caller should deallocate the resource he used if his chain has
been detached from the cell (and thus has a nil `prevp'), and there is
no next link representing another user reference to the same resource. */
int dealloc = ! link->next && ! link->prevp;
/* We should deallocate the resource used if this chain has been detached
from the cell (and thus has a nil `prevp'), and there is no next link
representing another user reference to the same resource. */
int dealloc = ! link->resource.next && ! link->resource.prevp;
/* Remove our link from the chain of current users. */
if (link->prevp)
*link->prevp = link->next;
if (link->next)
link->next->prevp = link->prevp;
if (link->resource.prevp)
*link->resource.prevp = link->resource.next;
if (link->resource.next)
link->resource.next->resource.prevp = link->resource.prevp;
/* Remove our link from the chain of currently active resources
for this thread. */
*link->thread.prevp = link->thread.next;
if (link->thread.next)
link->thread.next->thread.prevp = link->thread.prevp;
return dealloc;
}
@ -97,7 +140,7 @@ _hurd_userlink_clear (struct hurd_userlink **chainp)
/* Detach the chain of current users from the cell. The last user to
remove his link from that chain will deallocate the old resource. */
(*chainp)->prevp = NULL;
(*chainp)->resource.prevp = NULL;
*chainp = NULL;
return 0;
}

31
hurd/port-cleanup.c Normal file
View File

@ -0,0 +1,31 @@
/* Cleanup function for `struct hurd_port' users who longjmp.
Copyright (C) 1995 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <mach.h>
#include <hurd/port.h>
/* The last user of the send right CLEANUP_DATA is now doing
`longjmp (ENV, VAL)', and this will unwind the frame of
that last user. Deallocate the right he will never get back to using. */
void
_hurd_port_cleanup (void *cleanup_data, jmp_buf env, int val)
{
__mach_port_deallocate (__mach_task_self (), (mach_port_t) cleanup_data);
}

View File

@ -83,7 +83,8 @@ _nl_load_locale (int category, char **name)
goto puntfd;
if (S_ISDIR (st.st_mode))
{
/* LOCALE/LC_* is a directory; open LOCALE/LC_*/SYS_LC_* instead. */
/* LOCALE/LC_foo is a directory; open LOCALE/LC_foo/SYS_LC_foo
instead. */
__close (fd);
memcpy (stpcpy (strchr (file, '\0'), "SYS_"), catname, catlen);
fd = __open (file, O_RDONLY);

View File

@ -56,13 +56,16 @@ extra-objs := bsd-compat.o
install-lib := libbsd-compat.a libg.a
non-lib.a := libbsd-compat.a
# Build the -lutil library with these extra functions.
extra-libs := libutil
libutil-routines:= login login_tty logout logwtmp pty
include ../Rules
$(objpfx)libbsd-compat.a: $(objpfx)bsd-compat.o
rm -f $@
ln $< $@
lib: $(objpfx)libbsd-compat.a
$(objpfx)libg.a: $(dep-dummy-lib); $(make-dummy-lib)
lib: $(objpfx)libg.a

63
misc/login.c Normal file
View File

@ -0,0 +1,63 @@
/*
* Copyright (c) 1988, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)login.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <utmp.h>
#include <stdio.h>
void
login(ut)
struct utmp *ut;
{
register int fd;
int tty;
tty = ttyslot();
if (tty > 0 && (fd = open(_PATH_UTMP, O_WRONLY|O_CREAT, 0644)) >= 0) {
(void)lseek(fd, (off_t)(tty * sizeof(struct utmp)), L_SET);
(void)write(fd, ut, sizeof(struct utmp));
(void)close(fd);
}
if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) >= 0) {
(void)write(fd, ut, sizeof(struct utmp));
(void)close(fd);
}
}

55
misc/login_tty.c Normal file
View File

@ -0,0 +1,55 @@
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)login_tty.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
#include <sys/ioctl.h>
#include <unistd.h>
int
login_tty(fd)
int fd;
{
(void) setsid();
if (ioctl(fd, TIOCSCTTY, (char *)NULL) == -1)
return (-1);
(void) dup2(fd, 0);
(void) dup2(fd, 1);
(void) dup2(fd, 2);
if (fd > 2)
(void) close(fd);
return (0);
}

72
misc/logout.c Normal file
View File

@ -0,0 +1,72 @@
/*
* Copyright (c) 1988, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)logout.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <sys/time.h>
#include <fcntl.h>
#include <utmp.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
typedef struct utmp UTMP;
int
logout(line)
register char *line;
{
register int fd;
UTMP ut;
int rval;
if ((fd = open(_PATH_UTMP, O_RDWR, 0)) < 0)
return(0);
rval = 0;
while (read(fd, &ut, sizeof(UTMP)) == sizeof(UTMP)) {
if (!ut.ut_name[0] || strncmp(ut.ut_line, line, UT_LINESIZE))
continue;
bzero(ut.ut_name, UT_NAMESIZE);
bzero(ut.ut_host, UT_HOSTSIZE);
(void)time(&ut.ut_time);
(void)lseek(fd, -(off_t)sizeof(UTMP), L_INCR);
(void)write(fd, &ut, sizeof(UTMP));
rval = 1;
}
(void)close(fd);
return(rval);
}

67
misc/logwtmp.c Normal file
View File

@ -0,0 +1,67 @@
/*
* Copyright (c) 1988, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)logwtmp.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <sys/file.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <unistd.h>
#include <utmp.h>
logwtmp(line, name, host)
char *line, *name, *host;
{
struct utmp ut;
struct stat buf;
int fd;
time_t time();
char *strncpy();
if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) < 0)
return;
if (fstat(fd, &buf) == 0) {
(void) strncpy(ut.ut_line, line, sizeof(ut.ut_line));
(void) strncpy(ut.ut_name, name, sizeof(ut.ut_name));
(void) strncpy(ut.ut_host, host, sizeof(ut.ut_host));
(void) time(&ut.ut_time);
if (write(fd, (char *)&ut, sizeof(struct utmp)) !=
sizeof(struct utmp))
(void) ftruncate(fd, buf.st_size);
}
(void) close(fd);
}

View File

@ -30,9 +30,11 @@ __BEGIN_DECLS
/* Alternate names for values for the WHENCE argument to `lseek'.
These are the same as SEEK_SET, SEEK_CUR, and SEEK_END, respectively. */
#ifndef L_SET
#define L_SET 0 /* Seek from beginning of file. */
#define L_INCR 1 /* Seek from current position. */
#define L_XTND 2 /* Seek from end of file. */
#endif
/* Operations for the `flock' call. */

View File

@ -3,7 +3,7 @@
"Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu
before changing it!
Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94
Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95
Free Software Foundation, Inc.
This file is part of the GNU C Library. Its master source is NOT part of
@ -387,7 +387,10 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
optarg = NULL;
if (optind == 0)
optstring = _getopt_initialize (optstring);
{
optstring = _getopt_initialize (optstring);
optind = 1; /* Don't scan ARGV[0], the program name. */
}
if (nextchar == NULL || *nextchar == '\0')
{

View File

@ -125,6 +125,14 @@ extern int euidaccess __P ((__const char *__name, int __type));
#define SEEK_END 2 /* Seek from end of file. */
#endif
#if defined (__USE_BSD) && !defined (L_SET)
/* Old BSD names for the same constants; just for compatibility. */
#define L_SET SEEK_SET
#define L_INCR SEEK_CUR
#define L_XTND SEEK_END
#endif
/* Move FD's file position to OFFSET bytes from the
beginning of the file (if WHENCE is SEEK_SET),
the current position (if WHENCE is SEEK_CUR),
@ -417,6 +425,12 @@ extern char *ttyname __P ((int __fd));
extern int __isatty __P ((int __fd));
extern int isatty __P ((int __fd));
#ifdef __USE_BSD
/* Return the index into the active-logins file (utmp) for
the terminal FD is open on. */
extern int ttyslot ((int __fd));
#endif
/* Make a link to FROM named TO. */
extern int __link __P ((__const char *__from, __const char *__to));

View File

@ -24,7 +24,7 @@ subdir := setjmp
headers := setjmp.h jmp_buf.h
routines := setjmp sigjmp bsd-setjmp bsd-_setjmp \
longjmp __longjmp
longjmp __longjmp jmp-unwind
tests := tst-setjmp

View File

@ -21,12 +21,17 @@ Cambridge, MA 02139, USA. */
#include <signal.h>
extern void _longjmp_unwind (jmp_buf env, int val);
/* Set the signal mask to the one specified in ENV, and jump
to the position specified in ENV, causing the setjmp
call there to return VAL, or 1 if VAL is 0. */
void
longjmp (sigjmp_buf env, int val)
{
/* Perform any cleanups needed by the frames being unwound. */
_longjmp_unwind (env, val);
if (env[0].__mask_was_saved)
/* Restore the saved signal mask. */
(void) __sigprocmask (SIG_SETMASK, &env[0].__saved_mask,

127
sysdeps/generic/pty.c Normal file
View File

@ -0,0 +1,127 @@
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)pty.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
#include <sys/cdefs.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <grp.h>
openpty(amaster, aslave, name, termp, winp)
int *amaster, *aslave;
char *name;
struct termios *termp;
struct winsize *winp;
{
static char line[] = "/dev/ptyXX";
register const char *cp1, *cp2;
register int master, slave, ttygid;
struct group *gr;
if ((gr = getgrnam("tty")) != NULL)
ttygid = gr->gr_gid;
else
ttygid = -1;
for (cp1 = "pqrs"; *cp1; cp1++) {
line[8] = *cp1;
for (cp2 = "0123456789abcdef"; *cp2; cp2++) {
line[9] = *cp2;
if ((master = open(line, O_RDWR, 0)) == -1) {
if (errno == ENOENT)
return (-1); /* out of ptys */
} else {
line[5] = 't';
(void) chown(line, getuid(), ttygid);
(void) chmod(line, S_IRUSR|S_IWUSR|S_IWGRP);
(void) revoke(line);
if ((slave = open(line, O_RDWR, 0)) != -1) {
*amaster = master;
*aslave = slave;
if (name)
strcpy(name, line);
if (termp)
(void) tcsetattr(slave,
TCSAFLUSH, termp);
if (winp)
(void) ioctl(slave, TIOCSWINSZ,
(char *)winp);
return (0);
}
(void) close(master);
line[5] = 'p';
}
}
}
errno = ENOENT; /* out of ptys */
return (-1);
}
forkpty(amaster, name, termp, winp)
int *amaster;
char *name;
struct termios *termp;
struct winsize *winp;
{
int master, slave, pid;
if (openpty(&master, &slave, name, termp, winp) == -1)
return (-1);
switch (pid = fork()) {
case -1:
return (-1);
case 0:
/*
* child
*/
(void) close(master);
login_tty(slave);
return (0);
}
/*
* parent
*/
*amaster = master;
(void) close(slave);
return (pid);
}

View File

@ -7,3 +7,8 @@ typedef struct
__ptr_t __sp;
__ptr_t __pc;
} __jmp_buf[1];
/* Test if longjmp to JMPBUF would unwind the frame
containing a local variable at ADDRESS. */
#define _JMPBUF_UNWINDS(jmpbuf, address) \
((__ptr_t) (address) < (jmpbuf)[0].__sp)

View File

@ -0,0 +1,62 @@
/* _longjmp_unwind -- Clean up stack frames unwound by longjmp. Hurd version.
Copyright (C) 1995 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <setjmp.h>
#include <hurd/signal.h>
#include <hurd/userlink.h>
#include <assert.h>
/* This function is called by `longjmp' (with its arguments) to restore
active resources to a sane state before the frames code using them are
jumped out of. */
void
_longjmp_unwind (jmp_buf env, int val)
{
struct hurd_sigstate *ss = _hurd_self_sigstate ();
struct hurd_userlink *link;
/* All access to SS->active_resources must take place inside a critical
section where signal handlers cannot run. */
__spin_lock (&ss->lock);
assert (! ss->critical_section);
ss->critical_section = 1;
__spin_unlock (&ss->lock);
#ifndef _JMPBUF_UNWINDS
#error "sysdeps/MACHINE/jmp_buf.h fails to define _JMPBUF_UNWINDS"
#endif
/* Iterate over the current thread's list of active resources.
Process the head portion of the list whose links reside
in stack frames being unwound by this jump. */
for (link = ss->active_resources;
link && _JMPBUF_UNWINDS (env[0].__jmpbuf, link);
link = link->thread.next)
/* Remove this link from the resource's users list,
since the frame using the resource is being unwound.
This call returns nonzero if that was the last user. */
if (_hurd_userlink_unlink (link))
/* One of the frames being unwound by the longjmp was the last user
of its resource. Call the cleanup function to deallocate it. */
(*link->cleanup) (link->cleanup_data, env, val);
_hurd_critical_section_unlock (ss);
}

View File

@ -1,5 +1,5 @@
/* Define the machine-dependent type `jmp_buf'. Mips version.
Copyright (C) 1992, 1993 Free Software Foundation, Inc.
/* Define the machine-dependent type `jmp_buf'. MIPS version.
Copyright (C) 1992, 1993, 1995 Free Software Foundation, Inc.
Contributed by Brendan Kehoe (brendan@zen.org).
The GNU C Library is free software; you can redistribute it and/or
@ -45,3 +45,9 @@ typedef struct
/* Offset to the program counter in `jmp_buf'. */
#define JB_PC 0
#endif
/* Test if longjmp to JMPBUF would unwind the frame
containing a local variable at ADDRESS. */
#define _JMPBUF_UNWINDS(jmpbuf, address) \
((__ptr_t) (address) < (jmpbuf)[0].__sp)

29
sysdeps/stub/jmp-unwind.c Normal file
View File

@ -0,0 +1,29 @@
/* _longjmp_unwind -- Clean up stack frames unwound by longjmp. Stub version.
Copyright (C) 1995 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <setjmp.h>
void
_longjmp_unwind (jmp_buf env, int val)
{
/* This function can perform any cleanups necessary to safely unwind the
stack frames around the current context which ENV unwinds past. */
}