Implemented _exit().
Added empty implementations of fork() and all the exec*() variants; the latter currently all call execve() and may pass the correct parameters (not tested). git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8339 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
007a64beef
commit
aa1ea490d0
@ -7,7 +7,10 @@ KernelMergeObject posix_unistd.o :
|
|||||||
<$(SOURCE_GRIST)>conf.c
|
<$(SOURCE_GRIST)>conf.c
|
||||||
<$(SOURCE_GRIST)>directory.c
|
<$(SOURCE_GRIST)>directory.c
|
||||||
<$(SOURCE_GRIST)>dup.c
|
<$(SOURCE_GRIST)>dup.c
|
||||||
|
<$(SOURCE_GRIST)>exec.c
|
||||||
|
<$(SOURCE_GRIST)>_exit.c
|
||||||
<$(SOURCE_GRIST)>fcntl.c
|
<$(SOURCE_GRIST)>fcntl.c
|
||||||
|
<$(SOURCE_GRIST)>fork.c
|
||||||
<$(SOURCE_GRIST)>getopt.c
|
<$(SOURCE_GRIST)>getopt.c
|
||||||
<$(SOURCE_GRIST)>hostname.c
|
<$(SOURCE_GRIST)>hostname.c
|
||||||
<$(SOURCE_GRIST)>ioctl.c
|
<$(SOURCE_GRIST)>ioctl.c
|
||||||
|
23
src/kernel/libroot/posix/unistd/_exit.c
Normal file
23
src/kernel/libroot/posix/unistd/_exit.c
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
** Copyright 2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
||||||
|
** Distributed under the terms of the Haiku License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <syscalls.h>
|
||||||
|
|
||||||
|
|
||||||
|
extern void (*_IO_cleanup)(void);
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
_exit(int status)
|
||||||
|
{
|
||||||
|
// close all open files
|
||||||
|
_IO_cleanup();
|
||||||
|
|
||||||
|
// exit with status code
|
||||||
|
_kern_exit(status);
|
||||||
|
}
|
||||||
|
|
154
src/kernel/libroot/posix/unistd/exec.c
Normal file
154
src/kernel/libroot/posix/unistd/exec.c
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
/*
|
||||||
|
** Copyright 2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
||||||
|
** Distributed under the terms of the Haiku License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <syscalls.h>
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <alloca.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
count_arguments(va_list list, const char *arg, char ***_env)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
while (arg != NULL) {
|
||||||
|
count++;
|
||||||
|
arg = va_arg(list, const char *);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_env)
|
||||||
|
*_env = va_arg(list, char **);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
copy_arguments(va_list list, const char **args, const char *arg)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
while (arg != NULL) {
|
||||||
|
arg = va_arg(list, const char *);
|
||||||
|
args[count++] = arg;
|
||||||
|
}
|
||||||
|
|
||||||
|
args[count] = NULL;
|
||||||
|
// terminate list
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
execve(const char *path, char * const argv[], char * const envp[])
|
||||||
|
{
|
||||||
|
// ToDo: implement me for real!
|
||||||
|
fprintf(stderr, "execve(): NOT IMPLEMENTED\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
execv(const char *path, char * const *argv)
|
||||||
|
{
|
||||||
|
return execve(path, argv, environ);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
execvp(const char *file, char * const *argv)
|
||||||
|
{
|
||||||
|
// ToDo: do the "p" thing
|
||||||
|
return execve(file, argv, environ);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
execl(const char *path, const char *arg, ...)
|
||||||
|
{
|
||||||
|
const char **args;
|
||||||
|
va_list list;
|
||||||
|
int count;
|
||||||
|
|
||||||
|
// count arguments
|
||||||
|
|
||||||
|
va_start(list, arg);
|
||||||
|
count = count_arguments(list, arg, NULL);
|
||||||
|
va_end(list);
|
||||||
|
|
||||||
|
// copy arguments
|
||||||
|
|
||||||
|
args = alloca((count + 1) * sizeof(char *));
|
||||||
|
va_start(list, arg);
|
||||||
|
copy_arguments(list, args, arg);
|
||||||
|
va_end(list);
|
||||||
|
|
||||||
|
return execve(path, (char * const *)args, environ);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
execlp(const char *file, const char *arg, ...)
|
||||||
|
{
|
||||||
|
const char **args;
|
||||||
|
va_list list;
|
||||||
|
int count;
|
||||||
|
|
||||||
|
// count arguments
|
||||||
|
|
||||||
|
va_start(list, arg);
|
||||||
|
count = count_arguments(list, arg, NULL);
|
||||||
|
va_end(list);
|
||||||
|
|
||||||
|
// copy arguments
|
||||||
|
|
||||||
|
args = alloca((count + 1) * sizeof(char *));
|
||||||
|
va_start(list, arg);
|
||||||
|
copy_arguments(list, args, arg);
|
||||||
|
va_end(list);
|
||||||
|
|
||||||
|
return execvp(file, (char * const *)args);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
execle(const char *path, const char *arg, ... /*, char **env */)
|
||||||
|
{
|
||||||
|
const char **args;
|
||||||
|
char **env;
|
||||||
|
va_list list;
|
||||||
|
int count;
|
||||||
|
|
||||||
|
// count arguments
|
||||||
|
|
||||||
|
va_start(list, arg);
|
||||||
|
count = count_arguments(list, arg, &env);
|
||||||
|
va_end(list);
|
||||||
|
|
||||||
|
// copy arguments
|
||||||
|
|
||||||
|
args = alloca((count + 1) * sizeof(char *));
|
||||||
|
va_start(list, arg);
|
||||||
|
copy_arguments(list, args, arg);
|
||||||
|
va_end(list);
|
||||||
|
|
||||||
|
return execve(path, (char * const *)args, env);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
exect(const char *path, char * const *argv)
|
||||||
|
{
|
||||||
|
// ToDo: is this any different?
|
||||||
|
return execv(path, argv);
|
||||||
|
}
|
||||||
|
|
22
src/kernel/libroot/posix/unistd/fork.c
Normal file
22
src/kernel/libroot/posix/unistd/fork.c
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
** Copyright 2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
||||||
|
** Distributed under the terms of the Haiku License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <syscalls.h>
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
|
||||||
|
pid_t
|
||||||
|
fork(void)
|
||||||
|
{
|
||||||
|
// ToDo: implement me
|
||||||
|
// ToDo: atfork()
|
||||||
|
fprintf(stderr, "fork(): NOT IMPLEMENTED\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user