212 lines
9.6 KiB
C
212 lines
9.6 KiB
C
/*
|
|
* System call switch table.
|
|
*
|
|
* Copyright (c) 1986 Regents of the University of California.
|
|
* All rights reserved. The Berkeley software License Agreement
|
|
* specifies the terms and conditions for redistribution.
|
|
*/
|
|
#include <sys/param.h>
|
|
#include <sys/systm.h>
|
|
#include <sys/glob.h>
|
|
|
|
#ifdef INET
|
|
# define ifnet(narg, name) narg, name
|
|
# define errnet(narg, name) narg, name
|
|
#else
|
|
# define ifnet(narg, name) 0, nosys
|
|
# define errnet(narg, name) 0, nonet
|
|
#endif
|
|
|
|
extern void sc_msec();
|
|
|
|
/*
|
|
* Reserved/unimplemented system calls in the range 0-150 inclusive
|
|
* are reserved for use in future Berkeley releases.
|
|
* Additional system calls implemented in vendor and other
|
|
* redistributions should be placed in the reserved range at the end
|
|
* of the current calls.
|
|
*/
|
|
/*
|
|
* This table is the switch used to transfer to the appropriate routine for
|
|
* processing a system call. Each row contains the number of words of
|
|
* arguments expected in registers, how many on the stack, and a pointer to
|
|
* the routine.
|
|
*
|
|
* The maximum number of direct system calls is 255 since system call numbers
|
|
* are encoded in the lower byte of the trap instruction -- see trap.c.
|
|
*/
|
|
const struct sysent sysent[] = {
|
|
{ 1, nosys }, /* 0 = out-of-range */
|
|
{ 1, rexit }, /* 1 = exit */
|
|
{ 0, fork }, /* 2 = fork */
|
|
{ 3, read }, /* 3 = read */
|
|
{ 3, write }, /* 4 = write */
|
|
{ 3, open }, /* 5 = open */
|
|
{ 1, close }, /* 6 = close */
|
|
{ 4, wait4 }, /* 7 = wait4 */
|
|
{ 0, nosys }, /* 8 = (old creat) */
|
|
{ 2, link }, /* 9 = link */
|
|
{ 1, unlink }, /* 10 = unlink */
|
|
{ 2, execv }, /* 11 = execv */
|
|
{ 1, chdir }, /* 12 = chdir */
|
|
{ 1, fchdir }, /* 13 = fchdir */
|
|
{ 3, mknod }, /* 14 = mknod */
|
|
{ 2, chmod }, /* 15 = chmod */
|
|
{ 3, chown }, /* 16 = chown; now 3 args */
|
|
{ 2, chflags }, /* 17 = chflags */
|
|
{ 2, fchflags }, /* 18 = fchflags */
|
|
{ 4, lseek }, /* 19 = lseek */
|
|
{ 0, getpid }, /* 20 = getpid */
|
|
{ 3, smount }, /* 21 = mount */
|
|
{ 1, umount }, /* 22 = umount */
|
|
{ 6, __sysctl }, /* 23 = __sysctl */
|
|
{ 0, getuid }, /* 24 = getuid */
|
|
{ 0, geteuid }, /* 25 = geteuid */
|
|
{ 4, ptrace }, /* 26 = ptrace */
|
|
{ 0, getppid }, /* 27 = getppid */
|
|
{ 2, statfs }, /* 28 = statfs */
|
|
{ 2, fstatfs }, /* 29 = fstatfs */
|
|
{ 3, getfsstat }, /* 30 = getfsstat */
|
|
{ 4, sigaction }, /* 31 = sigaction */
|
|
{ 3, sigprocmask }, /* 32 = sigprocmask */
|
|
{ 2, saccess }, /* 33 = access */
|
|
{ 1, sigpending }, /* 34 = sigpending */
|
|
{ 2, sigaltstack }, /* 35 = sigaltstack */
|
|
{ 0, sync }, /* 36 = sync */
|
|
{ 2, kill }, /* 37 = kill */
|
|
{ 2, stat }, /* 38 = stat */
|
|
{ 2, nosys }, /* 39 = getlogin */
|
|
{ 2, lstat }, /* 40 = lstat */
|
|
{ 1, dup }, /* 41 = dup */
|
|
{ 0, pipe }, /* 42 = pipe */
|
|
{ 1, nosys }, /* 43 = setlogin */
|
|
{ 4, profil }, /* 44 = profil */
|
|
{ 1, setuid }, /* 45 = setuid */
|
|
{ 1, seteuid }, /* 46 = seteuid */
|
|
{ 0, getgid }, /* 47 = getgid */
|
|
{ 0, getegid }, /* 48 = getegid */
|
|
{ 1, setgid }, /* 49 = setgid */
|
|
{ 1, setegid }, /* 50 = setegid */
|
|
{ 0, kmemdev }, /* 51 = kmemdev */
|
|
{ 3, nosys }, /* 52 = (2.9) set phys addr */
|
|
{ 1, nosys }, /* 53 = (2.9) lock in core */
|
|
{ 4, ioctl }, /* 54 = ioctl */
|
|
{ 1, reboot }, /* 55 = reboot */
|
|
{ 2, sigwait }, /* 56 = sigwait */
|
|
{ 2, symlink }, /* 57 = symlink */
|
|
{ 3, readlink }, /* 58 = readlink */
|
|
{ 3, execve }, /* 59 = execve */
|
|
{ 1, umask }, /* 60 = umask */
|
|
{ 1, chroot }, /* 61 = chroot */
|
|
{ 2, fstat }, /* 62 = fstat */
|
|
{ 0, nosys }, /* 63 = reserved */
|
|
{ 0, nosys }, /* 64 = (old getpagesize) */
|
|
{ 6, pselect }, /* 65 = pselect */
|
|
{ 0, vfork }, /* 66 = vfork */
|
|
{ 0, nosys }, /* 67 = unused */
|
|
{ 0, nosys }, /* 68 = unused */
|
|
{ 1, brk }, /* 69 = brk */
|
|
#ifdef GLOB_ENABLED
|
|
{ 1, rdglob }, /* 70 = read from global */
|
|
{ 2, wrglob }, /* 71 = write to global */
|
|
#else
|
|
{ 1, nosys },
|
|
{ 2, nosys },
|
|
#endif
|
|
{ 0, sc_msec }, /* 72 = msec */
|
|
{ 0, nosys }, /* 73 = unused */
|
|
{ 0, nosys }, /* 74 = unused */
|
|
{ 0, nosys }, /* 75 = unused */
|
|
{ 0, vhangup }, /* 76 = vhangup */
|
|
{ 0, nosys }, /* 77 = unused */
|
|
{ 0, nosys }, /* 78 = unused */
|
|
{ 2, getgroups }, /* 79 = getgroups */
|
|
{ 2, setgroups }, /* 80 = setgroups */
|
|
{ 1, getpgrp }, /* 81 = getpgrp */
|
|
{ 2, setpgrp }, /* 82 = setpgrp */
|
|
{ 3, setitimer }, /* 83 = setitimer */
|
|
{ 0, nosys }, /* 84 = (old wait,wait3) */
|
|
{ 0, nosys }, /* 85 = unused */
|
|
{ 2, getitimer }, /* 86 = getitimer */
|
|
{ 0, nosys }, /* 87 = (old gethostname) */
|
|
{ 0, nosys }, /* 88 = (old sethostname) */
|
|
{ 0, getdtablesize }, /* 89 = getdtablesize */
|
|
{ 2, dup2 }, /* 90 = dup2 */
|
|
{ 0, nosys }, /* 91 = unused */
|
|
{ 3, fcntl }, /* 92 = fcntl */
|
|
{ 5, select }, /* 93 = select */
|
|
{ 0, nosys }, /* 94 = unused */
|
|
{ 1, fsync }, /* 95 = fsync */
|
|
{ 3, setpriority }, /* 96 = setpriority */
|
|
{ errnet(3, socket) }, /* 97 = socket */
|
|
{ ifnet(3, connect) }, /* 98 = connect */
|
|
{ ifnet(3, accept) }, /* 99 = accept */
|
|
{ 2, getpriority }, /* 100 = getpriority */
|
|
{ ifnet(4, send) }, /* 101 = send */
|
|
{ ifnet(4, recv) }, /* 102 = recv */
|
|
{ 1, sigreturn }, /* 103 = sigreturn */
|
|
{ ifnet(3, bind) }, /* 104 = bind */
|
|
{ ifnet(5, setsockopt) }, /* 105 = setsockopt */
|
|
{ ifnet(2, listen) }, /* 106 = listen */
|
|
{ 1, sigsuspend }, /* 107 = sigsuspend */
|
|
{ 0, nosys }, /* 108 = (old sigvec) */
|
|
{ 0, nosys }, /* 109 = (old sigblock) */
|
|
{ 0, nosys }, /* 110 = (old sigsetmask) */
|
|
{ 0, nosys }, /* 111 = (old sigpause) */
|
|
{ 2, sigstack }, /* 112 = sigstack COMPAT-43 */
|
|
{ ifnet(3, recvmsg) }, /* 113 = recvmsg */
|
|
{ ifnet(3, sendmsg) }, /* 114 = sendmsg */
|
|
{ 0, nosys }, /* 115 = unused */
|
|
{ 2, gettimeofday }, /* 116 = gettimeofday */
|
|
{ 2, getrusage }, /* 117 = getrusage */
|
|
{ ifnet(5, getsockopt) }, /* 118 = getsockopt */
|
|
{ 0, nosys }, /* 119 = unused */
|
|
{ 3, readv }, /* 120 = readv */
|
|
{ 3, writev }, /* 121 = writev */
|
|
{ 2, settimeofday }, /* 122 = settimeofday */
|
|
{ 3, fchown }, /* 123 = fchown */
|
|
{ 2, fchmod }, /* 124 = fchmod */
|
|
{ ifnet(6, recvfrom) }, /* 125 = recvfrom */
|
|
{ 0, nosys }, /* 126 = (old setreuid) */
|
|
{ 0, nosys }, /* 127 = (old setregid) */
|
|
{ 2, rename }, /* 128 = rename */
|
|
{ 3, truncate }, /* 129 = truncate */
|
|
{ 3, ftruncate }, /* 130 = ftruncate */
|
|
{ 2, flock }, /* 131 = flock */
|
|
{ 0, nosys }, /* 132 = nosys */
|
|
{ ifnet(6, sendto) }, /* 133 = sendto */
|
|
{ ifnet(2, shutdown) }, /* 134 = shutdown */
|
|
{ errnet(4, socketpair) }, /* 135 = socketpair */
|
|
{ 2, mkdir }, /* 136 = mkdir */
|
|
{ 1, rmdir }, /* 137 = rmdir */
|
|
{ 2, utimes }, /* 138 = utimes */
|
|
{ 0, nosys }, /* 139 = unused */
|
|
{ 2, adjtime }, /* 140 = adjtime */
|
|
{ ifnet(3, getpeername) }, /* 141 = getpeername */
|
|
{ 0, nosys }, /* 142 = (old gethostid) */
|
|
{ 0, nosys }, /* 143 = (old sethostid) */
|
|
{ 2, getrlimit }, /* 144 = getrlimit */
|
|
{ 2, setrlimit }, /* 145 = setrlimit */
|
|
{ 2, killpg }, /* 146 = killpg */
|
|
{ 0, nosys }, /* 147 = nosys */
|
|
{ 2, nosys }, /* 148 = quota */
|
|
{ 4, nosys }, /* 149 = qquota */
|
|
{ ifnet(3, getsockname) }, /* 150 = getsockname */
|
|
/*
|
|
* Syscalls 151-180 inclusive are reserved for vendor-specific
|
|
* system calls. (This includes various calls added for compatibity
|
|
* with other Unix variants.)
|
|
*/
|
|
|
|
/*
|
|
* 2BSD special calls
|
|
*/
|
|
{ 0, nosys }, /* 151 = unused */
|
|
{ 2, ustore }, /* 152 = ustore */
|
|
{ 1, ufetch }, /* 153 = ufetch */
|
|
{ 4, ucall }, /* 154 = ucall */
|
|
{ 0, nosys }, /* 155 = fperr */
|
|
};
|
|
|
|
const int nsysent = sizeof (sysent) / sizeof (sysent[0]);
|