[PATCH] posix_spawn: factor out structs to an internal header

Jeremy Drake <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
This will allow Cygwin to examine and handle the posix_spawnattr_t and
posix_spawn_file_actions_t arguments itself.

Signed-off-by: Jeremy Drake <[email protected]>
---
I'm not subscribed to the newlib list but rathe to cygwin-patches

Context: I'm working on a patch to Cygwin to optimize posix_spawn where
possible to not use fork/exec but instead spawn the child process
directly.  Determining whether this is possible depends on examining the
parameters, and while the posix_spawnattr_t has "get" functions that can
be used to examine its members the posix_spawn_file_actions_t has no such
ability.

 newlib/libc/posix/posix_spawn.c | 45 +--------------------------
 newlib/libc/posix/posix_spawn.h | 54 +++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+), 44 deletions(-)
 create mode 100644 newlib/libc/posix/posix_spawn.h

diff --git a/newlib/libc/posix/posix_spawn.c b/newlib/libc/posix/posix_spawn.c
index 46e4e5369f..51ad23f825 100644
--- a/newlib/libc/posix/posix_spawn.c
+++ b/newlib/libc/posix/posix_spawn.c
@@ -102,56 +102,13 @@ Supporting OS subroutines required: <<_close>>, <<dup2>>, <<_fcntl>>,
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include "posix_spawn.h"

 /* Only deal with a pointer to environ, to work around subtle bugs with shared
    libraries and/or small data systems where the user declares his own
    'environ'.  */
 static char ***p_environ = &environ;

-struct __posix_spawnattr {
-	short			sa_flags;
-	pid_t			sa_pgroup;
-	struct sched_param	sa_schedparam;
-	int			sa_schedpolicy;
-	sigset_t		sa_sigdefault;
-	sigset_t		sa_sigmask;
-};
-
-struct __posix_spawn_file_actions {
-	STAILQ_HEAD(, __posix_spawn_file_actions_entry) fa_list;
-};
-
-typedef struct __posix_spawn_file_actions_entry {
-	STAILQ_ENTRY(__posix_spawn_file_actions_entry) fae_list;
-	enum {
-		FAE_OPEN,
-		FAE_DUP2,
-		FAE_CLOSE,
-		FAE_CHDIR,
-		FAE_FCHDIR
-	} fae_action;
-
-	int fae_fildes;
-	union {
-		struct {
-			char *path;
-#define fae_path	fae_data.open.path
-			int oflag;
-#define fae_oflag	fae_data.open.oflag
-			mode_t mode;
-#define fae_mode	fae_data.open.mode
-		} open;
-		struct {
-			int newfildes;
-#define fae_newfildes	fae_data.dup2.newfildes
-		} dup2;
-		char *dir;
-#define fae_dir		fae_data.dir
-		int dirfd;
-#define fae_dirfd		fae_data.dirfd
-	} fae_data;
-} posix_spawn_file_actions_entry_t;
-
 /*
  * Spawn routines
  */
diff --git a/newlib/libc/posix/posix_spawn.h b/newlib/libc/posix/posix_spawn.h
new file mode 100644
index 0000000000..b4cad1e523
--- /dev/null
+++ b/newlib/libc/posix/posix_spawn.h
@@ -0,0 +1,54 @@
+#ifndef _POSIX_SPAWN_H_
+#define	_POSIX_SPAWN_H_
+
+#include <sys/cdefs.h>
+#include <sys/sched.h>
+#include <sys/signal.h>
+#include <sys/types.h>
+#include <sys/queue.h>
+
+struct __posix_spawnattr {
+	short			sa_flags;
+	pid_t			sa_pgroup;
+	struct sched_param	sa_schedparam;
+	int			sa_schedpolicy;
+	sigset_t		sa_sigdefault;
+	sigset_t		sa_sigmask;
+};
+
+struct __posix_spawn_file_actions {
+	STAILQ_HEAD(, __posix_spawn_file_actions_entry) fa_list;
+};
+
+typedef struct __posix_spawn_file_actions_entry {
+	STAILQ_ENTRY(__posix_spawn_file_actions_entry) fae_list;
+	enum {
+		FAE_OPEN,
+		FAE_DUP2,
+		FAE_CLOSE,
+		FAE_CHDIR,
+		FAE_FCHDIR
+	} fae_action;
+
+	int fae_fildes;
+	union {
+		struct {
+			char *path;
+#define fae_path	fae_data.open.path
+			int oflag;
+#define fae_oflag	fae_data.open.oflag
+			mode_t mode;
+#define fae_mode	fae_data.open.mode
+		} open;
+		struct {
+			int newfildes;
+#define fae_newfildes	fae_data.dup2.newfildes
+		} dup2;
+		char *dir;
+#define fae_dir		fae_data.dir
+		int dirfd;
+#define fae_dirfd		fae_data.dirfd
+	} fae_data;
+} posix_spawn_file_actions_entry_t;
+
+#endif /* !_POSIX_SPAWN_H_ */
-- 
2.49.0.windows.1
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.