--- m3/m3core/src/runtime/FreeBSD2/RTHeapDepC.c.orig	Sat Mar 23 14:52:21 1996
+++ m3/m3core/src/runtime/FreeBSD2/RTHeapDepC.c	Wed Dec 22 22:43:12 1999
@@ -80,7 +80,8 @@
 #include <sys/file.h>
 #include <sys/param.h>
 #if __FreeBSD__ >= 2
-# include <sys/sysctl.h>
+#include <sys/sysctl.h>
+#include <osreldate.h>
 #endif
 #include <sys/mount.h>
 #include <sys/ipc.h>
@@ -89,9 +90,27 @@
 #include <ufs/ufs/quota.h>
 #include <sys/signal.h>
 #include <sys/socket.h>
+#include <sys/stat.h>
 #include <sys/uio.h>
 #include <sys/wait.h>
 
+#if __FreeBSD__ >= 3
+#include <sys/time.h>
+#include <nfs/rpcv2.h>
+#include <nfs/nfsproto.h>
+#include <nfs/nfs.h>
+#include <ufs/ufs/ufsmount.h>
+#endif
+
+#include <string.h>
+#include <unistd.h>
+
+#if __FreeBSD_version >= 400013
+#define SOCKLEN_T	socklen_t
+#else
+#define SOCKLEN_T	int
+#endif
+
 #ifdef   NULL
 #undef   NULL
 #endif
@@ -110,22 +129,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 +142,7 @@
 }
 
 int acct(file)   /* ok */
-char *file;
+const char *file;
 { int result;
 
   ENTER_CRITICAL;
@@ -228,19 +233,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 +260,7 @@
 */
 
 int chdir(path)   /* ok */
-char *path;
+const char *path;
 { int result;
 
   ENTER_CRITICAL;
@@ -278,8 +270,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 +295,7 @@
 }
 
 int chown(path, owner, group)   /* ok */
-char *path;
+const char *path;
 uid_t owner;
 gid_t group;
 { int result;
@@ -304,7 +308,7 @@
 }
 
 int chroot(dirname)   /* ok */
-char *dirname;
+const char *dirname;
 { int result;
 
   ENTER_CRITICAL;
@@ -314,19 +318,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 +347,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 +464,7 @@
 
 int getgroups(gidsetsize, grouplist)   /* ok */
 int gidsetsize;
-int grouplist[];
+gid_t grouplist[];
 { int result;
 
   ENTER_CRITICAL;
@@ -513,20 +504,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,24 +528,10 @@
   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;
-int *optlen;
+SOCKLEN_T *optlen;
 { int result;
 
   ENTER_CRITICAL;
@@ -629,9 +592,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 +621,7 @@
 }
 
 int lstat(path, buf)   /* ok */
-char *path;
+const char *path;
 struct stat *buf;
 { int result;
 
@@ -656,7 +634,7 @@
 }
 
 int mkdir(path, mode)   /* ok */
-char *path;
+const char *path;
 mode_t mode;
 { int result;
 
@@ -667,8 +645,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 +670,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 +751,7 @@
   }
   return result;
 }
+#endif /* __FreeBSD_version >= 300001 */
 
 int msgctl(msqid, cmd, buf)   /* ok */
 int msqid, cmd;
@@ -793,9 +822,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 +854,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 +885,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 +920,7 @@
 }
 
 int rmdir(path)   /* ok */
-char *path;
+const char *path;
 { int result;
 
   ENTER_CRITICAL;
@@ -950,44 +930,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 +990,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 +1011,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 +1025,7 @@
 
 int setgroups(ngroups, gidset)   /* ok */
 int ngroups;
-int *gidset;
+const gid_t *gidset;
 { int result;
 
   ENTER_CRITICAL;
@@ -1097,7 +1036,7 @@
 }
 
 int sethostname(name, namelen)   /* ok */
-char *name;
+const char *name;
 int namelen;
 { int result;
 #if __FreeBSD__ >= 2
@@ -1168,7 +1107,7 @@
 int setsockopt(s, level, optname, optval, optlen)   /* ok */
 int s, level, optname;
 const void *optval;
-int optlen;
+SOCKLEN_T optlen;
 { int result;
 
   ENTER_CRITICAL;
@@ -1213,20 +1152,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 +1178,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 +1192,7 @@
 }
 
 int stat(path, buf)   /* ok */
-char *path;
+const char *path;
 struct stat *buf;
 { int result;
 
@@ -1280,7 +1205,7 @@
 }
 
 int swapon(special)   /* ok */
-char *special;
+const char *special;
 { int result;
 
   ENTER_CRITICAL;
@@ -1291,8 +1216,8 @@
 }
 
 int symlink(name1, name2)   /* ok */
-char *name1;
-char *name2;
+const char *name1;
+const char *name2;
 { int result;
 
   ENTER_CRITICAL;
@@ -1304,14 +1229,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 +1253,7 @@
 }
 
 int unlink(path)   /* ok */
-char *path;
+const char *path;
 { int result;
 
   ENTER_CRITICAL;
@@ -1414,19 +1339,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;
 }
