"ioctl",
"brk",
"sbrk",
- "fork",
+ "_fork",
"mount",
"umount",
"signal",
VARARGS, //ioctl
1, //brk
1, //sbrk
- 0, //fork
+ 2, //_fork
3, //mount
1, //umount
2, //signal
#undef val
/*******************************************
-fork () Function 32
+_fork (flags, addr) Function 32
********************************************/
+#define flags (int16_t)udata.u_argn
+#define addr (uaddr_t)udata.u_argn1
arg_t _fork(void)
{
arg_t r;
irqflags_t irq;
+ if (flags) {
+ /* Brief period of grace... */
+// udata.u_error = EINVAL;
+// return -1;
+ kputs("warning: rebuild libc\n");
+ }
+
new_process = ptab_alloc();
if (!new_process)
return -1;
return r;
}
+#undef flags
/*******************************************
extern int ioctl(int fd, int request,...);
extern int brk(void *addr);
extern void *sbrk(intptr_t increment);
-extern pid_t fork(void);
+extern pid_t _fork(uint16_t flags, void *addr);
extern int mount(const char *dev, const char *path, int flags);
extern int umount(const char *dev);
extern sighandler_t signal(int signum, sighandler_t sighandler);
SRC_C += creat.c crypt.c ctime.c difftime.c err.c errno.c error.c
SRC_C += execl.c execv.c execvp.c exit.c
SRC_C += fclose.c fflush.c fgetc.c fgetgrent.c fgetpwent.c
-SRC_C += fgetpos.c fgets.c fopen.c fprintf.c fputc.c fputs.c fread.c free.c
-SRC_C += fsetpos.c ftell.c fwrite.c getcwd.c
+SRC_C += fgetpos.c fgets.c fopen.c fork.c fprintf.c fputc.c fputs.c fread.c
+SRC_C += free.c fsetpos.c ftell.c fwrite.c getcwd.c
SRC_C += getenv.c __getgrent.c getgrgid.c getgrnam.c getloadavg.c getopt.c
SRC_C += getpw.c __getpwent.c getpwnam.c getpwuid.c gets.c gettimeofday.c
SRC_C += gmtime.c gmtime_r.c grent.c index.c isatty.c killpg.c
# Fix me there pmemalign and a couple of other standard funcs we
# don't have. Calling these will result in a mess but once we've fixed
# our library to cover them it should be fine. There are also some we
-# have through the cc65 lib but need in other ports (strxfrm, strftime,
-# snprintf, vsnprintf etc)
+# have through the cc65 lib but need in other ports (strxfrm, strftime
+# etc)
#
# FIXME:
# Due to ctype differences we can't use the stricmp/strcasecmp and
SRC_C += creat.c crypt.c ctime.c difftime.c err.c errno.c error.c
SRC_C += execl.c execv.c execvp.c exit.c
SRC_C += fclose.c fflush.c fgetc.c fgetgrent.c fgetpwent.c
-SRC_C += fgetpos.c fgets.c fopen.c fprintf.c fputc.c fputs.c fread.c free.c
-SRC_C += fsetpos.c ftell.c fwrite.c getcwd.c
+SRC_C += fgetpos.c fgets.c fopen.c fork.c fprintf.c fputc.c fputs.c fread.c
+SRC_C += free.c fsetpos.c ftell.c fwrite.c getcwd.c
SRC_C += getenv.c __getgrent.c getgrgid.c getgrnam.c getloadavg.c getopt.c
SRC_C += getpw.c __getpwent.c getpwnam.c getpwuid.c gets.c gettimeofday.c
SRC_C += gmtime.c gmtime_r.c grent.c index.c isatty.c killpg.c
SRC_C += creat.c crypt.c ctime.c difftime.c err.c errno.c error.c
SRC_C += execl.c execv.c execvp.c exit.c
SRC_C += fclose.c fflush.c fgetc.c fgetgrent.c fgetpwent.c
-SRC_C += fgetpos.c fgets.c fopen.c fprintf.c fputc.c fputs.c fread.c free.c
-SRC_C += fsetpos.c ftell.c fwrite.c getcwd.c
+SRC_C += fgetpos.c fgets.c fopen.c fork.c fprintf.c fputc.c fputs.c fread.c
+SRC_C += free.c fsetpos.c ftell.c fwrite.c getcwd.c
SRC_C += getenv.c __getgrent.c getgrgid.c getgrnam.c getloadavg.c getopt.c
SRC_C += getpw.c __getpwent.c getpwnam.c getpwuid.c gets.c gettimeofday.c
SRC_C += gmtime.c gmtime_r.c grent.c index.c isatty.c killpg.c
--- /dev/null
+#include <stdio.h>
+#include <unistd.h>
+
+/*
+ * Wrap the kernel _fork() call
+ */
+pid_t fork(void)
+{
+ return _fork(0, NULL);
+}
ASRCS += syscall_ioctl.s
ASRCS += syscall_brk.s
ASRCS += syscall_sbrk.s
-ASRCS += syscall_fork.s
+ASRCS += syscall__fork.s
ASRCS += syscall_mount.s
ASRCS += syscall_umount.s
ASRCS += syscall_signal.s