mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
Update.
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:
parent
b2d4446fd6
commit
a5a6f9262e
45
ChangeLog
45
ChangeLog
@ -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.
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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. */
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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. */
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
31
posix/spawn.c
Normal 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
156
posix/spawn.h
Normal 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 */
|
50
posix/spawn_faction_addclose.c
Normal file
50
posix/spawn_faction_addclose.c
Normal 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;
|
||||
}
|
51
posix/spawn_faction_adddup2.c
Normal file
51
posix/spawn_faction_adddup2.c
Normal 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;
|
||||
}
|
54
posix/spawn_faction_addopen.c
Normal file
54
posix/spawn_faction_addopen.c
Normal 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;
|
||||
}
|
29
posix/spawn_faction_destroy.c
Normal file
29
posix/spawn_faction_destroy.c
Normal 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;
|
||||
}
|
53
posix/spawn_faction_init.c
Normal file
53
posix/spawn_faction_init.c
Normal 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
38
posix/spawn_int.h
Normal 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
27
posix/spawnattr_destroy.c
Normal 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;
|
||||
}
|
32
posix/spawnattr_getdefault.c
Normal file
32
posix/spawnattr_getdefault.c
Normal 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;
|
||||
}
|
30
posix/spawnattr_getflags.c
Normal file
30
posix/spawnattr_getflags.c
Normal 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;
|
||||
}
|
30
posix/spawnattr_getpgroup.c
Normal file
30
posix/spawnattr_getpgroup.c
Normal 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;
|
||||
}
|
31
posix/spawnattr_getschedparam.c
Normal file
31
posix/spawnattr_getschedparam.c
Normal 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;
|
||||
}
|
31
posix/spawnattr_getschedpolicy.c
Normal file
31
posix/spawnattr_getschedpolicy.c
Normal 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;
|
||||
}
|
31
posix/spawnattr_getsigmask.c
Normal file
31
posix/spawnattr_getsigmask.c
Normal 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
31
posix/spawnattr_init.c
Normal 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;
|
||||
}
|
31
posix/spawnattr_setdefault.c
Normal file
31
posix/spawnattr_setdefault.c
Normal 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;
|
||||
}
|
30
posix/spawnattr_setflags.c
Normal file
30
posix/spawnattr_setflags.c
Normal 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;
|
||||
}
|
30
posix/spawnattr_setpgroup.c
Normal file
30
posix/spawnattr_setpgroup.c
Normal 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;
|
||||
}
|
31
posix/spawnattr_setschedparam.c
Normal file
31
posix/spawnattr_setschedparam.c
Normal 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;
|
||||
}
|
34
posix/spawnattr_setschedpolicy.c
Normal file
34
posix/spawnattr_setschedpolicy.c
Normal 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;
|
||||
}
|
31
posix/spawnattr_setsigmask.c
Normal file
31
posix/spawnattr_setsigmask.c
Normal 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
275
posix/spawni.c
Normal 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
31
posix/spawnp.c
Normal 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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user