2000-04-15  Ulrich Drepper  <drepper@redhat.com>

	* posix/Makefile (headers): Add spawn.h.
	(distribute): Add spawn_int.h.
	(routines): Add spawn_faction_init, spawn_faction_destroy,
	spawn_faction_addclose, spawn_faction_addopen, spawn_faction_adddup2,
	spawnattr_init, spawnattr_destroy, spawnattr_getdefault,
	spawnattr_setdefault, spawnattr_getflags, spawnattr_setflags,
	spawnattr_getpgroup, spawnattr_setpgroup, spawn, spawnp, and spawni.
	* posix/Versions [libc] (GLIBC_2.2): Add posix_spawn_file_actions_init,
	posix_spawn_file_actions_destroy, posix_spawn_file_actions_addclose,
	posix_spawn_file_actions_addopen, posix_spawn_file_actions_adddup2,
	posix_spawnattr_init, posix_spawnattr_destroy,
	posix_spawnattr_getdefault, posix_spawnattr_setdefault,
	posix_spawnattr_getflags, posix_spawnattr_setflags,
	posix_spawnattr_getpgroup, posix_spawnattr_setpgroup, posix_spawn,
	and posix_spawnp.
	* posix/spawn.c: New file.
	* posix/spawn.h: New file.
	* posix/spawn_faction_addclose.c: New file.
	* posix/spawn_faction_adddup2.c: New file.
	* posix/spawn_faction_addopen.c: New file.
	* posix/spawn_faction_destroy.c: New file.
	* posix/spawn_faction_init.c: New file.
	* posix/spawn_int.h: New file.
	* posix/spawnattr_destroy.c: New file.
	* posix/spawnattr_getdefault.c: New file.
	* posix/spawnattr_getflags.c: New file.
	* posix/spawnattr_getpgroup.c: New file.
	* posix/spawnattr_getschedparam.c: New file.
	* posix/spawnattr_getschedpolicy.c: New file.
	* posix/spawnattr_getsigmask.c: New file.
	* posix/spawnattr_init.c: New file.
	* posix/spawnattr_setdefault.c: New file.
	* posix/spawnattr_setflags.c: New file.
	* posix/spawnattr_setpgroup.c: New file.
	* posix/spawnattr_setschedparam.c: New file.
	* posix/spawnattr_setschedpolicy.c: New file.
	* posix/spawnattr_setsigmask.c: New file.
	* posix/spawni.c: New file.
	* posix/spawnp.c: New file.

	* sysdeps/mach/hurd/bits/posix_opt.h: Add _POSIX_SPAWN.
	* sysdeps/unix/sysv/linux/bits/posix_opt.h: Likewise.
This commit is contained in:
Ulrich Drepper 2000-04-15 16:51:16 +00:00
parent b2d4446fd6
commit a5a6f9262e
32 changed files with 1286 additions and 8 deletions

View File

@ -1,3 +1,48 @@
2000-04-15 Ulrich Drepper <drepper@redhat.com>
* posix/Makefile (headers): Add spawn.h.
(distribute): Add spawn_int.h.
(routines): Add spawn_faction_init, spawn_faction_destroy,
spawn_faction_addclose, spawn_faction_addopen, spawn_faction_adddup2,
spawnattr_init, spawnattr_destroy, spawnattr_getdefault,
spawnattr_setdefault, spawnattr_getflags, spawnattr_setflags,
spawnattr_getpgroup, spawnattr_setpgroup, spawn, spawnp, and spawni.
* posix/Versions [libc] (GLIBC_2.2): Add posix_spawn_file_actions_init,
posix_spawn_file_actions_destroy, posix_spawn_file_actions_addclose,
posix_spawn_file_actions_addopen, posix_spawn_file_actions_adddup2,
posix_spawnattr_init, posix_spawnattr_destroy,
posix_spawnattr_getdefault, posix_spawnattr_setdefault,
posix_spawnattr_getflags, posix_spawnattr_setflags,
posix_spawnattr_getpgroup, posix_spawnattr_setpgroup, posix_spawn,
and posix_spawnp.
* posix/spawn.c: New file.
* posix/spawn.h: New file.
* posix/spawn_faction_addclose.c: New file.
* posix/spawn_faction_adddup2.c: New file.
* posix/spawn_faction_addopen.c: New file.
* posix/spawn_faction_destroy.c: New file.
* posix/spawn_faction_init.c: New file.
* posix/spawn_int.h: New file.
* posix/spawnattr_destroy.c: New file.
* posix/spawnattr_getdefault.c: New file.
* posix/spawnattr_getflags.c: New file.
* posix/spawnattr_getpgroup.c: New file.
* posix/spawnattr_getschedparam.c: New file.
* posix/spawnattr_getschedpolicy.c: New file.
* posix/spawnattr_getsigmask.c: New file.
* posix/spawnattr_init.c: New file.
* posix/spawnattr_setdefault.c: New file.
* posix/spawnattr_setflags.c: New file.
* posix/spawnattr_setpgroup.c: New file.
* posix/spawnattr_setschedparam.c: New file.
* posix/spawnattr_setschedpolicy.c: New file.
* posix/spawnattr_setsigmask.c: New file.
* posix/spawni.c: New file.
* posix/spawnp.c: New file.
* sysdeps/mach/hurd/bits/posix_opt.h: Add _POSIX_SPAWN.
* sysdeps/unix/sysv/linux/bits/posix_opt.h: Likewise.
2000-04-14 Ulrich Drepper <drepper@redhat.com>
* malloc/Versions [libc] (GLIBC_2.2): Add posix_memalign.

View File

@ -1,5 +1,12 @@
2000-04-15 Ulrich Drepper <drepper@redhat.com>
* internals.h (WRITE_MEMORY_BARRIER): Define as MEMORY_BARRIER if
undefined.
* spinlock.c: Use WRITE_MEMORY_BARRIER instead of MEMORY_BARRIER
where possible.
* sysdeps/alpha/pt-machine.h: Define WRITE_MEMORY_BARRIER.
* sysdeps/sparc/sparc64/pt-machine.h: Likewise.
* sysdeps/unix/sysv/linux/bits/posix_opt.h: Add _POSIX_SPAWN.
* sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise.

View File

@ -358,11 +358,15 @@ static inline pthread_descr thread_self (void)
}
/* If MEMORY_BARRIER isn't defined in pt-machine.h, assume the architecture
doesn't need a memory barrier instruction (e.g. Intel x86) */
doesn't need a memory barrier instruction (e.g. Intel x86). Some
architectures distinguish between normal/read and write barriers. */
#ifndef MEMORY_BARRIER
#define MEMORY_BARRIER()
#endif
#ifndef WRITE_MEMORY_BARRIER
#define WRITE_MEMORY_BARRIER() MEMORY_BARRIER()
#endif
/* Max number of times we must spin on a spinlock calling sched_yield().
After MAX_SPIN_COUNT iterations, we put the calling thread to sleep. */

View File

@ -56,7 +56,7 @@ void internal_function __pthread_lock(pthread_spinlock_t * lock,
THREAD_SETMEM(self, p_nextlock, (pthread_descr) oldstatus);
/* Make sure the store in p_nextlock completes before performing
the compare-and-swap */
MEMORY_BARRIER();
WRITE_MEMORY_BARRIER();
}
} while(! compare_and_swap(&lock->__status, oldstatus, newstatus,
&lock->__spinlock));
@ -198,7 +198,7 @@ int __pthread_compare_and_swap(long * ptr, long oldval, long newval,
res = 0;
}
/* Prevent reordering of store to *ptr above and store to *spinlock below */
MEMORY_BARRIER();
WRITE_MEMORY_BARRIER();
*spinlock = 0;
return res;
}

View File

@ -1,6 +1,6 @@
/* Machine-dependent pthreads configuration and inline functions.
Alpha version.
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Richard Henderson <rth@tamu.edu>.
@ -34,6 +34,8 @@ register char *stack_pointer __asm__("$30");
/* Memory barrier; default is to do nothing */
#define MEMORY_BARRIER() __asm__ __volatile__("mb" : : : "memory")
/* Write barrier. */
#define WRITE_MEMORY_BARRIER() __asm__ __volatile__("wmb" : : : "memory")
/* Spinlock implementation; required. */

View File

@ -1,6 +1,6 @@
/* Machine-dependent pthreads configuration and inline functions.
Sparc v9 version.
Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Richard Henderson <rth@tamu.edu>.
@ -41,6 +41,9 @@ testandset (int *spinlock)
/* FIXME: is stbar OK, or should we use the more general membar instruction?
If so, which mode to pass to membar? */
#define MEMORY_BARRIER() __asm__ __volatile__("stbar" : : : "memory")
/* Write barrier. */
#define WRITE_MEMORY_BARRIER() \
__asm__ __volatile__("membar #StoreLoad | #StoreStore" : : : "memory")
/* Get some notion of the current stack. Need not be exactly the top

View File

@ -27,11 +27,12 @@ headers := sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h \
bits/local_lim.h tar.h bits/utsname.h bits/confname.h \
bits/waitflags.h bits/waitstatus.h sys/unistd.h sched.h \
bits/sched.h re_comp.h wait.h bits/environments.h cpio.h \
sys/sysmacros.h
sys/sysmacros.h spawn.h
distribute := confstr.h TESTS TESTS2C.sed testcases.h \
PTESTS PTESTS2C.sed ptestcases.h \
globtest.c globtest.sh wordexp-tst.sh annexc.c fnmatch_loop.c
globtest.c globtest.sh wordexp-tst.sh annexc.c fnmatch_loop.c \
spawn_int.h
routines := \
uname \
@ -51,7 +52,13 @@ routines := \
sched_setp sched_getp sched_sets sched_gets sched_yield sched_primax \
sched_primin sched_rr_gi \
getaddrinfo gai_strerror wordexp \
pread pwrite pread64 pwrite64
pread pwrite pread64 pwrite64 \
spawn_faction_init spawn_faction_destroy spawn_faction_addclose \
spawn_faction_addopen spawn_faction_adddup2 \
spawnattr_init spawnattr_destroy \
spawnattr_getdefault spawnattr_setdefault \
spawnattr_getflags spawnattr_setflags \
spawnattr_getpgroup spawnattr_setpgroup spawn spawnp spawni
include ../Makeconfig

View File

@ -92,4 +92,16 @@ libc {
# For the cancelation wrappers.
__libc_pread; __libc_pread64; __libc_pwrite; __libc_pwrite64;
}
GLIBC_2.2 {
# p*
posix_spawn_file_actions_init; posix_spawn_file_actions_destroy;
posix_spawn_file_actions_addclose; posix_spawn_file_actions_addopen;
posix_spawn_file_actions_adddup2;
posix_spawnattr_init; posix_spawnattr_destroy;
posix_spawnattr_getdefault; posix_spawnattr_setdefault;
posix_spawnattr_getflags; posix_spawnattr_setflags;
posix_spawnattr_getpgroup; posix_spawnattr_setpgroup;
posix_spawnattr_setsigmask; posix_spawnattr_getsigmask;
posix_spawn; posix_spawnp;
}
}

31
posix/spawn.c Normal file
View File

@ -0,0 +1,31 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
#include "spawn_int.h"
/* Spawn a new process executing PATH with the attributes describes in *ATTRP.
Before running the process perform the actions described in FILE-ACTIONS. */
int
posix_spawn (pid_t *pid, const char *path,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *attrp, char *const argv[],
char *const envp[])
{
return __spawni (pid, path, file_actions, attrp, argv, envp, 0);
}

156
posix/spawn.h Normal file
View File

@ -0,0 +1,156 @@
/* Definitions for POSIX spawn interface.
Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _SPAWN_H
#define _SPAWN_H 1
#include <features.h>
#include <sched.h>
#include <signal.h>
#include <sys/types.h>
/* Data structure to contain attributes for thread creation. */
typedef struct
{
short int __flags;
pid_t __pgrp;
sigset_t __sd;
sigset_t __ss;
struct sched_param __sp;
int __policy;
int __pad[16];
} posix_spawnattr_t;
/* Data structure to contain information about the actions to be
performed in the new process with respect to file descriptors. */
typedef struct
{
int __allocated;
int __used;
struct __spawn_action *__actions;
int __pad[16];
} posix_spawn_file_actions_t;
/* Flags to be set in the `posix_spawnattr_t'. */
#define POSIX_SPAWN_RESETIDS 0x01
#define POSIX_SPAWN_SETPGROUP 0x02
#define POSIX_SPAWN_SETSIGDEF 0x04
#define POSIX_SPAWN_SETSIGMASK 0x08
#define POSIX_SPAWN_SETSCHEDPARAM 0x10
#define POSIX_SPAWN_SETSCHEDULER 0x20
__BEGIN_DECLS
/* Spawn a new process executing PATH with the attributes describes in *ATTRP.
Before running the process perform the actions described in FILE-ACTIONS. */
extern int posix_spawn (pid_t *__pid, __const char *__path,
__const posix_spawn_file_actions_t *__file_actions,
__const posix_spawnattr_t *__attrp,
char *__const argv[], char *__const envp[]) __THROW;
/* Similar to `posix_spawn' but search for FILE in the PATH. */
extern int posix_spawnp (pid_t *__pid, __const char *__file,
__const posix_spawn_file_actions_t *__file_actions,
__const posix_spawnattr_t *__attrp,
char *__const argv[], char *__const envp[]) __THROW;
/* Initialize data structure with attributes for `spawn' to default values. */
extern int posix_spawnattr_init (posix_spawnattr_t *__attr) __THROW;
/* Free resources associated with ATTR. */
extern int posix_spawnattr_destroy (posix_spawnattr_t *__attr) __THROW;
/* Store signal mask for signals with default handling from ATTR in
SIGDEFAULT. */
extern int posix_spawnattr_getdefault (__const posix_spawnattr_t *__attr,
sigset_t *__sigdefault) __THROW;
/* Set signal mask for signals with default handling in ATTR to SIGDEFAULT. */
extern int posix_spawnattr_setdefault (posix_spawnattr_t *__attr,
__const sigset_t *__sigdefault) __THROW;
/* Store signal mask for the new process from ATTR in SIGMASK. */
extern int posix_spawnattr_getsigmask (__const posix_spawnattr_t *__attr,
sigset_t *__sigmask) __THROW;
/* Set signal mask for the new process in ATTR to SIGMASK. */
extern int posix_spawnattr_setsigmask (posix_spawnattr_t *__attr,
__const sigset_t *__sigmask) __THROW;
/* Get flag word from the attribute structure. */
extern int posix_spawnattr_getflags (__const posix_spawnattr_t *__attr,
short int *__flags) __THROW;
/* Store flags in the attribute structure. */
extern int posix_spawnattr_setflags (posix_spawnattr_t *_attr,
short int __flags) __THROW;
/* Get process group ID from the attribute structure. */
extern int posix_spawnattr_getpgroup (__const posix_spawnattr_t *__attr,
pid_t *__pgroup) __THROW;
/* Store process group ID in the attribute structure. */
extern int posix_spawnattr_setpgroup (posix_spawnattr_t *__attr,
pid_t __pgroup) __THROW;
/* Get scheduling policy from the attribute structure. */
extern int posix_spawnattr_getschedpolicy (__const posix_spawnattr_t *__attr,
int *__schedpolicy) __THROW;
/* Store scheduling policy in the attribute structure. */
extern int posix_spawnattr_setschedpolicy (posix_spawnattr_t *__attr,
int __schedpolicy) __THROW;
/* Initialize data structure for file attribute for `spawn' call. */
extern int posix_spawn_file_actions_init (posix_spawn_file_actions_t *
__file_actions) __THROW;
/* Free resources associated with FILE-ACTIONS. */
extern int posix_spawn_file_actions_destroy (posix_spawn_file_actions_t *
__file_actions) __THROW;
/* Add an action to FILE-ACTIONS which tells the implementation to call
`open' for the given file during the `spawn' call. */
extern int posix_spawn_file_actions_addopen (posix_spawn_file_actions_t *
__file_actions,
int __fd, __const char *__path,
int __oflag, mode_t __mode)
__THROW;
/* Add an action to FILE-ACTIONS which tells the implementation to call
`close' for the given file descriptor during the `spawn' call. */
extern int posix_spawn_file_actions_addclose (posix_spawn_file_actions_t *
__file_actions, int __fd)
__THROW;
/* Add an action to FILE-ACTIONS which tells the implementation to call
`dup2' for the given file descriptors during the `spawn' call. */
extern int posix_spawn_file_actions_adddup2 (posix_spawn_file_actions_t *
__file_actions,
int __fd, int __newfd) __THROW;
__END_DECLS
#endif /* spawn.h */

View File

@ -0,0 +1,50 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <spawn.h>
#include <unistd.h>
#include "spawn_int.h"
/* Add an action to FILE-ACTIONS which tells the implementation to call
`close' for the given file descriptor during the `spawn' call. */
int
posix_spawn_file_actions_addclose (posix_spawn_file_actions_t *file_actions,
int fd)
{
int maxfd = sysconf (_SC_OPEN_MAX);
struct __spawn_action *rec;
/* Test for the validity of the file descriptor. */
if (fd < 0 || fd >= maxfd)
return EBADF;
/* Allocate more memory of needed. */
if (file_actions->__used == file_actions->__allocated
&& __posix_spawn_file_actions_realloc (file_actions) != 0)
/* THis can only mean we ran out of memory. */
return ENOMEM;
/* Add the new value. */
rec = &file_actions->__actions[file_actions->__allocated];
rec->tag = spawn_do_close;
rec->action.open_action.fd = fd;
return 0;
}

View File

@ -0,0 +1,51 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <spawn.h>
#include <unistd.h>
#include "spawn_int.h"
/* Add an action to FILE-ACTIONS which tells the implementation to call
`dup2' for the given file descriptors during the `spawn' call. */
int
posix_spawn_file_actions_adddup2 (posix_spawn_file_actions_t *file_actions,
int fd, int newfd)
{
int maxfd = sysconf (_SC_OPEN_MAX);
struct __spawn_action *rec;
/* Test for the validity of the file descriptor. */
if (fd < 0 || newfd < 0 || fd >= maxfd || newfd >= maxfd)
return EBADF;
/* Allocate more memory of needed. */
if (file_actions->__used == file_actions->__allocated
&& __posix_spawn_file_actions_realloc (file_actions) != 0)
/* THis can only mean we ran out of memory. */
return ENOMEM;
/* Add the new value. */
rec = &file_actions->__actions[file_actions->__allocated];
rec->tag = spawn_do_dup2;
rec->action.dup2_action.fd = fd;
rec->action.dup2_action.newfd = newfd;
return 0;
}

View File

@ -0,0 +1,54 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <spawn.h>
#include <unistd.h>
#include "spawn_int.h"
/* Add an action to FILE-ACTIONS which tells the implementation to call
`open' for the given file during the `spawn' call. */
int
posix_spawn_file_actions_addopen (posix_spawn_file_actions_t *file_actions,
int fd, const char *path, int oflag,
mode_t mode)
{
int maxfd = sysconf (_SC_OPEN_MAX);
struct __spawn_action *rec;
/* Test for the validity of the file descriptor. */
if (fd < 0 || fd >= maxfd)
return EBADF;
/* Allocate more memory of needed. */
if (file_actions->__used == file_actions->__allocated
&& __posix_spawn_file_actions_realloc (file_actions) != 0)
/* THis can only mean we ran out of memory. */
return ENOMEM;
/* Add the new value. */
rec = &file_actions->__actions[file_actions->__allocated];
rec->tag = spawn_do_open;
rec->action.open_action.fd = fd;
rec->action.open_action.path = path;
rec->action.open_action.oflag = oflag;
rec->action.open_action.mode = mode;
return 0;
}

View File

@ -0,0 +1,29 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
#include <stdlib.h>
/* Initialize data structure for file attribute for `spawn' call. */
int
posix_spawn_file_actions_destroy (posix_spawn_file_actions_t *file_actions)
{
/* Free the memory allocated. */
free (file_actions->__actions);
return 0;
}

View File

@ -0,0 +1,53 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <spawn.h>
#include <stdlib.h>
#include <string.h>
/* Function used to increase the size of the allocated array. This
function is called from the `add'-functions. */
int
__posix_spawn_file_actions_realloc (posix_spawn_file_actions_t *file_actions)
{
void *newmem = realloc (file_actions->__actions,
file_actions->__allocated += 8);
if (newmem == NULL)
{
/* Not enough memory. */
file_actions->__allocated -= 8;
return ENOMEM;
}
file_actions->__actions = (struct __spawn_action *) newmem;
return 0;
}
/* Initialize data structure for file attribute for `spawn' call. */
int
posix_spawn_file_actions_init (posix_spawn_file_actions_t *file_actions)
{
/* Simply clear all the elements. */
memset (file_actions, '\0', sizeof (*file_actions));
return 0;
}

38
posix/spawn_int.h Normal file
View File

@ -0,0 +1,38 @@
/* Data structure to contain the action information. */
struct __spawn_action
{
enum
{
spawn_do_close,
spawn_do_dup2,
spawn_do_open
} tag;
union
{
struct
{
int fd;
} close_action;
struct
{
int fd;
int newfd;
} dup2_action;
struct
{
int fd;
const char *path;
int oflag;
mode_t mode;
} open_action;
} action;
};
extern int __posix_spawn_file_actions_realloc (posix_spawn_file_actions_t *
file_actions);
extern int __spawni (pid_t *pid, const char *path,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *attrp, char *const argv[],
char *const envp[], int use_path);

27
posix/spawnattr_destroy.c Normal file
View File

@ -0,0 +1,27 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
/* Initialize data structure for file attribute for `spawn' call. */
int
posix_spawnattr_destroy (posix_spawnattr_t *attr)
{
/* Nothing to do in the moment. */
return 0;
}

View File

@ -0,0 +1,32 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
#include <string.h>
/* Store signal mask for signals with default handling from ATTR in
SIGDEFAULT. */
int
posix_spawnattr_getdefault (const posix_spawnattr_t *attr,
sigset_t *sigdefault)
{
/* Copy the sigset_t data to the user buffer. */
memcpy (sigdefault, &attr->__sd, sizeof (sigset_t));
return 0;
}

View File

@ -0,0 +1,30 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
#include <string.h>
/* Get flag word from the attribute structure. */
int
posix_spawnattr_getflags (const posix_spawnattr_t *attr, short int *flags)
{
/* Copy the flag word. */
*flags = attr->__flags;
return 0;
}

View File

@ -0,0 +1,30 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
#include <string.h>
/* Get process group ID from the attribute structure. */
int
posix_spawnattr_getpgroup (const posix_spawnattr_t *attr, pid_t *pgroup)
{
/* Copy the process group ID. */
*pgroup = attr->__pgrp;
return 0;
}

View File

@ -0,0 +1,31 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
#include <string.h>
/* Get scheduling parameters from the attribute structure. */
int
posix_spawnattr_getschedparam (const posix_spawnattr_t *attr,
struct sched_param *schedparam)
{
/* Copy the scheduling parameters. */
memcpy (schedparam, &attr->__sp, sizeof (*attr));
return 0;
}

View File

@ -0,0 +1,31 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
#include <string.h>
/* Get scheduling policy from the attribute structure. */
int
posix_spawnattr_getschedpolicy (const posix_spawnattr_t *attr,
int *schedpolicy)
{
/* Copy the scheduling policy. */
*schedpolicy = attr->__policy;
return 0;
}

View File

@ -0,0 +1,31 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
#include <string.h>
/* Store signal mask for the new process from ATTR in SIGMASK. */
int
posix_spawnattr_getsigmask (const posix_spawnattr_t *attr,
sigset_t *sigmask)
{
/* Copy the sigset_t data to the user buffer. */
memcpy (sigmask, &attr->__ss, sizeof (sigset_t));
return 0;
}

31
posix/spawnattr_init.c Normal file
View File

@ -0,0 +1,31 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
#include <string.h>
/* Initialize data structure for file attribute for `spawn' call. */
int
posix_spawnattr_init (posix_spawnattr_t *attr)
{
/* All elements have to be initialized to the default values which
is generally zero. */
memset (attr, '\0', sizeof (*attr));
return 0;
}

View File

@ -0,0 +1,31 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
#include <string.h>
/* Set signal mask for signals with default handling in ATTR to SIGDEFAULT. */
int
posix_spawnattr_setdefault (posix_spawnattr_t *attr,
const sigset_t *sigdefault)
{
/* Copy the sigset_t data to the user buffer. */
memcpy (&attr->__sd, sigdefault, sizeof (sigset_t));
return 0;
}

View File

@ -0,0 +1,30 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
#include <string.h>
/* Store flags in the attribute structure. */
int
posix_spawnattr_setflags (posix_spawnattr_t *attr, short int flags)
{
/* Store the flag word. */
attr->__flags = flags;
return 0;
}

View File

@ -0,0 +1,30 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
#include <string.h>
/* Store process group ID in the attribute structure. */
int
posix_spawnattr_setpgroup (posix_spawnattr_t *attr, pid_t pgroup)
{
/* Store the process group ID. */
attr->__pgrp = pgroup;
return 0;
}

View File

@ -0,0 +1,31 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
#include <string.h>
/* Store scheduling parameters in the attribute structure. */
int
posix_spawnattr_setschedparam (posix_spawnattr_t *attr,
const struct shed_param *schedparam)
{
/* Store the flag word. */
attr->__flags = flags;
return 0;
}

View File

@ -0,0 +1,34 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <spawn.h>
/* Store scheduling policy in the attribute structure. */
int
posix_spawnattr_setschedpolicy (posix_spawnattr_t *attr, int schedpolicy)
{
if (schedpolicy != SCHED_OTHER && schedpolicy != SCHED_FIFO
&& schedpolicy != SCHED_RR)
return EINVAL;
/* Store the policy. */
attr->__policy = schedpolicy;
return 0;
}

View File

@ -0,0 +1,31 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
#include <string.h>
/* Set signal mask for the new process in ATTR to SIGMASK. */
int
posix_spawnattr_setsigmask (posix_spawnattr_t *attr,
const sigset_t *sigmask)
{
/* Copy the sigset_t data to the user buffer. */
memcpy (&attr->__ss, sigdefault, sizeof (sigset_t));
return 0;
}

275
posix/spawni.c Normal file
View File

@ -0,0 +1,275 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <fcntl.h>
#include <paths.h>
#include <spawn.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "spawn_int.h"
/* The Unix standard contains a long explanation of the way to signal
an error after the fork() was successful. Since no new wait status
was wanted there is no way to signal an error using one of the
available methods. The committee chose to signal an error by a
normal program exit with the exit code 127. */
#define SPAWN_ERROR 127
/* The file is accessible but it is not an executable file. Invoke
the shell to interpret it as a script. */
static void
internal_function
script_execute (const char *file, char *const argv[], char *const envp[])
{
/* Count the arguments. */
int argc = 0;
while (argv[argc++])
;
/* Construct an argument list for the shell. */
{
char *new_argv[argc + 1];
new_argv[0] = (char *) _PATH_BSHELL;
new_argv[1] = (char *) file;
while (argc > 1)
{
new_argv[argc] = argv[argc - 1];
--argc;
}
/* Execute the shell. */
__execve (new_argv[0], new_argv, envp);
}
}
/* Spawn a new process executing PATH with the attributes describes in *ATTRP.
Before running the process perform the actions described in FILE-ACTIONS. */
int
__spawni (pid_t *pid, const char *file,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *attrp, char *const argv[],
char *const envp[], int use_path)
{
pid_t new_pid;
char *path, *p, *name;
size_t len;
size_t pathlen;
short int flags;
/* Generate the new process. */
new_pid = fork ();
if (new_pid != 0)
{
if (new_pid < 0)
return errno;
/* The call was successful. Store the PID if necessary. */
if (pid != NULL)
*pid = new_pid;
return 0;
}
/* Do this once. */
flags = attrp == NULL ? 0 : attrp->__flags;
/* Set signal mask. */
if ((flags & POSIX_SPAWN_SETSIGMASK) != 0
&& __sigprocmask (SIG_SETMASK, &attrp->__ss, NULL) != 0)
_exit (SPAWN_ERROR);
/* Set signal default action. */
if ((flags & POSIX_SPAWN_SETSIGDEF) != 0)
{
/* We have to iterate over all signals. This could possibly be
done better but it requires system specific solutions since
the sigset_t data type can be very different on different
architectures. */
int sig;
struct sigaction sa;
memset (&sa, '\0', sizeof (sa));
sa.sa_handler = SIG_DFL;
for (sig = 1; sig >= _NSIG; ++sig)
if (sigismember (&attrp->__sd, sig) != 0
&& __sigaction (sig, &sa, NULL) != 0)
_exit (SPAWN_ERROR);
}
#ifdef _POSIX_PRIORITY_SCHEDULING
/* Set the scheduling algorithm and parameters. */
if ((flags & (POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETSCHEDULER))
== POSIX_SPAWN_SETSCHEDPARAM)
{
if (__sched_setparam (0, &attrp->__sp) == -1)
_exit (SPAWN_ERROR);
}
else if ((flags & POSIX_SPAWN_SETSCHEDULER) != 0)
{
if (__sched_setscheduler (0, attrp->__policy,
(flags & POSIX_SPAWN_SETSCHEDPARAM) != 0
? &attrp->__sp : NULL) == -1)
_exit (SPAWN_ERROR);
}
#endif
/* Set the process group ID. */
if ((flags & POSIX_SPAWN_SETPGROUP) != 0
&& __setpgid (0, attrp->__pgrp) != 0)
_exit (SPAWN_ERROR);
/* Set the effective user and group IDs. */
if ((flags & POSIX_SPAWN_RESETIDS) != 0
&& (seteuid (__getuid ()) != 0 || setegid (__getgid ()) != 0))
_exit (SPAWN_ERROR);
/* Execute the file actions. */
if (file_actions != NULL)
{
int cnt;
for (cnt = 0; cnt < file_actions->__used; ++cnt)
{
struct __spawn_action *action = &file_actions->__actions[cnt];
switch (action->tag)
{
case spawn_do_close:
if (close (action->action.close_action.fd) != 0)
/* Signal the error. */
_exit (SPAWN_ERROR);
break;
case spawn_do_open:
{
int new_fd = open (action->action.open_action.path,
action->action.open_action.oflag,
action->action.open_action.mode);
if (new_fd == -1)
/* The `open' call failed. */
_exit (SPAWN_ERROR);
/* Make sure the desired file descriptor is used. */
if (new_fd != action->action.open_action.fd)
{
if (__dup2 (new_fd, action->action.open_action.fd) != 0)
/* The `dup2' call failed. */
_exit (SPAWN_ERROR);
if (close (new_fd) != 0)
/* The `close' call failed. */
_exit (SPAWN_ERROR);
}
}
break;
case spawn_do_dup2:
if (__dup2 (action->action.dup2_action.fd,
action->action.dup2_action.newfd) != 0)
/* The `dup2' call failed. */
_exit (SPAWN_ERROR);
break;
}
}
}
if (! use_path || strchr (file, '/') != NULL)
{
/* The FILE parameter is actually a path. */
__execve (file, argv, envp);
if (errno == ENOEXEC)
script_execute (file, argv, envp);
/* Oh, oh. `execve' returns. This is bad. */
_exit (SPAWN_ERROR);
}
/* We have to search for FILE on the path. */
path = getenv ("PATH");
if (path == NULL)
{
/* There is no `PATH' in the environment.
The default search path is the current directory
followed by the path `confstr' returns for `_CS_PATH'. */
len = confstr (_CS_PATH, (char *) NULL, 0);
path = (char *) __alloca (1 + len);
path[0] = ':';
(void) confstr (_CS_PATH, path + 1, len);
}
len = strlen (file) + 1;
pathlen = strlen (path);
name = __alloca (pathlen + len + 1);
/* Copy the file name at the top. */
name = (char *) memcpy (name + pathlen + 1, file, len);
/* And add the slash. */
*--name = '/';
p = path;
do
{
char *startp;
path = p;
p = __strchrnul (path, ':');
if (p == path)
/* Two adjacent colons, or a colon at the beginning or the end
of `PATH' means to search the current directory. */
startp = name + 1;
else
startp = (char *) memcpy (name - (p - path), path, p - path);
/* Try to execute this name. If it works, execv will not return. */
__execve (startp, argv, envp);
if (errno == ENOEXEC)
script_execute (startp, argv, envp);
switch (errno)
{
case EACCES:
case ENOENT:
case ESTALE:
case ENOTDIR:
/* Those errors indicate the file is missing or not executable
by us, in which case we want to just try the next path
directory. */
break;
default:
/* Some other error means we found an executable file, but
something went wrong executing it; return the error to our
caller. */
_exit (SPAWN_ERROR);
}
}
while (*p++ != '\0');
/* Return with an error. */
_exit (SPAWN_ERROR);
}

31
posix/spawnp.c Normal file
View File

@ -0,0 +1,31 @@
/* Copyright (C) 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 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <spawn.h>
#include "spawn_int.h"
/* Spawn a new process executing FILE with the attributes describes in *ATTRP.
Before running the process perform the actions described in FILE-ACTIONS. */
int
posix_spawnp (pid_t *pid, const char *file,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *attrp, char *const argv[],
char *const envp[])
{
return __spawni (pid, file, file_actions, attrp, argv, envp, 1);
}