#pragma once

#include "runProcess.h"

enum std_handle_behavior {
    // Close the handle
    STD_HANDLE_CLOSE,
    // dup2 the specified fd to standard handle
    STD_HANDLE_USE_FD,
    // dup2 the appropriate end of the given pipe to the standard handle and
    // close the other end.
    STD_HANDLE_USE_PIPE
};

struct std_handle {
    enum std_handle_behavior behavior;
    union {
        int use_fd;
        struct {
            int parent_end, child_end;
        } use_pipe;
    };
};

int get_max_fd(void);

// defined in find_executable.c
#if !defined(HAVE_execvpe)
char *find_executable(char *filename);
#endif

// defined in fork_exec.c
ProcHandle
do_spawn_fork (char *const args[],
               char *workingDirectory, char **environment,
               struct std_handle *stdInHdl,
               struct std_handle *stdOutHdl,
               struct std_handle *stdErrHdl,
               gid_t *childGroup, uid_t *childUser,
               int flags,
               char **failed_doing);

// defined in posix_spawn.c
ProcHandle
do_spawn_posix (char *const args[],
                char *workingDirectory, char **environment,
                struct std_handle *stdInHdl,
                struct std_handle *stdOutHdl,
                struct std_handle *stdErrHdl,
                gid_t *childGroup, uid_t *childUser,
                int flags,
                char **failed_doing);