Fix a const-related compiler warning produced by the "execve" wrapper. Move network related wrappers to separate files, for SOCKS support. Fix some things so that it will compile under FreeBSD-3.0. Add missing wrappers for various system calls. Fix numerous argument declarations to agree with their prototypes. Fix the wrapper for ftruncate so that it deals properly with the 64-bit arguments. --- m3/m3core/src/runtime/FreeBSD2/RTHeapDepC.c.orig Sat Mar 23 14:52:21 1996 +++ m3/m3core/src/runtime/FreeBSD2/RTHeapDepC.c Sun Mar 14 05:43:53 1999 @@ -80,7 +80,8 @@ #include #include #if __FreeBSD__ >= 2 -# include +#include +#include #endif #include #include @@ -89,9 +90,21 @@ #include #include #include +#include #include #include +#if __FreeBSD__ >= 3 +#include +#include +#include +#include +#include +#endif + +#include +#include + #ifdef NULL #undef NULL #endif @@ -110,22 +123,8 @@ /* Unless otherwise noted, all the following wrappers have the same structure. */ -int accept(s, addr, addrlen) /* ok */ -int s; -struct sockaddr *addr; -int *addrlen; -{ int result; - - ENTER_CRITICAL; - MAKE_WRITABLE(addr); - MAKE_WRITABLE(addrlen); - result = syscall(SYS_accept, s, addr, addrlen); - EXIT_CRITICAL; - return result; -} - int access(path, mode) /* ok */ -char *path; +const char *path; int mode; { int result; @@ -137,7 +136,7 @@ } int acct(file) /* ok */ -char *file; +const char *file; { int result; ENTER_CRITICAL; @@ -228,19 +227,6 @@ } */ -int bind(s, name, namelen) /* ok */ -int s; -const struct sockaddr *name; -int namelen; -{ int result; - - ENTER_CRITICAL; - MAKE_READABLE(name); - result = syscall(SYS_bind, s, name, namelen); - EXIT_CRITICAL; - return result; -} - /* not implemented int cachectl(addr, nbytes, op) char *addr; @@ -268,7 +254,7 @@ */ int chdir(path) /* ok */ -char *path; +const char *path; { int result; ENTER_CRITICAL; @@ -278,8 +264,20 @@ return result; } +int chflags(path, flags) +const char *path; +u_long flags; +{ int result; + + ENTER_CRITICAL; + MAKE_READABLE(path); + result = syscall(SYS_chflags, path, flags); + EXIT_CRITICAL; + return result; +} + int chmod(path, mode) /* ok */ -char *path; +const char *path; mode_t mode; { int result; @@ -291,7 +289,7 @@ } int chown(path, owner, group) /* ok */ -char *path; +const char *path; uid_t owner; gid_t group; { int result; @@ -304,7 +302,7 @@ } int chroot(dirname) /* ok */ -char *dirname; +const char *dirname; { int result; ENTER_CRITICAL; @@ -314,19 +312,6 @@ return result; } -int connect(s, name, namelen) /* ok */ -int s; -const struct sockaddr *name; -int namelen; -{ int result; - - ENTER_CRITICAL; - MAKE_READABLE(name); - result = syscall(SYS_connect, s, name, namelen); - EXIT_CRITICAL; - return result; -} - /* not implemented (obsolete) int creat(name, mode) const char *name; @@ -356,8 +341,8 @@ result = syscall(SYS_execve, name, argv, envp); if (result == -1 && errno == EFAULT) { MAKE_READABLE(name); - { char **a; for (a = argv; *a; a++) MAKE_READABLE(*a); } - { char **e; for (e = envp; *e; e++) MAKE_READABLE(*e); } + { char * const *a; for (a = argv; *a; a++) MAKE_READABLE(*a); } + { char * const *e; for (e = envp; *e; e++) MAKE_READABLE(*e); } } else { return result; } @@ -473,7 +458,7 @@ int getgroups(gidsetsize, grouplist) /* ok */ int gidsetsize; -int grouplist[]; +gid_t grouplist[]; { int result; ENTER_CRITICAL; @@ -513,20 +498,6 @@ } */ -int getpeername(s, name, namelen) /* ok */ -int s; -struct sockaddr *name; -int *namelen; -{ int result; - - ENTER_CRITICAL; - MAKE_WRITABLE(name); - MAKE_WRITABLE(namelen); - result = syscall(SYS_getpeername, s, name, namelen); - EXIT_CRITICAL; - return result; -} - int getrlimit(resource, rlp) /* ok */ int resource; struct rlimit *rlp; @@ -551,20 +522,6 @@ return result; } -int getsockname(s, name, namelen) /* ok */ -int s; -struct sockaddr *name; -int *namelen; -{ int result; - - ENTER_CRITICAL; - MAKE_WRITABLE(name); - MAKE_WRITABLE(namelen); - result = syscall(SYS_getsockname, s, name, namelen); - EXIT_CRITICAL; - return result; -} - int getsockopt(s, level, optname, optval, optlen) /* ok */ int s, level, optname; void *optval; @@ -629,9 +586,24 @@ return result; } +#ifdef SYS_lchown +int lchown(path, owner, group) /* ok */ +const char *path; +uid_t owner; +gid_t group; +{ int result; + + ENTER_CRITICAL; + MAKE_READABLE(path); + result = syscall(SYS_lchown, path, owner, group); + EXIT_CRITICAL; + return result; +} +#endif /* SYS_lchown */ + int link(name1, name2) /* ok */ -char *name1; -char *name2; +const char *name1; +const char *name2; { int result; ENTER_CRITICAL; @@ -643,7 +615,7 @@ } int lstat(path, buf) /* ok */ -char *path; +const char *path; struct stat *buf; { int result; @@ -656,7 +628,7 @@ } int mkdir(path, mode) /* ok */ -char *path; +const char *path; mode_t mode; { int result; @@ -667,8 +639,20 @@ return result; } +int mkfifo(path, mode) /* ok */ +const char *path; +mode_t mode; +{ int result; + + ENTER_CRITICAL; + MAKE_READABLE(path); + result = syscall(SYS_mkfifo, path, mode); + EXIT_CRITICAL; + return result; +} + int mknod(path, mode, dev) /* ok */ -char *path; +const char *path; mode_t mode; dev_t dev; { int result; @@ -680,13 +664,51 @@ return result; } -/* quite different ... -int mount(special, name, rwflag, type, options) -char *special; -char *name; -int rwflag, type; -char *options; -*/ +#if __FreeBSD_version >= 300001 /* New form of mount(2) */ +int +mount(type, dir, flags, data) + const char *type; + const char *dir; + int flags; + void *data; +{ int result; + struct ufs_args *u_data; + struct mfs_args *m_data; + struct nfs_args *n_data; + + ENTER_CRITICAL; + MAKE_READABLE(type); + MAKE_READABLE(dir); + if (strcmp(type, "ufs") == 0) { + u_data = (struct ufs_args*) data; + MAKE_READABLE(u_data); + MAKE_READABLE(u_data->fspec); + result = syscall(SYS_mount, type, dir, flags, data); + } else if (strcmp(type, "mfs") == 0) { + m_data = (struct mfs_args*) data; + MAKE_READABLE(m_data); + MAKE_READABLE(m_data->fspec); + result = syscall(SYS_mount, type, dir, flags, data); + } else if (strcmp(type, "nfs") == 0) { + n_data = (struct nfs_args*) data; + MAKE_READABLE(n_data); + MAKE_READABLE(n_data->addr); + MAKE_READABLE(n_data->fh); + MAKE_READABLE(n_data->hostname); + result = syscall(SYS_mount, type, dir, flags, data); + } else { /* Not anything we recognize. */ + MAKE_READABLE(data); + result = syscall(SYS_mount, type, dir, flags, data); + } + EXIT_CRITICAL; + if (result != -1) { + result = 0; + } + return result; +} + +#else /* __FreeBSD_version >= 300001 */ + int mount(type, dir, flags, data) int type; const char *dir; @@ -723,6 +745,7 @@ } return result; } +#endif /* __FreeBSD_version >= 300001 */ int msgctl(msqid, cmd, buf) /* ok */ int msqid, cmd; @@ -793,9 +816,13 @@ } int quotactl(path, cmd, uid, addr) /* ok */ -const char *path; -int cmd, uid; -char *addr; + const char *path; + int cmd, uid; +#if __FreeBSD_version >= 400002 + void *addr; +#else + char *addr; +#endif { int result; ENTER_CRITICAL; @@ -821,21 +848,8 @@ return result; } -int read(d, buf, nbytes) /* ok */ -int d; -char *buf; -size_t nbytes; -{ int result; - - ENTER_CRITICAL; - MAKE_WRITABLE(buf); - result = syscall(SYS_read, d, buf, nbytes); - EXIT_CRITICAL; - return result; -} - int readlink(path, buf, bufsiz) /* ok */ -char *path; +const char *path; char *buf; int bufsiz; { int result; @@ -865,46 +879,6 @@ return result; } -int recv(s, buf, len, flags) /* ok */ -int s; -void *buf; -#if __FreeBSD__ >=2 -size_t len; -#else -int len; -#endif -int flags; -{ int result; - - ENTER_CRITICAL; - MAKE_WRITABLE(buf); - result = syscall(SYS_recvfrom, s, buf, len, flags, NULL, 0); - EXIT_CRITICAL; - return result; -} - -int recvfrom(s, buf, len, flags, from, fromlen) /* ok */ -int s; -void *buf; -#if __FreeBSD__ >=2 -size_t len; -#else -int len; -#endif -int flags; -struct sockaddr *from; -int *fromlen; -{ int result; - - ENTER_CRITICAL; - MAKE_WRITABLE(buf); - MAKE_WRITABLE(from); - MAKE_WRITABLE(fromlen); - result = syscall(SYS_recvfrom, s, buf, len, flags, from, fromlen); - EXIT_CRITICAL; - return result; -} - int recvmsg(s, msg, flags) /* ok */ int s; struct msghdr msg[]; @@ -940,7 +914,7 @@ } int rmdir(path) /* ok */ -char *path; +const char *path; { int result; ENTER_CRITICAL; @@ -950,44 +924,42 @@ return result; } -int select(nfds, readfds, writefds, exceptfds, timeout) /* ok */ -int nfds; -fd_set *readfds; -fd_set *writefds; -fd_set *exceptfds; -struct timeval *timeout; -{ int result; - - ENTER_CRITICAL; - MAKE_WRITABLE(readfds); - MAKE_WRITABLE(writefds); - MAKE_WRITABLE(exceptfds); - MAKE_READABLE(timeout); - result = syscall(SYS_select, nfds, readfds, writefds, exceptfds, timeout); - EXIT_CRITICAL; - return result; -} +int +#if (227002 <= __FreeBSD_version && __FreeBSD_version < 300000) || \ + __FreeBSD_version >= 300002 +semctl(int semid, int semnum, int cmd, ...) +#else +semctl(int semid, int semnum, int cmd, union semun arg) +#endif +{ + int result; +#if (227002 <= __FreeBSD_version && __FreeBSD_version < 300000) || \ + __FreeBSD_version >= 300002 + union semun arg; + va_list ap; -int semctl(semid, semnum, cmd, arg) /* ok ? */ -int semid, cmd; -int semnum; -union semun arg; -{ int result; + va_start(ap, cmd); + arg = va_arg(ap, union semun); + va_end(ap); +#endif ENTER_CRITICAL; switch (cmd) { - case GETNCNT: - case GETPID: - case GETVAL: - case GETALL: - case GETZCNT: + + case IPC_SET: MAKE_READABLE(arg.buf); break; + case SETALL: - case SETVAL: + MAKE_READABLE(arg.array); + break; + + case IPC_STAT: MAKE_WRITABLE(arg.buf); break; - default: + + case GETALL: + MAKE_WRITABLE(arg.array); break; } result = syscall(SYS_semsys, 0, semid, semnum, cmd, arg); @@ -1012,24 +984,6 @@ return result; } -int send(s, msg, len, flags) /* ok */ -int s; -const void *msg; -#if __FreeBSD__ >=2 -size_t len; -#else -int len; -#endif -int flags; -{ int result; - - ENTER_CRITICAL; - MAKE_READABLE(msg); - result = syscall(SYS_sendto, s, msg, len, flags, NULL, 0); - EXIT_CRITICAL; - return result; -} - int sendmsg(s, msg, flags) /* ok */ int s; const struct msghdr msg[]; @@ -1051,29 +1005,8 @@ return result; } -int sendto(s, msg, len, flags, to, tolen) /* ok */ -int s; -const void *msg; -#if __FreeBSD__ >=2 -size_t len; -#else -int len; -#endif -int flags; -const struct sockaddr *to; -int tolen; -{ int result; - - ENTER_CRITICAL; - MAKE_READABLE(msg); - MAKE_READABLE(to); - result = syscall(SYS_sendto, s, msg, len, flags, to, tolen); - EXIT_CRITICAL; - return result; -} - int setdomainname(name, namelen) /* ok */ -char *name; +const char *name; int namelen; { int result; @@ -1086,7 +1019,7 @@ int setgroups(ngroups, gidset) /* ok */ int ngroups; -int *gidset; +const gid_t *gidset; { int result; ENTER_CRITICAL; @@ -1097,7 +1030,7 @@ } int sethostname(name, namelen) /* ok */ -char *name; +const char *name; int namelen; { int result; #if __FreeBSD__ >= 2 @@ -1213,20 +1146,20 @@ return result; } -/* not implemented -int sigpending(set) -sigset_t *set; +int sigaction(sig, act, oact) +int sig; +const struct sigaction *act; +struct sigaction *oact; { int result; ENTER_CRITICAL; - MAKE_WRITABLE(set); - result = syscall(SYS_sigpending, set); + MAKE_READABLE(act); + MAKE_WRITABLE(oact); + result = syscall(SYS_sigaction, sig, act, oact); EXIT_CRITICAL; return result; } -*/ -#if __FreeBSD__ >= 2 int sigaltstack(ss, oss) /* ok */ const struct sigaltstack *ss; struct sigaltstack *oss; @@ -1239,20 +1172,6 @@ EXIT_CRITICAL; return result; } -#else -int sigstack(ss, oss) /* ok */ -const struct sigstack *ss; -struct sigstack *oss; -{ int result; - - ENTER_CRITICAL; - MAKE_READABLE(ss); - MAKE_WRITABLE(oss); - result = syscall(SYS_sigstack, ss, oss); - EXIT_CRITICAL; - return result; -} -#endif int socketpair(d, type, protocol, sv) /* ok */ int d, type, protocol; @@ -1267,7 +1186,7 @@ } int stat(path, buf) /* ok */ -char *path; +const char *path; struct stat *buf; { int result; @@ -1280,7 +1199,7 @@ } int swapon(special) /* ok */ -char *special; +const char *special; { int result; ENTER_CRITICAL; @@ -1291,8 +1210,8 @@ } int symlink(name1, name2) /* ok */ -char *name1; -char *name2; +const char *name1; +const char *name2; { int result; ENTER_CRITICAL; @@ -1304,14 +1223,14 @@ } int truncate(path, length) /* ok */ -char *path; -long length; +const char *path; +off_t length; { int result; - off_t len = (off_t)length; ENTER_CRITICAL; MAKE_READABLE(path); - result = syscall(SYS_truncate, path, len); + /* The casts below pad "path" out to a 64-bit value as required. */ + result = __syscall(SYS_truncate, (u_quad_t) (u_int) path, length); EXIT_CRITICAL; return result; } @@ -1328,7 +1247,7 @@ } int unlink(path) /* ok */ -char *path; +const char *path; { int result; ENTER_CRITICAL; @@ -1414,19 +1333,6 @@ ENTER_CRITICAL; MAKE_WRITABLE(status); result = syscall(SYS_wait4, pid, status, options, NULL); - EXIT_CRITICAL; - return result; -} - -int write(fd, buf, nbytes) /* ok */ -int fd; -char *buf; -int nbytes; -{ int result; - - ENTER_CRITICAL; - MAKE_READABLE(buf); - result = syscall(SYS_write, fd, buf, nbytes); EXIT_CRITICAL; return result; }