Skip to content

Commit

Permalink
* sysdeps/unix/sysv/linux/i386/system.c: Moved to ...
Browse files Browse the repository at this point in the history
	* sysdeps/unix/sysv/linux/system.c: ... here.
	(FORK): Don't #define if already #define'd.
	* sysdeps/unix/sysv/linux/s390/system.c: File removed.
	* sysdeps/unix/sysv/linux/kernel-features.h [__powerpc__]:
	(__ASSUME_CLONE_THREAD_FLAGS): Define for kernel >= 2.5.64.
  • Loading branch information
Roland McGrath committed Mar 15, 2003
1 parent 45e4762 commit 7eecc0c
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 77 deletions.
7 changes: 7 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
2003-03-15 Roland McGrath <roland@redhat.com>

* sysdeps/unix/sysv/linux/i386/system.c: Moved to ...
* sysdeps/unix/sysv/linux/system.c: ... here.
(FORK): Don't #define if already #define'd.
* sysdeps/unix/sysv/linux/s390/system.c: File removed.
* sysdeps/unix/sysv/linux/kernel-features.h [__powerpc__]:
(__ASSUME_CLONE_THREAD_FLAGS): Define for kernel >= 2.5.64.

* dlfcn/tst-dlinfo.c: New file.
* dlfcn/Makefile (tests): Add tst-dlinfo.
($(objpfx)tst-dlinfo): New target.
Expand Down
2 changes: 1 addition & 1 deletion sysdeps/generic/libc-start.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char **
# ifndef LIBC_START_MAIN_AUXVEC_ARG
ElfW(auxv_t) *__unbounded auxvec;
{
char *__unbounded *__unbounded evp = uvp_ev;
char *__unbounded *__unbounded evp = ubp_ev;
while (*evp != NULL)
++evp;
auxvec = (ElfW(auxv_t) *__unbounded) evp;
Expand Down
73 changes: 0 additions & 73 deletions sysdeps/unix/sysv/linux/i386/system.c

This file was deleted.

4 changes: 2 additions & 2 deletions sysdeps/unix/sysv/linux/kernel-features.h
Original file line number Diff line number Diff line change
Expand Up @@ -274,8 +274,8 @@
/* The late 2.5 kernels saw a lot of new CLONE_* flags. Summarize
their availability with one define. The changes were made first
for i386 and the have to be done separately for the other archs.
For ia64 and s390* we pick 2.5.64 as the first version with support. */
For ia64, s390*, PPC we pick 2.5.64 as the first version with support. */
#if __LINUX_KERNEL_VERSION >= 132416 \
&& (defined __ia64__ || defined __s390__)
&& (defined __ia64__ || defined __s390__ || defined __powerpc__)
# define __ASSUME_CLONE_THREAD_FLAGS 1
#endif
1 change: 0 additions & 1 deletion sysdeps/unix/sysv/linux/s390/system.c

This file was deleted.

71 changes: 71 additions & 0 deletions sysdeps/unix/sysv/linux/system.c
Original file line number Diff line number Diff line change
@@ -1,2 +1,73 @@
/* Copyright (C) 2002, 2003 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */

#include <sched.h>
#include <signal.h>
#include <sysdep.h>
#include <unistd.h>
#include <sys/wait.h>
#include <bits/libc-lock.h>
#include <kernel-features.h>

/* We have to and actually can handle cancelable system(). The big
problem: we have to kill the child process if necessary. To do
this a cleanup handler has to be registered and is has to be able
to find the PID of the child. The main problem is to reliable have
the PID when needed. It is not necessary for the parent thread to
return. It might still be in the kernel when the cancellation
request comes. Therefore we have to use the clone() calls ability
to have the kernel write the PID into the user-level variable. */
#if defined __ASSUME_CLONE_THREAD_FLAGS && !defined FORK
# define FORK() \
INLINE_SYSCALL (clone, 3, CLONE_PARENT_SETTID | SIGCHLD, 0, &pid)
#endif

static void cancel_handler (void *arg);

#define CLEANUP_HANDLER \
__libc_cleanup_region_start (1, cancel_handler, &pid)

#define CLEANUP_RESET \
__libc_cleanup_region_end (0)


/* Linux has waitpid(), so override the generic unix version. */
#include <sysdeps/posix/system.c>


/* The cancellation handler. */
static void
cancel_handler (void *arg)
{
pid_t child = *(pid_t *) arg;

INTERNAL_SYSCALL_DECL (err);
INTERNAL_SYSCALL (kill, err, 2, child, SIGKILL);

TEMP_FAILURE_RETRY (__waitpid (child, NULL, 0));

DO_LOCK ();

if (SUB_REF () == 0)
{
(void) __sigaction (SIGQUIT, &quit, (struct sigaction *) NULL);
(void) __sigaction (SIGINT, &intr, (struct sigaction *) NULL);
}

DO_UNLOCK ();
}

0 comments on commit 7eecc0c

Please sign in to comment.