2 * Copyright (c) 2008 Ed Schouten <ed@FreeBSD.org>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 #include <sys/cdefs.h>
28 __RCSID("$NetBSD: posix_spawn_fileactions.c,v 1.2 2012/04/08 11:27:44 martin Exp $");
30 #include "namespace.h"
44 * File descriptor actions
48 posix_spawn_file_actions_init(posix_spawn_file_actions_t
*fa
)
53 fa
->fae
= malloc(MIN_SIZE
* sizeof(struct posix_spawn_file_actions_entry
));
63 posix_spawn_file_actions_destroy(posix_spawn_file_actions_t
*fa
)
70 for (i
= 0; i
< fa
->len
; i
++) {
71 if (fa
->fae
[i
].fae_action
== FAE_OPEN
)
72 free(fa
->fae
[i
].fae_path
);
80 posix_spawn_file_actions_getentry(posix_spawn_file_actions_t
*fa
)
85 if (fa
->len
< fa
->size
)
88 fa
->fae
= realloc(fa
->fae
, (fa
->size
+ MIN_SIZE
) *
89 sizeof(struct posix_spawn_file_actions_entry
));
100 posix_spawn_file_actions_addopen(posix_spawn_file_actions_t
* __restrict fa
,
101 int fildes
, const char * __restrict path
, int oflag
, mode_t mode
)
108 i
= posix_spawn_file_actions_getentry(fa
);
112 fa
->fae
[i
].fae_action
= FAE_OPEN
;
113 fa
->fae
[i
].fae_path
= strdup(path
);
114 if (fa
->fae
[i
].fae_path
== NULL
) {
118 fa
->fae
[i
].fae_fildes
= fildes
;
119 fa
->fae
[i
].fae_oflag
= oflag
;
120 fa
->fae
[i
].fae_mode
= mode
;
128 posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t
*fa
,
129 int fildes
, int newfildes
)
133 if (fildes
< 0 || newfildes
< 0)
136 i
= posix_spawn_file_actions_getentry(fa
);
140 fa
->fae
[i
].fae_action
= FAE_DUP2
;
141 fa
->fae
[i
].fae_fildes
= fildes
;
142 fa
->fae
[i
].fae_newfildes
= newfildes
;
149 posix_spawn_file_actions_addclose(posix_spawn_file_actions_t
*fa
,
157 i
= posix_spawn_file_actions_getentry(fa
);
161 fa
->fae
[i
].fae_action
= FAE_CLOSE
;
162 fa
->fae
[i
].fae_fildes
= fildes
;