libc: initial implementation of posix_spawn
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
#include <errno.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#define LD_EXTERN extern __attribute__((weak))
|
||||
LD_EXTERN int ld_execl(const char *path, const char *arg1, va_list arg);
|
||||
LD_EXTERN int ld_execlp(const char *file, const char *arg1, va_list arg);
|
||||
LD_EXTERN int ld_execle(const char *path, const char *arg1, va_list arg);
|
||||
LD_EXTERN int ld_execv(const char *path, char *const argv[]);
|
||||
LD_EXTERN int ld_execvp(const char *file, char *const argv[]);
|
||||
LD_EXTERN int ld_execvpe(
|
||||
const char *file,
|
||||
char *const argv[],
|
||||
char *const envp[]);
|
||||
|
||||
int execl(const char *path, const char *arg, ...)
|
||||
{
|
||||
va_list arglist;
|
||||
va_start(arglist, arg);
|
||||
int err = ld_execl(path, arg, arglist);
|
||||
va_end(arglist);
|
||||
|
||||
if (err < 0) {
|
||||
return __set_errno(-err);
|
||||
}
|
||||
|
||||
/* this shouldn't happen */
|
||||
return __set_errno(ENOEXEC);
|
||||
}
|
||||
|
||||
int execlp(const char *file, const char *arg, ...)
|
||||
{
|
||||
va_list arglist;
|
||||
va_start(arglist, arg);
|
||||
int err = ld_execlp(file, arg, arglist);
|
||||
va_end(arglist);
|
||||
|
||||
if (err < 0) {
|
||||
return __set_errno(-err);
|
||||
}
|
||||
|
||||
/* this shouldn't happen */
|
||||
return __set_errno(ENOEXEC);
|
||||
}
|
||||
|
||||
int execle(const char *path, const char *arg, ...)
|
||||
{
|
||||
va_list arglist;
|
||||
va_start(arglist, arg);
|
||||
int err = ld_execle(path, arg, arglist);
|
||||
va_end(arglist);
|
||||
|
||||
if (err < 0) {
|
||||
return __set_errno(-err);
|
||||
}
|
||||
|
||||
/* this shouldn't happen */
|
||||
return __set_errno(ENOEXEC);
|
||||
}
|
||||
|
||||
int execv(const char *path, char *const argv[])
|
||||
{
|
||||
int err = ld_execv(path, argv);
|
||||
|
||||
if (err < 0) {
|
||||
return __set_errno(-err);
|
||||
}
|
||||
|
||||
/* this shouldn't happen */
|
||||
return __set_errno(ENOEXEC);
|
||||
}
|
||||
|
||||
int execvp(const char *file, char *const argv[])
|
||||
{
|
||||
int err = ld_execvp(file, argv);
|
||||
|
||||
if (err < 0) {
|
||||
return __set_errno(-err);
|
||||
}
|
||||
|
||||
/* this shouldn't happen */
|
||||
return __set_errno(ENOEXEC);
|
||||
}
|
||||
|
||||
int execvpe(const char *file, char *const argv[], char *const envp[])
|
||||
{
|
||||
int err = ld_execvpe(file, argv, envp);
|
||||
|
||||
if (err < 0) {
|
||||
return __set_errno(-err);
|
||||
}
|
||||
|
||||
/* this shouldn't happen */
|
||||
return __set_errno(ENOEXEC);
|
||||
}
|
||||
Reference in New Issue
Block a user