From mboxrd@z Thu Jan 1 00:00:00 1970 Path: main.gmane.org!not-for-mail From: Kevin Ryde Newsgroups: gmane.lisp.guile.devel Subject: Re: Support for (system '("echo" "foo" "bar")) Date: Sat, 01 Nov 2003 08:42:49 +1000 Sender: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Message-ID: <87ekwt9ggm.fsf@zip.com.au> References: <87ad7l9i8h.fsf@raven.i.defaultvalue.org> <87u15qpjwk.fsf@zip.com.au> <877k2mgdjs.fsf@raven.i.defaultvalue.org> <87d6cde1tr.fsf@raven.i.defaultvalue.org> <87oevxb1uy.fsf@zip.com.au> <87znfh9l6v.fsf@zip.com.au> <87vfq59iyf.fsf@zip.com.au> NNTP-Posting-Host: deer.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: sea.gmane.org 1067640287 25526 80.91.224.253 (31 Oct 2003 22:44:47 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Fri, 31 Oct 2003 22:44:47 +0000 (UTC) Original-X-From: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Fri Oct 31 23:44:45 2003 Return-path: Original-Received: from monty-python.gnu.org ([199.232.76.173]) by deer.gmane.org with esmtp (Exim 3.35 #1 (Debian)) id 1AFi0b-0005Tk-00 for ; Fri, 31 Oct 2003 23:44:45 +0100 Original-Received: from localhost ([127.0.0.1] helo=monty-python.gnu.org) by monty-python.gnu.org with esmtp (Exim 4.24) id 1AFhzx-0001Mt-Ss for guile-devel@m.gmane.org; Fri, 31 Oct 2003 17:44:05 -0500 Original-Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.24) id 1AFhzu-0001Le-7a for guile-devel@gnu.org; Fri, 31 Oct 2003 17:44:02 -0500 Original-Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.24) id 1AFhzN-0000z3-1L for guile-devel@gnu.org; Fri, 31 Oct 2003 17:44:01 -0500 Original-Received: from [61.8.0.36] (helo=snoopy.pacific.net.au) by monty-python.gnu.org with esmtp (Exim 4.24) id 1AFhzM-0000yy-6L for guile-devel@gnu.org; Fri, 31 Oct 2003 17:43:28 -0500 Original-Received: from mongrel.pacific.net.au (mongrel.pacific.net.au [61.8.0.107]) by snoopy.pacific.net.au (8.12.3/8.12.3/Debian-6.6) with ESMTP id h9VMhPV0023668 for ; Sat, 1 Nov 2003 09:43:25 +1100 Original-Received: from localhost (ppp115.dyn228.pacific.net.au [203.143.228.115]) by mongrel.pacific.net.au (8.12.3/8.12.3/Debian-6.6) with ESMTP id h9VMgxDJ027494 for ; Sat, 1 Nov 2003 09:43:00 +1100 Original-Received: from gg by localhost with local (Exim 3.35 #1 (Debian)) id 1AFhyl-0000hZ-00; Sat, 01 Nov 2003 08:42:51 +1000 Original-To: guile-devel@gnu.org Mail-Copies-To: never In-Reply-To: (Paul Jarc's message of "Fri, 31 Oct 2003 17:26:50 -0500") User-Agent: Gnus/5.1003 (Gnus v5.10.3) Emacs/21.3 (gnu/linux) X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.2 Precedence: list List-Id: Developers list for Guile, the GNU extensibility library List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Xref: main.gmane.org gmane.lisp.guile.devel:2953 X-Report-Spam: http://spam.gmane.org/gmane.lisp.guile.devel:2953 --=-=-= prj@po.cwru.edu (Paul Jarc) writes: > > (let* ((pid (apply system*/nowait args)) > (old-int (sigaction SIGINT SIG_IGN)) > (old-quit (sigaction SIGQUIT SIG_IGN)) In glibc the ignores are put on before the fork (and undone again in the child). Presumably to avoid a gap where the child is running but the parent is not yet ignoring. Oh, and SIGCHLD is blocked until after waitpid. (Code below, for those who don't have it handy.) --=-=-= Content-Type: text/x-csrc Content-Disposition: attachment; filename=system.c /* Copyright (C) 1991-1999, 2000 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 #include #include #include #include #include #include #ifndef HAVE_GNU_LD #define __environ environ #endif #define SHELL_PATH "/bin/sh" /* Path of the shell. */ #define SHELL_NAME "sh" /* Name to give it. */ /* Execute LINE as a shell command, returning its status. */ int __libc_system (const char *line) { int status, save; pid_t pid; struct sigaction sa, intr, quit; #ifndef WAITPID_CANNOT_BLOCK_SIGCHLD sigset_t block, omask; #endif if (line == NULL) /* Check that we have a command processor available. It might not be available after a chroot(), for example. */ return __libc_system ("exit 0") == 0; sa.sa_handler = SIG_IGN; sa.sa_flags = 0; __sigemptyset (&sa.sa_mask); if (__sigaction (SIGINT, &sa, &intr) < 0) return -1; if (__sigaction (SIGQUIT, &sa, &quit) < 0) { save = errno; (void) __sigaction (SIGINT, &intr, (struct sigaction *) NULL); __set_errno (save); return -1; } #ifndef WAITPID_CANNOT_BLOCK_SIGCHLD /* SCO 3.2v4 has a bug where `waitpid' will never return if SIGCHLD is blocked. This makes it impossible for `system' to be implemented in compliance with POSIX.2-1992. They have acknowledged that this is a bug but I have not seen nor heard of any forthcoming fix. */ __sigemptyset (&block); __sigaddset (&block, SIGCHLD); save = errno; if (__sigprocmask (SIG_BLOCK, &block, &omask) < 0) { if (errno == ENOSYS) __set_errno (save); else { save = errno; (void) __sigaction (SIGINT, &intr, (struct sigaction *) NULL); (void) __sigaction (SIGQUIT, &quit, (struct sigaction *) NULL); __set_errno (save); return -1; } } # define UNBLOCK __sigprocmask (SIG_SETMASK, &omask, (sigset_t *) NULL) #else # define UNBLOCK 0 #endif pid = __fork (); if (pid == (pid_t) 0) { /* Child side. */ const char *new_argv[4]; new_argv[0] = SHELL_NAME; new_argv[1] = "-c"; new_argv[2] = line; new_argv[3] = NULL; /* Restore the signals. */ (void) __sigaction (SIGINT, &intr, (struct sigaction *) NULL); (void) __sigaction (SIGQUIT, &quit, (struct sigaction *) NULL); (void) UNBLOCK; /* Exec the shell. */ (void) __execve (SHELL_PATH, (char *const *) new_argv, __environ); _exit (127); } else if (pid < (pid_t) 0) /* The fork failed. */ status = -1; else /* Parent side. */ { #ifdef NO_WAITPID pid_t child; do { child = __wait (&status); if (child <= -1 && errno != EINTR) { status = -1; break; } /* Note that pid cannot be <= -1 and therefore the loop continues when __wait returned with EINTR. */ } while (child != pid); #else int n; do n = __waitpid (pid, &status, 0); while (n == -1 && errno == EINTR); if (n != pid) status = -1; #endif } save = errno; if ((__sigaction (SIGINT, &intr, (struct sigaction *) NULL) | __sigaction (SIGQUIT, &quit, (struct sigaction *) NULL) | UNBLOCK) != 0) { if (errno == ENOSYS) __set_errno (save); else return -1; } return status; } weak_alias (__libc_system, system) --=-=-= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel --=-=-=--