Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Update.
	* sysdeps/posix/system.c (do_system): Add support for installation
	of cancellation handlers.
	* sysdeps/unix/sysv/linux/i386/system.c: New file.

	* stdlib/Makefile (tests): Add tst-system.
	* stdlib/tst-system.c: New file.
  • Loading branch information
Ulrich Drepper committed Dec 17, 2002
1 parent 26a026b commit 3ca97e8
Show file tree
Hide file tree
Showing 5 changed files with 123 additions and 5 deletions.
7 changes: 7 additions & 0 deletions ChangeLog
@@ -1,5 +1,12 @@
2002-12-16 Ulrich Drepper <drepper@redhat.com>

* sysdeps/posix/system.c (do_system): Add support for installation
of cancellation handlers.
* sysdeps/unix/sysv/linux/i386/system.c: New file.

* stdlib/Makefile (tests): Add tst-system.
* stdlib/tst-system.c: New file.

* sysdeps/unix/sysv/linux/i386/socket.S [NEED_CANCELLATION &&
CENABLE]: Don't lose content of %ebx.

Expand Down
11 changes: 6 additions & 5 deletions stdlib/Makefile
Expand Up @@ -55,13 +55,14 @@ routines := \
# linked against when the shared library will be used.
static-only-routines = atexit

distribute := exit.h grouping.h abort-instr.h isomac.c tst-fmtmsg.sh \
distribute := exit.h grouping.h abort-instr.h isomac.c tst-fmtmsg.sh \
allocalim.h
test-srcs := tst-fmtmsg
tests := tst-strtol tst-strtod testmb testrand testsort testdiv \
test-canon test-canon2 tst-strtoll tst-environ \
tst-xpg-basename tst-random tst-bsearch tst-limits \
tst-rand48 bug-strtod tst-setcontext test-a64l tst-qsort
tests := tst-strtol tst-strtod testmb testrand testsort testdiv \
test-canon test-canon2 tst-strtoll tst-environ \
tst-xpg-basename tst-random tst-bsearch tst-limits \
tst-rand48 bug-strtod tst-setcontext test-a64l tst-qsort \
tst-system


# Several mpn functions from GNU MP are used by the strtod function.
Expand Down
31 changes: 31 additions & 0 deletions stdlib/tst-system.c
@@ -0,0 +1,31 @@
/* Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
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 <stdlib.h>


static int
do_test (void)
{
return system (":");
}


#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
12 changes: 12 additions & 0 deletions sysdeps/posix/system.c
Expand Up @@ -112,7 +112,15 @@ do_system (const char *line)
}
}

#ifdef CLEANUP_HANDLER
CLEANUP_HANDLER;
#endif

#ifdef FORK
pid = FORK ();
#else
pid = __fork ();
#endif
if (pid == (pid_t) 0)
{
/* Child side. */
Expand Down Expand Up @@ -158,6 +166,10 @@ do_system (const char *line)
#endif
}

#ifdef CLEANUP_HANDLER
CLEANUP_RESET;
#endif

save = errno;
DO_LOCK ();
if ((SUB_REF () == 0
Expand Down
67 changes: 67 additions & 0 deletions sysdeps/unix/sysv/linux/i386/system.c
@@ -0,0 +1,67 @@
/* Copyright (C) 2002 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>

/* 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. */
#define FORK() \
INLINE_SYSCALL (clone, 3, CLONE_PARENT_SETTID | SIGCHLD, 0, &pid)

static void cancel_handler (void *arg);

#define CLEANUP_HANDLER \
__libc_cleanup_region_start (0, 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)
{
__kill (SIGKILL, *(pid_t *) arg);

TEMP_FAILURE_RETRY (waitpid (*(pid_t *) arg, 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 3ca97e8

Please sign in to comment.