diff --git a/libc/include/bits/types/sigset_t.h b/libc/include/bits/types/sigset_t.h new file mode 100644 index 0000000..ff879ef --- /dev/null +++ b/libc/include/bits/types/sigset_t.h @@ -0,0 +1,6 @@ +#ifndef _BITS_TYPES_SIGSET_T_H +#define _BITS_TYPES_SIGSET_T_H + +typedef unsigned long sigset_t; + +#endif // !_BITS_TYPES_SIGSET_T_H diff --git a/libc/include/bits/types/struct_sched_param.h b/libc/include/bits/types/struct_sched_param.h new file mode 100644 index 0000000..810ef88 --- /dev/null +++ b/libc/include/bits/types/struct_sched_param.h @@ -0,0 +1,9 @@ +#ifndef _BITS_TYPES_STRUCT_SCHED_PARAM_T_H +#define _BITS_TYPES_STRUCT_SCHED_PARAM_T_H + +struct sched_param +{ + int sched_priority; +}; + +#endif // !_BITS_TYPES_STRUCT_SCHED_PARAM_T_H diff --git a/libc/include/bits/waitstatus.h b/libc/include/bits/waitstatus.h new file mode 100644 index 0000000..bdec239 --- /dev/null +++ b/libc/include/bits/waitstatus.h @@ -0,0 +1,14 @@ +#ifndef _BITS_WAITSTATUS_H +#define _BITS_WAITSTATUS_H + +#define __W_CONTINUED 0xFFFF + +#define __WEXITSTATUS(status) (((status)&0xFF00) >> 8) +#define __WTERMSIG(status) ((status)&0x7F) +#define __WSTOPSIG(status) __WEXITSTATUS(status) +#define __WIFEXITED(status) (__WTERMSIG(status) == 0) +#define __WIFSIGNALED(status) (((signed char)(((status)&0x7F) + 1) >> 1) > 0) +#define __WIFSTOPPED(status) (((status)&0xFF) == 0x7F) +#define __WIFCONTINUED(status) ((status) == __W_CONTINUED) + +#endif diff --git a/libc/include/errno.h b/libc/include/errno.h index 361f042..4185ae7 100644 --- a/libc/include/errno.h +++ b/libc/include/errno.h @@ -1,40 +1,135 @@ #ifndef _ERRNO_H #define _ERRNO_H -#define EPERM 1 /* Operation not permitted */ -#define ENOENT 2 /* No such file or directory */ -#define ESRCH 3 /* No such process */ -#define EINTR 4 /* Interrupted system call */ -#define EIO 5 /* I/O error */ -#define ENXIO 6 /* No such device or address */ -#define E2BIG 7 /* Argument list too long */ -#define ENOEXEC 8 /* Exec format error */ -#define EBADF 9 /* Bad file number */ -#define ECHILD 10 /* No child processes */ -#define EAGAIN 11 /* Try again */ -#define ENOMEM 12 /* Out of memory */ -#define EACCES 13 /* Permission denied */ -#define EFAULT 14 /* Bad address */ -#define ENOTBLK 15 /* Block device required */ -#define EBUSY 16 /* Device or resource busy */ -#define EEXIST 17 /* File exists */ -#define EXDEV 18 /* Cross-device link */ -#define ENODEV 19 /* No such device */ -#define ENOTDIR 20 /* Not a directory */ -#define EISDIR 21 /* Is a directory */ -#define EINVAL 22 /* Invalid argument */ -#define ENFILE 23 /* File table overflow */ -#define EMFILE 24 /* Too many open files */ -#define ENOTTY 25 /* Not a typewriter */ -#define ETXTBSY 26 /* Text file busy */ -#define EFBIG 27 /* File too large */ -#define ENOSPC 28 /* No space left on device */ -#define ESPIPE 29 /* Illegal seek */ -#define EROFS 30 /* Read-only file system */ -#define EMLINK 31 /* Too many links */ -#define EPIPE 32 /* Broken pipe */ -#define EDOM 33 /* Math argument out of domain of func */ -#define ERANGE 34 /* Math result not representable */ +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Argument list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No child processes */ +#define EAGAIN 11 /* Try again */ +#define ENOMEM 12 /* Out of memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* File table overflow */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Not a typewriter */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Math argument out of domain of func */ +#define ERANGE 34 /* Math result not representable */ +#define EDEADLK 35 /* Resource deadlock would occur */ +#define ENAMETOOLONG 36 /* File name too long */ +#define ENOLCK 37 /* No record locks available */ +#define ENOSYS 38 /* Function not implemented */ +#define ENOTEMPTY 39 /* Directory not empty */ +#define ELOOP 40 /* Too many symbolic links encountered */ +#define ENOMSG 42 /* No message of desired type */ +#define EIDRM 43 /* Identifier removed */ +#define ECHRNG 44 /* Channel number out of range */ +#define EL2NSYNC 45 /* Level 2 not synchronized */ +#define EL3HLT 46 /* Level 3 halted */ +#define EL3RST 47 /* Level 3 reset */ +#define ELNRNG 48 /* Link number out of range */ +#define EUNATCH 49 /* Protocol driver not attached */ +#define ENOCSI 50 /* No CSI structure available */ +#define EL2HLT 51 /* Level 2 halted */ +#define EBADE 52 /* Invalid exchange */ +#define EBADR 53 /* Invalid request descriptor */ +#define EXFULL 54 /* Exchange full */ +#define ENOANO 55 /* No anode */ +#define EBADRQC 56 /* Invalid request code */ +#define EBADSLT 57 /* Invalid slot */ +#define EBFONT 59 /* Bad font file format */ +#define ENOSTR 60 /* Device not a stream */ +#define ENODATA 61 /* No data available */ +#define ETIME 62 /* Timer expired */ +#define ENOSR 63 /* Out of streams resources */ +#define ENONET 64 /* Machine is not on the network */ +#define ENOPKG 65 /* Package not installed */ +#define EREMOTE 66 /* Object is remote */ +#define ENOLINK 67 /* Link has been severed */ +#define EADV 68 /* Advertise error */ +#define ESRMNT 69 /* Srmount error */ +#define ECOMM 70 /* Communication error on send */ +#define EPROTO 71 /* Protocol error */ +#define EMULTIHOP 72 /* Multihop attempted */ +#define EDOTDOT 73 /* RFS specific error */ +#define EBADMSG 74 /* Not a data message */ +#define EOVERFLOW 75 /* Value too large for defined data type */ +#define ENOTUNIQ 76 /* Name not unique on network */ +#define EBADFD 77 /* File descriptor in bad state */ +#define EREMCHG 78 /* Remote address changed */ +#define ELIBACC 79 /* Can not access a needed shared library */ +#define ELIBBAD 80 /* Accessing a corrupted shared library */ +#define ELIBSCN 81 /* .lib section in a.out corrupted */ +#define ELIBMAX 82 /* Attempting to link in too many shared libraries */ +#define ELIBEXEC 83 /* Cannot exec a shared library directly */ +#define EILSEQ 84 /* Illegal byte sequence */ +#define ERESTART 85 /* Interrupted system call should be restarted */ +#define ESTRPIPE 86 /* Streams pipe error */ +#define EUSERS 87 /* Too many users */ +#define ENOTSOCK 88 /* Socket operation on non-socket */ +#define EDESTADDRREQ 89 /* Destination address required */ +#define EMSGSIZE 90 /* Message too long */ +#define EPROTOTYPE 91 /* Protocol wrong type for socket */ +#define ENOPROTOOPT 92 /* Protocol not available */ +#define EPROTONOSUPPORT 93 /* Protocol not supported */ +#define ESOCKTNOSUPPORT 94 /* Socket type not supported */ +#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define EPFNOSUPPORT 96 /* Protocol family not supported */ +#define EAFNOSUPPORT 97 /* Address family not supported by protocol */ +#define EADDRINUSE 98 /* Address already in use */ +#define EADDRNOTAVAIL 99 /* Cannot assign requested address */ +#define ENETDOWN 100 /* Network is down */ +#define ENETUNREACH 101 /* Network is unreachable */ +#define ENETRESET 102 /* Network dropped connection because of reset */ +#define ECONNABORTED 103 /* Software caused connection abort */ +#define ECONNRESET 104 /* Connection reset by peer */ +#define ENOBUFS 105 /* No buffer space available */ +#define EISCONN 106 /* Transport endpoint is already connected */ +#define ENOTCONN 107 /* Transport endpoint is not connected */ +#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ +#define ETOOMANYREFS 109 /* Too many references: cannot splice */ +#define ETIMEDOUT 110 /* Connection timed out */ +#define ECONNREFUSED 111 /* Connection refused */ +#define EHOSTDOWN 112 /* Host is down */ +#define EHOSTUNREACH 113 /* No route to host */ +#define EALREADY 114 /* Operation already in progress */ +#define EINPROGRESS 115 /* Operation now in progress */ +#define ESTALE 116 /* Stale NFS file handle */ +#define EUCLEAN 117 /* Structure needs cleaning */ +#define ENOTNAM 118 /* Not a XENIX named type file */ +#define ENAVAIL 119 /* No XENIX semaphores available */ +#define EISNAM 120 /* Is a named type file */ +#define EREMOTEIO 121 /* Remote I/O error */ +#define EDQUOT 122 /* Quota exceeded */ +#define ENOMEDIUM 123 /* No medium found */ +#define EMEDIUMTYPE 124 /* Wrong medium type */ +#define ECANCELED 125 /* Operation Canceled */ +#define ENOKEY 126 /* Required key not available */ +#define EKEYEXPIRED 127 /* Key has expired */ +#define EKEYREVOKED 128 /* Key has been revoked */ +#define EKEYREJECTED 129 /* Key was rejected by service */ +#define EOWNERDEAD 130 /* Owner died */ +#define ENOTRECOVERABLE 131 /* State not recoverable */ extern int *__errno_location(void) __attribute__((const)); #define errno (*__errno_location()) diff --git a/libc/include/signal.h b/libc/include/signal.h new file mode 100644 index 0000000..9be5e75 --- /dev/null +++ b/libc/include/signal.h @@ -0,0 +1,102 @@ +#ifndef _SIGNAL_H +#define _SIGNAL_H + +#include + +/* https://www-uxsup.csx.cam.ac.uk/courses/moved.Building/signals.pdf */ +/* https://man7.org/linux/man-pages/man7/signal.7.html */ + +/** @brief Hangup detected on controlling or death of controlling process */ +#define SIGHUP 1 + +/** @brief Interrupt from keyboard */ +#define SIGINT 2 + +/** @brief Quit from keyboard */ +#define SIGQUIT 3 + +/** @brief Illegal Instruction */ +#define SIGILL 4 + +/** @brief Trace/breakpoint trap */ +#define SIGTRAP 5 + +/** @brief Abort signal from abort(3) */ +#define SIGABRT 6 + +/** @brief Bus error (bad memory access) */ +#define SIGBUS 7 + +/** @brief Floating point exception */ +#define SIGFPE 8 + +/** @brief Kill signal */ +#define SIGKILL 9 + +/** @brief User-defined signal 1 */ +#define SIGUSR1 10 + +/** @brief Invalid memory reference */ +#define SIGSEGV 11 + +/** @brief User-defined signal 2 */ +#define SIGUSR2 12 + +/** @brief Broken pipe: write to pipe with no readers */ +#define SIGPIPE 13 + +/** @brief Timer signal from alarm(2) */ +#define SIGALRM 14 + +/** @brief Termination signal */ +#define SIGTERM 15 + +/** @brief Stack fault on coprocessor (unused) */ +#define SIGSTKFLT 16 + +/** @brief Child stopped or terminated */ +#define SIGCHLD 17 + +/** @brief Continue if stopped */ +#define SIGCONT 18 + +/** @brief Stop process */ +#define SIGSTOP 19 + +/** @brief Stop typed at terminal */ +#define SIGTSTP 20 + +/** @brief Terminal input for background process */ +#define SIGTTIN 21 + +/** @brief Terminal output for background process */ +#define SIGTTOU 22 + +/** @brief Urgent condition on socket */ +#define SIGURG 23 + +/** @brief CPU time limit exceeded */ +#define SIGXCPU 24 + +/** @brief File size limit exceeded */ +#define SIGXFSZ 25 + +/** @brief Virtual timer expired */ +#define SIGVTALRM 26 + +/** @brief Profiling timer expired */ +#define SIGPROF 27 + +/** @brief Window resize signal */ +#define SIGWINCH 28 + +/** @brief I/O now possible */ +#define SIGIO 29 + +/** @brief Power failure */ +#define SIGPWR 30 + +/** @brief Bad system call */ +#define SIGSYS 31 + +#endif // !_SIGNAL_H diff --git a/libc/include/spawn.h b/libc/include/spawn.h new file mode 100644 index 0000000..047715e --- /dev/null +++ b/libc/include/spawn.h @@ -0,0 +1,45 @@ +#ifndef _SPAWN_H +#define _SPAWN_H + +#include +#include +#include +#include + +struct __spawn_action +{ + int __stub; +}; + +typedef struct +{ + short int __flags; + pid_t __pgrp; + sigset_t __sd; + sigset_t __ss; + struct sched_param __sp; + int __policy; + int __pad[16]; +} posix_spawnattr_t; + +typedef struct +{ + int __allocated; + int __used; + struct __spawn_action *__actions; + int __pad[16]; +} posix_spawn_file_actions_t; + +int posix_spawn(pid_t *pid, const char *path, + const posix_spawn_file_actions_t *file_actions, + const posix_spawnattr_t *attrp, + char *const argv[], + char *const envp[]); + +int posix_spawnp(pid_t *pid, const char *file, + const posix_spawn_file_actions_t *file_actions, + const posix_spawnattr_t *attrp, + char *const argv[], + char *const envp[]); + +#endif // !_SPAWN_H diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index 9c7589c..3875438 100644 --- a/libc/include/stdlib.h +++ b/libc/include/stdlib.h @@ -8,6 +8,9 @@ extern "C" { #endif +#define EXIT_FAILURE 1 +#define EXIT_SUCCESS 0 + void abort(void); int atexit(void (*function)(void)); void exit(int status); @@ -22,6 +25,8 @@ extern "C" double atof(const char *nptr); + extern void perror(const char *__s); + #ifdef __cplusplus } #endif diff --git a/libc/include/sys/time.h b/libc/include/sys/time.h index b24289f..71fa583 100644 --- a/libc/include/sys/time.h +++ b/libc/include/sys/time.h @@ -1,4 +1,6 @@ #ifndef _SYS_TIME_H #define _SYS_TIME_H +#include + #endif diff --git a/libc/include/sys/types.h b/libc/include/sys/types.h index 34c1b65..33c68a6 100644 --- a/libc/include/sys/types.h +++ b/libc/include/sys/types.h @@ -1,6 +1,17 @@ #ifndef _SYS_TYPES_H #define _SYS_TYPES_H -typedef int pid_t; +typedef int __pid_t; +typedef unsigned int __id_t; + +#ifndef __pid_t_defined +typedef __pid_t pid_t; +#define __pid_t_defined +#endif + +#ifndef __id_t_defined +typedef __id_t id_t; +#define __id_t_defined +#endif #endif diff --git a/libc/include/sys/wait.h b/libc/include/sys/wait.h new file mode 100644 index 0000000..7e94a4b --- /dev/null +++ b/libc/include/sys/wait.h @@ -0,0 +1,101 @@ +#ifndef _SYS_WAIT_H +#define _SYS_WAIT_H + +#include + +typedef enum +{ + P_ALL, /* Wait for any child. */ + P_PID, /* Wait for specified process. */ + P_PGID /* Wait for members of process group. */ +} idtype_t; + +typedef struct +{ + int stub; +} siginfo_t; + +#include + +/** + * @brief Macro for extracting the exit status from a status value. + * + * If the child process terminated normally by calling exit(3) or _exit(2), + * the macro WEXITSTATUS() returns the low-order 8 bits of the status value. + * + * @param status The status value to extract the exit status from. + * @return The exit status of the child process. + */ +#define WEXITSTATUS(status) __WEXITSTATUS(status) + +/** + * @brief Macro for extracting the termination signal from a status value. + * + * If the child process was terminated by a signal, the macro WTERMSIG() + * returns the signal number of the terminating signal. + * + * @param status The status value to extract the termination signal from. + * @return The termination signal of the child process. + */ +#define WTERMSIG(status) __WTERMSIG(status) + +/** + * @brief Macro for extracting the stop signal from a status value. + * + * If the child process was stopped by a signal, the macro WSTOPSIG() + * returns the signal number of the stop signal. + * + * @param status The status value to extract the stop signal from. + * @return The stop signal of the child process. + */ +#define WSTOPSIG(status) __WSTOPSIG(status) + +/** + * @brief Macro for testing whether a process exited normally. + * + * If the child process terminated normally by calling exit(3) or _exit(2), + * the macro WIFEXITED() returns a nonzero value. Otherwise, it returns 0. + * + * @param status The status value to test. + * @return A nonzero value if the child process exited normally, 0 otherwise. + */ +#define WIFEXITED(status) __WIFEXITED(status) + +/** + * @brief Macro for testing whether a process was terminated by a signal. + * + * If the child process was terminated by a signal, the macro WIFSIGNALED() + * returns a nonzero value. Otherwise, it returns 0. + * + * @param status The status value to test. + * @return A nonzero value if the child process was terminated by a signal, 0 otherwise. + */ +#define WIFSIGNALED(status) __WIFSIGNALED(status) + +/** + * @brief Macro for testing whether a process was stopped by a signal. + * + * If the child process was stopped by a signal, the macro WIFSTOPPED() + * returns a nonzero value. Otherwise, it returns 0. + * + * @param status The status value to test. + * @return A nonzero value if the child process was stopped by a signal, 0 otherwise. + */ +#define WIFSTOPPED(status) __WIFSTOPPED(status) + +/** + * @brief Macro for testing whether a stopped process was continued. + * + * If the child process was stopped and has been resumed by delivery of SIGCONT, + * the macro WIFCONTINUED() returns a nonzero value. Otherwise, it returns 0. + * + * @param status The status value to test. + * @return A nonzero value if the child process was continued, 0 otherwise. + */ +#define WIFCONTINUED(status) __WIFCONTINUED(status) + +pid_t wait(int *wstatus); +pid_t waitpid(pid_t pid, int *wstatus, int options); +int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options); + +#endif diff --git a/libc/include/unistd.h b/libc/include/unistd.h index 35896ea..93f950a 100644 --- a/libc/include/unistd.h +++ b/libc/include/unistd.h @@ -8,9 +8,16 @@ extern "C" { #endif - int execv(const char *, char *const[]); - int execve(const char *, char *const[], char *const[]); - int execvp(const char *, char *const[]); + extern char **environ; + + int execl(const char *pathname, const char *arg, ...); + int execlp(const char *file, const char *arg, ...); + int execle(const char *pathname, const char *arg, ...); + int execv(const char *pathname, char *const argv[]); + int execvp(const char *file, char *const argv[]); + int execvpe(const char *file, char *const argv[], char *const envp[]); + int execve(const char *pathname, char *const argv[], char *const envp[]); + pid_t fork(void); #ifdef __cplusplus diff --git a/libc/src/InitArray.c b/libc/src/InitArray.c index 3df8b3e..aa23c34 100644 --- a/libc/src/InitArray.c +++ b/libc/src/InitArray.c @@ -5,20 +5,20 @@ // extern void (*__fini_array_start []) (void) __attribute__((weak)); // extern void (*__fini_array_end []) (void) __attribute__((weak)); -typedef void (*CallPtr)(void); -extern CallPtr __init_array_start[0], __init_array_end[0]; -extern CallPtr __fini_array_start[0], __fini_array_end[0]; +typedef void (*fct)(void); +extern fct __init_array_start[0], __init_array_end[0]; +extern fct __fini_array_start[0], __fini_array_end[0]; // TODO: This is not working properly void __libc_init_array(void) { - // for (CallPtr *func = __init_array_start; func != __init_array_end; func++) - // (*func)(); + for (fct *func = __init_array_start; func != __init_array_end; func++) + (*func)(); } void __libc_fini_array(void) { - // for (CallPtr *func = __fini_array_start; func != __fini_array_end; func++) - // (*func)(); + for (fct *func = __fini_array_start; func != __fini_array_end; func++) + (*func)(); } diff --git a/libc/src/std/io/file.c b/libc/src/std/io/file.c index 562618e..ac95aae 100644 --- a/libc/src/std/io/file.c +++ b/libc/src/std/io/file.c @@ -32,7 +32,6 @@ int fseek(FILE *stream, long offset, int whence) stream->offset = offset; break; case SEEK_CUR: - stream->offset += offset; break; case SEEK_END: // stream->offset = syscall1(_FileLength, (uint64_t)File->KernelPrivate) + offset; diff --git a/libc/src/std/io/put.c b/libc/src/std/io/put.c index fb7203c..ad0a900 100644 --- a/libc/src/std/io/put.c +++ b/libc/src/std/io/put.c @@ -28,3 +28,8 @@ int puts(const char *s) for (int i = 0; s[i] != '\0'; i++) fputc(s[i], stdout); } + +void perror(const char *__s) +{ + fputs(__s, stderr); +} diff --git a/libc/src/std/lib.c b/libc/src/std/lib.c index 286a128..668bb20 100644 --- a/libc/src/std/lib.c +++ b/libc/src/std/lib.c @@ -6,19 +6,23 @@ void abort(void) { + __asm__ __volatile__("syscall" + : + : "a"(0), "D"(-0xAB057) + : "rcx", "r11", "memory"); + while (1) ; } int atexit(void (*function)(void)) { - return 0; + return 1; } void exit(int status) { - while (1) - ; + _exit(status); } int atoi(const char *nptr) @@ -64,7 +68,7 @@ void free(void *Address) int system(const char *command) { - return 0; + return -1; } double atof(const char *nptr) diff --git a/libc/src/std/spawn.c b/libc/src/std/spawn.c new file mode 100644 index 0000000..a777340 --- /dev/null +++ b/libc/src/std/spawn.c @@ -0,0 +1,17 @@ +#include + +int posix_spawn(pid_t *pid, const char *path, + const posix_spawn_file_actions_t *file_actions, + const posix_spawnattr_t *attrp, + char *const argv[], + char *const envp[]) +{ +} + +int posix_spawnp(pid_t *pid, const char *file, + const posix_spawn_file_actions_t *file_actions, + const posix_spawnattr_t *attrp, + char *const argv[], + char *const envp[]) +{ +} diff --git a/libc/src/std/sys/wait.c b/libc/src/std/sys/wait.c new file mode 100644 index 0000000..845c709 --- /dev/null +++ b/libc/src/std/sys/wait.c @@ -0,0 +1,14 @@ +#include + +pid_t wait(int *wstatus) +{ + return waitpid(-1, &wstatus, 0); +} + +pid_t waitpid(pid_t pid, int *wstatus, int options) +{ +} + +int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options) +{ +} diff --git a/libc/src/std/uni/exe.c b/libc/src/std/uni/exe.c new file mode 100644 index 0000000..7fd31f5 --- /dev/null +++ b/libc/src/std/uni/exe.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include "../../../Kernel/syscalls.h" + +int execl(const char *pathname, const char *arg, ...) +{ + return -1; +} + +int execlp(const char *file, const char *arg, ...) +{ + return -1; +} + +int execle(const char *pathname, const char *arg, ...) +{ + return -1; +} + +int execv(const char *pathname, char *const argv[]) +{ + return -1; +} + +int execvp(const char *file, char *const argv[]) +{ + return -1; +} + +int execvpe(const char *file, char *const argv[], char *const envp[]) +{ + return -1; +} + +int execve(const char *pathname, char *const argv[], char *const envp[]) +{ + return -1; +} + +pid_t fork(void) +{ + return syscall0(_Fork); +}