Re: posix_spawn_file_actions_addchdir/addfchdir

Mike Larkin <[email protected]>
Newsgroups gmane.os.openbsd.tech
Message-ID <[email protected]>
On Thu, Aug 06, 2026 at 06:56:23PM +0200, Kirill A. Korinsky wrote:
> On Thu, 06 Aug 2026 14:24:15 +0200,
> Stuart Henderson <[email protected]> wrote:
> >
> > posix_spawn_file_actions_addchdir and posix_spawn_file_actions_addfchdir
> > have been implemented as _np in some OS for a while, but have made it
> > into posix now.
> >
> > https://pubs.opengroup.org/onlinepubs/9799919799.2024edition/functions/posix_spawn_file_actions_addchdir.html
> >
> > a number of things in ports print information about testing for them
> > during configure (mostly via gnulib which provides replacements).
> > also the subprocess mode in llama.cpp is forcibly disabled via a
> > patch because we don't have ..._addchdir().
> >
> > https://exopi.bsdfrog.org/cgi-bin/omega?P=posix_spawn_file_actions_addchdir&DEFAULTOP=and&DB=default&FMT=query&xDB=default&xFILTERS=5
> >
> > do we want them (yet)? is this diff vaguely along the right lines?
> > (obviously needs shlib bump and testing in ports bulk).
> >
> > I wrote an initial diff, then discovered FreeBSD had them already
> > (then added the missing free which I spotted after comparing ;)
> >
>
> NetBSD also has them:
> https://man.netbsd.org/posix_spawn_file_actions_addchdir.3
>
> And yes, we need them for ports, I had encountered at least one case when it
> required: llama.cpp via https://github.com/sheredom/subprocess.h
>

I ran into the same thing with llama.cpp, so the change below would be welcome.

-ml

> Your diff reads sane enough, but I not sure that can review it the right way.
>
> > Index: include/spawn.h
> > ===================================================================
> > RCS file: /cvs/src/include/spawn.h,v
> > diff -u -p -r1.3 spawn.h
> > --- include/spawn.h	20 May 2015 22:50:07 -0000	1.3
> > +++ include/spawn.h	6 Aug 2026 12:18:31 -0000
> > @@ -69,6 +69,9 @@ int posix_spawn_file_actions_addopen(pos
> >      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);
> > +int posix_spawn_file_actions_addchdir(posix_spawn_file_actions_t *__restrict,
> > +    const char *__restrict);
> > +int posix_spawn_file_actions_addfchdir(posix_spawn_file_actions_t *, int);
> >
> >  /*
> >   * Spawn attributes
> > Index: lib/libc/Symbols.list
> > ===================================================================
> > RCS file: /cvs/src/lib/libc/Symbols.list,v
> > diff -u -p -r1.95 Symbols.list
> > --- lib/libc/Symbols.list	24 Oct 2025 11:30:06 -0000	1.95
> > +++ lib/libc/Symbols.list	6 Aug 2026 12:18:31 -0000
> > @@ -725,8 +725,10 @@ pause
> >  pclose
> >  popen
> >  posix_spawn
> > +posix_spawn_file_actions_addchdir
> >  posix_spawn_file_actions_addclose
> >  posix_spawn_file_actions_adddup2
> > +posix_spawn_file_actions_addfchdir
> >  posix_spawn_file_actions_addopen
> >  posix_spawn_file_actions_destroy
> >  posix_spawn_file_actions_init
> > Index: lib/libc/gen/posix_spawn.3
> > ===================================================================
> > RCS file: /cvs/src/lib/libc/gen/posix_spawn.3,v
> > diff -u -p -r1.11 posix_spawn.3
> > --- lib/libc/gen/posix_spawn.3	26 Jun 2023 15:28:52 -0000	1.11
> > +++ lib/libc/gen/posix_spawn.3	6 Aug 2026 12:18:31 -0000
> > @@ -73,8 +73,10 @@ with
> >  Otherwise, file descriptors in the child process
> >  are altered according to
> >  .Xr posix_spawn_file_actions_init 3 ,
> > +.Xr posix_spawn_file_actions_addchdir 3 ,
> >  .Xr posix_spawn_file_actions_addclose 3 ,
> >  .Xr posix_spawn_file_actions_adddup2 3 ,
> > +.Xr posix_spawn_file_actions_addfchdir 3 ,
> >  and
> >  .Xr posix_spawn_file_actions_addopen 3 .
> >  .Pp
> > Index: lib/libc/gen/posix_spawn.c
> > ===================================================================
> > RCS file: /cvs/src/lib/libc/gen/posix_spawn.c,v
> > diff -u -p -r1.10 posix_spawn.c
> > --- lib/libc/gen/posix_spawn.c	28 Jun 2019 13:32:41 -0000	1.10
> > +++ lib/libc/gen/posix_spawn.c	6 Aug 2026 12:18:31 -0000
> > @@ -51,7 +51,7 @@ struct __posix_spawn_file_actions {
> >
> >  typedef struct __posix_spawn_file_actions_entry {
> >  	SIMPLEQ_ENTRY(__posix_spawn_file_actions_entry) fae_list;
> > -	enum { FAE_OPEN, FAE_DUP2, FAE_CLOSE } fae_action;
> > +	enum { FAE_OPEN, FAE_DUP2, FAE_CLOSE, FAE_CHDIR, FAE_FCHDIR } fae_action;
> >
> >  	int fae_fildes;
> >  	union {
> > @@ -171,6 +171,14 @@ process_file_actions_entry(posix_spawn_f
> >  		/* Perform a close(), do not fail if already closed */
> >  		(void)close(fae->fae_fildes);
> >  		break;
> > +	case FAE_CHDIR:
> > +		if (chdir(fae->fae_path) == -1)
> > +			return (errno);
> > +		break;
> > +	case FAE_FCHDIR:
> > +		if (fchdir(fae->fae_fildes) == -1)
> > +			return (errno);
> > +		break;
> >  	}
> >  	return (0);
> >  }
> > @@ -273,7 +281,8 @@ posix_spawn_file_actions_destroy(posix_s
> >  		SIMPLEQ_REMOVE_HEAD(&(*fa)->fa_list, fae_list);
> >
> >  		/* Deallocate file action entry */
> > -		if (fae->fae_action == FAE_OPEN)
> > +		if (fae->fae_action == FAE_OPEN ||
> > +		    fae->fae_action == FAE_CHDIR)
> >  			free(fae->fae_path);
> >  		free(fae);
> >  	}
> > @@ -352,6 +361,54 @@ posix_spawn_file_actions_addclose(posix_
> >
> >  	/* Set values and store in queue */
> >  	fae->fae_action = FAE_CLOSE;
> > +	fae->fae_fildes = fildes;
> > +
> > +	SIMPLEQ_INSERT_TAIL(&(*fa)->fa_list, fae, fae_list);
> > +	return (0);
> > +}
> > +
> > +int
> > +posix_spawn_file_actions_addchdir(posix_spawn_file_actions_t *__restrict fa,
> > +    const char *__restrict path)
> > +{
> > +	posix_spawn_file_actions_entry_t *fae;
> > +	int error;
> > +
> > +	/* Allocate object */
> > +	fae = malloc(sizeof(posix_spawn_file_actions_entry_t));
> > +	if (fae == NULL)
> > +		return (errno);
> > +
> > +	/* Set values and store in queue */
> > +	fae->fae_action = FAE_CHDIR;
> > +	fae->fae_path = strdup(path);
> > +	if (fae->fae_path == NULL) {
> > +		error = errno;
> > +		free(fae);
> > +		return (error);
> > +	}
> > +
> > +	SIMPLEQ_INSERT_TAIL(&(*fa)->fa_list, fae, fae_list);
> > +	return (0);
> > +}
> > +
> > +int
> > +posix_spawn_file_actions_addfchdir(posix_spawn_file_actions_t *__restrict fa,
> > +    int fildes)
> > +{
> > +	posix_spawn_file_actions_entry_t *fae;
> > +	int error;
> > +
> > +	if (fildes < 0)
> > +		return (EBADF);
> > +
> > +	/* Allocate object */
> > +	fae = malloc(sizeof(posix_spawn_file_actions_entry_t));
> > +	if (fae == NULL)
> > +		return (errno);
> > +
> > +	/* Set values and store in queue */
> > +	fae->fae_action = FAE_FCHDIR;
> >  	fae->fae_fildes = fildes;
> >
> >  	SIMPLEQ_INSERT_TAIL(&(*fa)->fa_list, fae, fae_list);
> > Index: lib/libc/gen/posix_spawn_file_actions_addopen.3
> > ===================================================================
> > RCS file: /cvs/src/lib/libc/gen/posix_spawn_file_actions_addopen.3,v
> > diff -u -p -r1.9 posix_spawn_file_actions_addopen.3
> > --- lib/libc/gen/posix_spawn_file_actions_addopen.3	29 Mar 2022 18:15:52 -0000	1.9
> > +++ lib/libc/gen/posix_spawn_file_actions_addopen.3	6 Aug 2026 12:18:31 -0000
> > @@ -18,17 +18,23 @@
> >  .Dt POSIX_SPAWN_FILE_ACTIONS_ADDOPEN 3
> >  .Os
> >  .Sh NAME
> > +.Nm posix_spawn_file_actions_addchdir ,
> >  .Nm posix_spawn_file_actions_addclose ,
> >  .Nm posix_spawn_file_actions_adddup2 ,
> > +.Nm posix_spawn_file_actions_addfchdir ,
> >  .Nm posix_spawn_file_actions_addopen
> >  .Nd add action to close, dup2 or open file descriptor to file actions object
> >  .Sh SYNOPSIS
> >  .In spawn.h
> >  .Ft int
> > +.Fn posix_spawn_file_actions_addchdir "posix_spawn_file_actions_t *file_actions" "const char *restrict path"
> > +.Ft int
> >  .Fn posix_spawn_file_actions_addclose "posix_spawn_file_actions_t *file_actions" "int fildes"
> >  .Ft int
> >  .Fn posix_spawn_file_actions_adddup2 "posix_spawn_file_actions_t *file_actions" "int fildes" "int newfildes"
> >  .Ft int
> > +.Fn posix_spawn_file_actions_addfchdir "posix_spawn_file_actions_t *file_actions" "int fildes"
> > +.Ft int
> >  .Fn posix_spawn_file_actions_addopen "posix_spawn_file_actions_t *file_actions" "int fildes" "const char *restrict path" "int oflag" "mode_t mode"
> >  .Sh DESCRIPTION
> >  These function add an action to
> > @@ -45,6 +51,15 @@ Actions are executed in order in the chi
> >  .Bl -dash
> >  .It
> >  The
> > +.Fn posix_spawn_file_actions_addchdir
> > +function adds an action that causes
> > +.Bd -literal -offset indent
> > +chdir(path);
> > +.Ed
> > +.Pp
> > +to be called.
> > +.It
> > +The
> >  .Fn posix_spawn_file_actions_addclose
> >  function adds an action that causes
> >  .Bd -literal -offset indent
> > @@ -69,6 +84,15 @@ equals
> >  .Fa fildes .
> >  .It
> >  The
> > +.Fn posix_spawn_file_actions_addfchdir
> > +function adds an action that causes
> > +.Bd -literal -offset indent
> > +fchdir(fildes);
> > +.Ed
> > +.Pp
> > +to be called.
> > +.It
> > +The
> >  .Fn posix_spawn_file_actions_addopen
> >  function adds an action that causes
> >  .Bd -literal -offset indent
> > @@ -100,7 +124,12 @@ if they run out of memory.
> >  .Xr posix_spawn_file_actions_init 3 ,
> >  .Xr posix_spawnp 3
> >  .Sh STANDARDS
> > -These functions conform to
> > +.Fn posix_spawn_file_actions_addchdir
> > +and
> > +.Fn posix_spawn_file_actions_addfchdir
> > +conform to
> > +.St -p1003.1-2024 .
> > +Other functions conform to
> >  .St -p1003.1-2001 .
> >  .Sh AUTHORS
> >  .An \&Ed Schouten Aq Mt [email protected]
> > Index: lib/libc/hidden/spawn.h
> > ===================================================================
> > RCS file: /cvs/src/lib/libc/hidden/spawn.h,v
> > diff -u -p -r1.1 spawn.h
> > --- lib/libc/hidden/spawn.h	4 Oct 2015 07:57:21 -0000	1.1
> > +++ lib/libc/hidden/spawn.h	6 Aug 2026 12:18:31 -0000
> > @@ -21,8 +21,10 @@
> >  #include_next <spawn.h>
> >
> >  PROTO_DEPRECATED(posix_spawn);
> > +PROTO_DEPRECATED(posix_spawn_file_actions_addchdir);
> >  PROTO_DEPRECATED(posix_spawn_file_actions_addclose);
> >  PROTO_DEPRECATED(posix_spawn_file_actions_adddup2);
> > +PROTO_DEPRECATED(posix_spawn_file_actions_addfchdir);
> >  PROTO_DEPRECATED(posix_spawn_file_actions_addopen);
> >  PROTO_DEPRECATED(posix_spawn_file_actions_destroy);
> >  PROTO_DEPRECATED(posix_spawn_file_actions_init);
> >
>
> --
> wbr, Kirill
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.