Browse Source

Implement execvpe(3) and posix_spawn(3) and family. Based on

FreeBSD's implementation via Frank Denis, with various cleanups and
tweaks by me.
ok deraadt@, guenther@; discussions and tweaks from many others
jmc@ promises to help me further with the man pages in tree
OPENBSD_5_2
matthew 12 years ago
parent
commit
37676d43d9
3 changed files with 113 additions and 6 deletions
  1. +2
    -2
      src/include/Makefile
  2. +104
    -0
      src/include/spawn.h
  3. +7
    -4
      src/include/unistd.h

+ 2
- 2
src/include/Makefile View File

@ -1,4 +1,4 @@
# $OpenBSD: Makefile,v 1.160 2011/07/09 00:46:07 henning Exp $
# $OpenBSD: Makefile,v 1.161 2012/03/21 23:20:35 matthew Exp $
# $NetBSD: Makefile,v 1.59 1996/05/15 21:36:43 jtc Exp $
# @(#)Makefile 5.45.1.1 (Berkeley) 5/6/91
@ -18,7 +18,7 @@ FILES= a.out.h ar.h assert.h bitstring.h blf.h bm.h bsd_auth.h \
md5.h memory.h mpool.h ndbm.h netdb.h netgroup.h nlist.h nl_types.h \
ohash.h paths.h poll.h pwd.h ranlib.h re_comp.h \
readpassphrase.h regex.h resolv.h rmd160.h search.h setjmp.h \
sgtty.h sha1.h sha2.h signal.h sndio.h stab.h \
sgtty.h sha1.h sha2.h signal.h sndio.h spawn.h stab.h \
stdbool.h stddef.h stdio.h stdlib.h \
string.h strings.h struct.h sysexits.h tar.h tgmath.h \
time.h ttyent.h tzfile.h unistd.h utime.h utmp.h vis.h \


+ 104
- 0
src/include/spawn.h View File

@ -0,0 +1,104 @@
/* $OpenBSD: spawn.h,v 1.1 2012/03/21 23:20:35 matthew Exp $ */
/*-
* Copyright (c) 2008 Ed Schouten <ed@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD: src/include/spawn.h,v 1.3.2.1.6.1 2010/12/21 17:09:25 kensmith Exp $
*/
#ifndef _SPAWN_H_
#define _SPAWN_H_
#include <sys/cdefs.h>
#include <sys/types.h>
#include <sys/signal.h>
struct sched_param;
typedef struct __posix_spawnattr *posix_spawnattr_t;
typedef struct __posix_spawn_file_actions *posix_spawn_file_actions_t;
#define POSIX_SPAWN_RESETIDS 0x01
#define POSIX_SPAWN_SETPGROUP 0x02
#define POSIX_SPAWN_SETSCHEDPARAM 0x04
#define POSIX_SPAWN_SETSCHEDULER 0x08
#define POSIX_SPAWN_SETSIGDEF 0x10
#define POSIX_SPAWN_SETSIGMASK 0x20
__BEGIN_DECLS
/*
* Spawn routines
*
* XXX both arrays should be __restrict, but this does not work when GCC
* is invoked with -std=c99.
*/
int posix_spawn(pid_t *__restrict, const char *__restrict,
const posix_spawn_file_actions_t *, const posix_spawnattr_t *__restrict,
char *const [], char *const []);
int posix_spawnp(pid_t *__restrict, const char *__restrict,
const posix_spawn_file_actions_t *, const posix_spawnattr_t *__restrict,
char *const [], char *const []);
/*
* File descriptor actions
*/
int posix_spawn_file_actions_init(posix_spawn_file_actions_t *);
int posix_spawn_file_actions_destroy(posix_spawn_file_actions_t *);
int posix_spawn_file_actions_addopen(posix_spawn_file_actions_t *__restrict,
int, const char *__restrict, int, mode_t);
int posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t *, int, int);
int posix_spawn_file_actions_addclose(posix_spawn_file_actions_t *, int);
/*
* Spawn attributes
*/
int posix_spawnattr_init(posix_spawnattr_t *);
int posix_spawnattr_destroy(posix_spawnattr_t *);
int posix_spawnattr_getflags(const posix_spawnattr_t *__restrict,
short *__restrict);
int posix_spawnattr_getpgroup(const posix_spawnattr_t *__restrict,
pid_t *__restrict);
int posix_spawnattr_getschedparam(const posix_spawnattr_t *__restrict,
struct sched_param *__restrict);
int posix_spawnattr_getschedpolicy(const posix_spawnattr_t *__restrict,
int *__restrict);
int posix_spawnattr_getsigdefault(const posix_spawnattr_t *__restrict,
sigset_t *__restrict);
int posix_spawnattr_getsigmask(const posix_spawnattr_t *__restrict,
sigset_t *__restrict sigmask);
int posix_spawnattr_setflags(posix_spawnattr_t *, short);
int posix_spawnattr_setpgroup(posix_spawnattr_t *, pid_t);
int posix_spawnattr_setschedparam(posix_spawnattr_t *__restrict,
const struct sched_param *__restrict);
int posix_spawnattr_setschedpolicy(posix_spawnattr_t *, int);
int posix_spawnattr_setsigdefault(posix_spawnattr_t *__restrict,
const sigset_t *__restrict);
int posix_spawnattr_setsigmask(posix_spawnattr_t *__restrict,
const sigset_t *__restrict);
__END_DECLS
#endif /* !_SPAWN_H_ */

+ 7
- 4
src/include/unistd.h View File

@ -1,4 +1,4 @@
/* $OpenBSD: unistd.h,v 1.67 2012/01/13 13:16:44 nigel Exp $ */
/* $OpenBSD: unistd.h,v 1.68 2012/03/21 23:20:35 matthew Exp $ */
/* $NetBSD: unistd.h,v 1.26.4.1 1996/05/28 02:31:51 mrg Exp $ */
/*-
@ -79,9 +79,12 @@ int execl(const char *, const char *, ...)
int execle(const char *, const char *, ...);
int execlp(const char *, const char *, ...)
__attribute__((sentinel));
int execv(const char *, char * const *);
int execve(const char *, char * const *, char * const *);
int execvp(const char *, char * const *);
int execv(const char *, char *const *);
int execve(const char *, char *const *, char *const *);
int execvp(const char *, char *const *);
#if __BSD_VISIBLE
int execvpe(const char *, char *const *, char *const *);
#endif
pid_t fork(void);
long fpathconf(int, int);
char *getcwd(char *, size_t)


Loading…
Cancel
Save