posix_spawn: add closefrom non-portable action

Namely posix_spawn_file_actions_addclosefrom_np, in the form it is
provided by glibc.

Reviewed by:	kevans, ngie (previous version)
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D33143
This commit is contained in:
Konstantin Belousov 2021-11-28 00:54:16 +02:00
parent bd44dce5b3
commit a18ddf7757
3 changed files with 28 additions and 0 deletions

View file

@ -92,6 +92,8 @@ int posix_spawn_file_actions_addchdir_np(posix_spawn_file_actions_t *
__restrict, const char * __restrict); __restrict, const char * __restrict);
int posix_spawn_file_actions_addfchdir_np(posix_spawn_file_actions_t *, int posix_spawn_file_actions_addfchdir_np(posix_spawn_file_actions_t *,
int); int);
int posix_spawn_file_actions_addclosefrom_np(posix_spawn_file_actions_t *,
int);
#endif #endif
/* /*

View file

@ -437,6 +437,7 @@ FBSD_1.6 {
FBSD_1.7 { FBSD_1.7 {
posix_spawn_file_actions_addchdir_np; posix_spawn_file_actions_addchdir_np;
posix_spawn_file_actions_addclosefrom_np;
posix_spawn_file_actions_addfchdir_np; posix_spawn_file_actions_addfchdir_np;
sched_getaffinity; sched_getaffinity;
sched_setaffinity; sched_setaffinity;

View file

@ -68,6 +68,7 @@ typedef struct __posix_spawn_file_actions_entry {
FAE_CLOSE, FAE_CLOSE,
FAE_CHDIR, FAE_CHDIR,
FAE_FCHDIR, FAE_FCHDIR,
FAE_CLOSEFROM,
} fae_action; } fae_action;
int fae_fildes; int fae_fildes;
@ -190,6 +191,9 @@ process_file_actions_entry(posix_spawn_file_actions_entry_t *fae)
if (fchdir(fae->fae_fildes) != 0) if (fchdir(fae->fae_fildes) != 0)
return (errno); return (errno);
break; break;
case FAE_CLOSEFROM:
closefrom(fae->fae_fildes);
break;
} }
return (0); return (0);
} }
@ -533,6 +537,27 @@ posix_spawn_file_actions_addfchdir_np(posix_spawn_file_actions_t *__restrict fa,
return (0); return (0);
} }
int
posix_spawn_file_actions_addclosefrom_np (posix_spawn_file_actions_t *
__restrict fa, int from)
{
posix_spawn_file_actions_entry_t *fae;
if (from < 0)
return (EBADF);
/* Allocate object */
fae = malloc(sizeof(posix_spawn_file_actions_entry_t));
if (fae == NULL)
return (errno);
fae->fae_action = FAE_CLOSEFROM;
fae->fae_fildes = from;
STAILQ_INSERT_TAIL(&(*fa)->fa_list, fae, fae_list);
return (0);
}
/* /*
* Spawn attributes * Spawn attributes
*/ */