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.4 2014/02/02 14:54:39 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
,
83 posix_spawn_file_actions_entry_t
*fae
;
88 if (fa
->len
< fa
->size
)
91 fae
= realloc(fa
->fae
, (fa
->size
+ MIN_SIZE
) * sizeof(*fa
->fae
));
104 posix_spawn_file_actions_addopen(posix_spawn_file_actions_t
* __restrict fa
,
105 int fildes
, const char * __restrict path
, int oflag
, mode_t mode
)
114 error
= posix_spawn_file_actions_getentry(fa
, &i
);
118 faepath
= strdup(path
);
122 fa
->fae
[i
].fae_action
= FAE_OPEN
;
123 fa
->fae
[i
].fae_path
= faepath
;
124 fa
->fae
[i
].fae_fildes
= fildes
;
125 fa
->fae
[i
].fae_oflag
= oflag
;
126 fa
->fae
[i
].fae_mode
= mode
;
133 posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t
*fa
,
134 int fildes
, int newfildes
)
139 if (fildes
< 0 || newfildes
< 0)
142 error
= posix_spawn_file_actions_getentry(fa
, &i
);
146 fa
->fae
[i
].fae_action
= FAE_DUP2
;
147 fa
->fae
[i
].fae_fildes
= fildes
;
148 fa
->fae
[i
].fae_newfildes
= newfildes
;
155 posix_spawn_file_actions_addclose(posix_spawn_file_actions_t
*fa
,
164 error
= posix_spawn_file_actions_getentry(fa
, &i
);
168 fa
->fae
[i
].fae_action
= FAE_CLOSE
;
169 fa
->fae
[i
].fae_fildes
= fildes
;