root/compat/svr4/svr4_misc.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. svr4_sys_wait
  2. svr4_sys_execv
  3. svr4_sys_execve
  4. svr4_sys_time
  5. svr4_readdir_callback
  6. svr4_readdir64_callback
  7. svr4_sys_getdents
  8. svr4_sys_getdents64
  9. svr4_sys_mmap
  10. svr4_sys_mmap64
  11. svr4_sys_fchroot
  12. svr4_mknod
  13. svr4_sys_mknod
  14. svr4_sys_xmknod
  15. svr4_sys_vhangup
  16. svr4_sys_sysconfig
  17. svr4_sys_getrlimit
  18. svr4_sys_setrlimit
  19. svr4_sys_break
  20. timeval_to_clock_t
  21. svr4_sys_times
  22. svr4_sys_ulimit
  23. svr4_pfind
  24. svr4_sys_pgrpsys
  25. svr4_hrtcntl
  26. svr4_sys_hrtsys
  27. svr4_setinfo
  28. svr4_sys_waitsys
  29. bsd_statfs_to_svr4_statvfs
  30. bsd_statfs_to_svr4_statvfs64
  31. svr4_sys_statvfs
  32. svr4_sys_fstatvfs
  33. svr4_sys_fstatvfs64
  34. svr4_sys_alarm
  35. svr4_sys_gettimeofday
  36. svr4_sys_facl
  37. svr4_sys_acl
  38. svr4_sys_auditsys
  39. svr4_sys_memcntl
  40. svr4_sys_nice
  41. svr4_sys_setegid
  42. svr4_sys_rdebug

    1 /*      $OpenBSD: svr4_misc.c,v 1.47 2007/03/15 10:22:30 art Exp $       */
    2 /*      $NetBSD: svr4_misc.c,v 1.42 1996/12/06 03:22:34 christos Exp $   */
    3 
    4 /*
    5  * Copyright (c) 1994 Christos Zoulas
    6  * All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  * 3. The name of the author may not be used to endorse or promote products
   17  *    derived from this software without specific prior written permission
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   21  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   22  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   23  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   24  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   28  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   29  */
   30 
   31 /*
   32  * SVR4 compatibility module.
   33  *
   34  * SVR4 system calls that are implemented differently in BSD are
   35  * handled here.
   36  */
   37 
   38 #include <sys/param.h>
   39 #include <sys/systm.h>
   40 #include <sys/exec.h>
   41 #include <sys/exec_olf.h>
   42 #include <sys/namei.h>
   43 #include <sys/dirent.h>
   44 #include <sys/proc.h>
   45 #include <sys/sched.h>
   46 #include <sys/file.h>
   47 #include <sys/stat.h>
   48 #include <sys/time.h>
   49 #include <sys/filedesc.h>
   50 #include <sys/ioctl.h>
   51 #include <sys/kernel.h>
   52 #include <sys/malloc.h>
   53 #include <sys/mbuf.h>
   54 #include <sys/ktrace.h>
   55 #include <sys/mman.h>
   56 #include <sys/mount.h>
   57 #include <sys/pool.h>
   58 #include <sys/resource.h>
   59 #include <sys/resourcevar.h>
   60 #include <sys/socket.h>
   61 #include <sys/vnode.h>
   62 #include <sys/uio.h>
   63 #include <sys/wait.h>
   64 #include <sys/utsname.h>
   65 #include <sys/unistd.h>
   66 #include <sys/times.h>
   67 #include <sys/sem.h>
   68 #include <sys/msg.h>
   69 #include <sys/ptrace.h>
   70 #include <sys/signalvar.h>
   71 
   72 #include <netinet/in.h>
   73 #include <sys/syscallargs.h>
   74 
   75 #include <miscfs/specfs/specdev.h>
   76 
   77 #include <compat/svr4/svr4_types.h>
   78 #include <compat/svr4/svr4_signal.h>
   79 #include <compat/svr4/svr4_syscallargs.h>
   80 #include <compat/svr4/svr4_util.h>
   81 #include <compat/svr4/svr4_time.h>
   82 #include <compat/svr4/svr4_dirent.h>
   83 #include <compat/svr4/svr4_ulimit.h>
   84 #include <compat/svr4/svr4_hrt.h>
   85 #include <compat/svr4/svr4_wait.h>
   86 #include <compat/svr4/svr4_statvfs.h>
   87 #include <compat/svr4/svr4_sysconfig.h>
   88 #include <compat/svr4/svr4_acl.h>
   89 
   90 #include <compat/common/compat_dir.h>
   91 
   92 #include <uvm/uvm_extern.h>
   93 
   94 static __inline clock_t timeval_to_clock_t(struct timeval *);
   95 static int svr4_setinfo(struct proc *, int, svr4_siginfo_t *);
   96 
   97 struct svr4_hrtcntl_args;
   98 static int svr4_hrtcntl(struct proc *, struct svr4_hrtcntl_args *,
   99     register_t *);
  100 static void bsd_statfs_to_svr4_statvfs(const struct statfs *,
  101     struct svr4_statvfs *);
  102 static void bsd_statfs_to_svr4_statvfs64(const struct statfs *,
  103     struct svr4_statvfs64 *);
  104 static struct proc *svr4_pfind(pid_t pid);
  105 
  106 static int svr4_mknod(struct proc *, register_t *, char *,
  107                            svr4_mode_t, svr4_dev_t);
  108 
  109 int
  110 svr4_sys_wait(p, v, retval)
  111         register struct proc *p;
  112         void *v;
  113         register_t *retval;
  114 {
  115         struct svr4_sys_wait_args *uap = v;
  116         struct sys_wait4_args w4;
  117         int error;
  118         size_t sz = sizeof(*SCARG(&w4, status));
  119 
  120         SCARG(&w4, rusage) = NULL;
  121         SCARG(&w4, options) = 0;
  122 
  123         if (SCARG(uap, status) == NULL) {
  124                 caddr_t sg = stackgap_init(p->p_emul);
  125                 SCARG(&w4, status) = stackgap_alloc(&sg, sz);
  126         }
  127         else
  128                 SCARG(&w4, status) = SCARG(uap, status);
  129 
  130         SCARG(&w4, pid) = WAIT_ANY;
  131 
  132         if ((error = sys_wait4(p, &w4, retval)) != 0)
  133                 return error;
  134 
  135         /*
  136          * It looks like wait(2) on svr4/solaris/2.4 returns
  137          * the status in retval[1], and the pid on retval[0].
  138          * NB: this can break if register_t stops being an int.
  139          */
  140         return copyin(SCARG(&w4, status), &retval[1], sz);
  141 }
  142 
  143 
  144 int
  145 svr4_sys_execv(p, v, retval)
  146         register struct proc *p;
  147         void *v;
  148         register_t *retval;
  149 {
  150         struct svr4_sys_execv_args /* {
  151                 syscallarg(char *) path;
  152                 syscallarg(char **) argv;
  153         } */ *uap = v;
  154         struct sys_execve_args ap;
  155         caddr_t sg;
  156 
  157         sg = stackgap_init(p->p_emul);
  158         SVR4_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
  159 
  160         SCARG(&ap, path) = SCARG(uap, path);
  161         SCARG(&ap, argp) = SCARG(uap, argp);
  162         SCARG(&ap, envp) = NULL;
  163 
  164         return sys_execve(p, &ap, retval);
  165 }
  166 
  167 
  168 int
  169 svr4_sys_execve(p, v, retval)
  170         register struct proc *p;
  171         void *v;
  172         register_t *retval;
  173 {
  174         struct svr4_sys_execve_args /* {
  175                 syscallarg(char *) path;
  176                 syscallarg(char **) argv;
  177                 syscallarg(char **) envp;
  178         } */ *uap = v;
  179         struct sys_execve_args ap;
  180         caddr_t sg;
  181 
  182         sg = stackgap_init(p->p_emul);
  183         SVR4_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
  184 
  185         SCARG(&ap, path) = SCARG(uap, path);
  186         SCARG(&ap, argp) = SCARG(uap, argp);
  187         SCARG(&ap, envp) = SCARG(uap, envp);
  188 
  189         return sys_execve(p, &ap, retval);
  190 }
  191 
  192 
  193 int
  194 svr4_sys_time(p, v, retval)
  195         register struct proc *p;
  196         void *v;
  197         register_t *retval;
  198 {
  199         struct svr4_sys_time_args *uap = v;
  200         int error = 0;
  201         struct timeval tv;
  202 
  203         microtime(&tv);
  204         if (SCARG(uap, t))
  205                 error = copyout(&tv.tv_sec, SCARG(uap, t),
  206                                 sizeof(*(SCARG(uap, t))));
  207         *retval = (int) tv.tv_sec;
  208 
  209         return error;
  210 }
  211 
  212 
  213 /*
  214  * Read SVR4-style directory entries.  We suck them into kernel space so
  215  * that they can be massaged before being copied out to user code.  Like
  216  * SunOS, we squish out `empty' entries.
  217  *
  218  * This is quite ugly, but what do you expect from compatibility code?
  219  */
  220 
  221 int svr4_readdir_callback(void *, struct dirent *, off_t);
  222 int svr4_readdir64_callback(void *, struct dirent *, off_t);
  223 
  224 struct svr4_readdir_callback_args {
  225         caddr_t outp;
  226         int     resid;
  227 };
  228 
  229 int
  230 svr4_readdir_callback(arg, bdp, cookie)
  231         void *arg;
  232         struct dirent *bdp;
  233         off_t cookie;
  234 {
  235         struct svr4_dirent idb;
  236         struct svr4_readdir_callback_args *cb = arg; 
  237         int svr4_reclen;
  238         int error;
  239 
  240         svr4_reclen = SVR4_RECLEN(&idb, bdp->d_namlen);
  241         if (cb->resid < svr4_reclen)
  242                 return (ENOMEM);
  243 
  244         idb.d_ino = (svr4_ino_t)bdp->d_fileno;
  245         idb.d_off = (svr4_off_t)cookie;
  246         idb.d_reclen = (u_short)svr4_reclen;
  247         strlcpy(idb.d_name, bdp->d_name, sizeof(idb.d_name));
  248         if ((error = copyout((caddr_t)&idb, cb->outp, svr4_reclen)))
  249                 return (error);
  250 
  251         cb->outp += svr4_reclen;
  252         cb->resid -= svr4_reclen;
  253 
  254         return (0);
  255 }
  256 
  257 int
  258 svr4_readdir64_callback(arg, bdp, cookie)
  259         void *arg;
  260         struct dirent *bdp;
  261         off_t cookie;
  262 {
  263         struct svr4_dirent64 idb;
  264         struct svr4_readdir_callback_args *cb = arg; 
  265         int svr4_reclen;
  266         int error;
  267 
  268         svr4_reclen = SVR4_RECLEN(&idb, bdp->d_namlen);
  269         if (cb->resid < svr4_reclen)
  270                 return (ENOMEM);
  271 
  272         /*
  273          * Massage in place to make a SVR4-shaped dirent (otherwise
  274          * we have to worry about touching user memory outside of
  275          * the copyout() call).
  276          */
  277         idb.d_ino = (svr4_ino64_t)bdp->d_fileno;
  278         idb.d_off = (svr4_off64_t)cookie;
  279         idb.d_reclen = (u_short)svr4_reclen;
  280         strlcpy(idb.d_name, bdp->d_name, sizeof(idb.d_name));
  281         if ((error = copyout((caddr_t)&idb, cb->outp, svr4_reclen)))
  282                 return (error);
  283 
  284         cb->outp += svr4_reclen;
  285         cb->resid -= svr4_reclen;
  286 
  287         return (0);
  288 }
  289 
  290 
  291 int
  292 svr4_sys_getdents(p, v, retval)
  293         register struct proc *p;
  294         void *v;
  295         register_t *retval;
  296 {
  297         struct svr4_sys_getdents_args *uap = v;
  298         struct svr4_readdir_callback_args args;
  299         struct file *fp;
  300         int error;
  301 
  302         if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
  303                 return (error);
  304 
  305         args.resid = SCARG(uap, nbytes);
  306         args.outp = (caddr_t)SCARG(uap, buf);
  307 
  308         error = readdir_with_callback(fp, &fp->f_offset, SCARG(uap, nbytes),
  309             svr4_readdir_callback, &args);
  310         FRELE(fp);
  311         if (error)
  312                 return (error);
  313 
  314         *retval = SCARG(uap, nbytes) - args.resid;
  315 
  316         return (0);
  317 }
  318 
  319 int
  320 svr4_sys_getdents64(p, v, retval)
  321         register struct proc *p;
  322         void *v;
  323         register_t *retval;
  324 {
  325         struct svr4_sys_getdents64_args *uap = v;
  326         struct svr4_readdir_callback_args args;
  327         struct file *fp;
  328         int error;
  329 
  330         if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
  331                 return (error);
  332 
  333         args.resid = SCARG(uap, nbytes);
  334         args.outp = (caddr_t)SCARG(uap, dp);
  335 
  336         error = readdir_with_callback(fp, &fp->f_offset, SCARG(uap, nbytes),
  337             svr4_readdir64_callback, &args);
  338         FRELE(fp);
  339         if (error)
  340                 return (error);
  341 
  342         *retval = SCARG(uap, nbytes) - args.resid;
  343 
  344         return (0);
  345 }
  346 
  347 int
  348 svr4_sys_mmap(p, v, retval)
  349         register struct proc *p;
  350         void *v;
  351         register_t *retval;
  352 {
  353         struct svr4_sys_mmap_args       *uap = v;
  354         struct sys_mmap_args     mm;
  355         void                    *rp;
  356 #define _MAP_NEW        0x80000000
  357         /*
  358          * Verify the arguments.
  359          */
  360         if (SCARG(uap, prot) & ~(PROT_READ | PROT_WRITE | PROT_EXEC))
  361                 return EINVAL;  /* XXX still needed? */
  362 
  363         if (SCARG(uap, len) == 0)
  364                 return EINVAL;
  365 
  366         SCARG(&mm, prot) = SCARG(uap, prot);
  367         SCARG(&mm, len) = SCARG(uap, len);
  368         SCARG(&mm, flags) = SCARG(uap, flags) & ~_MAP_NEW;
  369         SCARG(&mm, fd) = SCARG(uap, fd);
  370         SCARG(&mm, addr) = SCARG(uap, addr);
  371         SCARG(&mm, pos) = SCARG(uap, pos);
  372 
  373         rp = (void *) round_page((vaddr_t)p->p_vmspace->vm_daddr + MAXDSIZ);
  374         if ((SCARG(&mm, flags) & MAP_FIXED) == 0 &&
  375             SCARG(&mm, addr) != 0 && SCARG(&mm, addr) < rp)
  376                 SCARG(&mm, addr) = rp;
  377 
  378         return sys_mmap(p, &mm, retval);
  379 }
  380 
  381 int
  382 svr4_sys_mmap64(p, v, retval)
  383         register struct proc *p;
  384         void *v;
  385         register_t *retval;
  386 {
  387         struct svr4_sys_mmap64_args     *uap = v;
  388         struct sys_mmap_args     mm;
  389         void                    *rp;
  390 #define _MAP_NEW        0x80000000
  391         /*
  392          * Verify the arguments.
  393          */
  394         if (SCARG(uap, prot) & ~(PROT_READ | PROT_WRITE | PROT_EXEC))
  395                 return EINVAL;  /* XXX still needed? */
  396 
  397         if (SCARG(uap, len) == 0)
  398                 return EINVAL;
  399 
  400         SCARG(&mm, prot) = SCARG(uap, prot);
  401         SCARG(&mm, len) = SCARG(uap, len);
  402         SCARG(&mm, flags) = SCARG(uap, flags) & ~_MAP_NEW;
  403         SCARG(&mm, fd) = SCARG(uap, fd);
  404         SCARG(&mm, addr) = SCARG(uap, addr);
  405         SCARG(&mm, pos) = SCARG(uap, pos);
  406 
  407         rp = (void *) round_page((vaddr_t)p->p_vmspace->vm_daddr + MAXDSIZ);
  408         if ((SCARG(&mm, flags) & MAP_FIXED) == 0 &&
  409             SCARG(&mm, addr) != 0 && SCARG(&mm, addr) < rp)
  410                 SCARG(&mm, addr) = rp;
  411 
  412         return sys_mmap(p, &mm, retval);
  413 }
  414 
  415 int
  416 svr4_sys_fchroot(p, v, retval)
  417         register struct proc *p;
  418         void *v;
  419         register_t *retval;
  420 {
  421         struct svr4_sys_fchroot_args *uap = v;
  422         struct filedesc *fdp = p->p_fd;
  423         struct vnode    *vp;
  424         struct file     *fp;
  425         int              error;
  426 
  427         if ((error = suser(p, 0)) != 0)
  428                 return error;
  429         if ((error = getvnode(fdp, SCARG(uap, fd), &fp)) != 0)
  430                 return error;
  431 
  432         vp = (struct vnode *) fp->f_data;
  433         vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
  434         if (vp->v_type != VDIR)
  435                 error = ENOTDIR;
  436         else
  437                 error = VOP_ACCESS(vp, VEXEC, p->p_ucred, p);
  438         VOP_UNLOCK(vp, 0, p);
  439         if (error) {
  440                 FRELE(fp);
  441                 return error;
  442         }
  443         VREF(vp);
  444         if (fdp->fd_rdir != NULL)
  445                 vrele(fdp->fd_rdir);
  446         fdp->fd_rdir = vp;
  447         FRELE(fp);
  448         return 0;
  449 }
  450 
  451 static int
  452 svr4_mknod(p, retval, path, mode, dev)
  453         struct proc *p;
  454         register_t *retval;
  455         char *path;
  456         svr4_mode_t mode;
  457         svr4_dev_t dev;
  458 {
  459         caddr_t sg = stackgap_init(p->p_emul);
  460 
  461         SVR4_CHECK_ALT_EXIST(p, &sg, path);
  462 
  463         if (S_ISFIFO(mode)) {
  464                 struct sys_mkfifo_args ap;
  465                 SCARG(&ap, path) = path;
  466                 SCARG(&ap, mode) = mode;
  467                 return sys_mkfifo(p, &ap, retval);
  468         } else {
  469                 struct sys_mknod_args ap;
  470                 SCARG(&ap, path) = path;
  471                 SCARG(&ap, mode) = mode;
  472                 SCARG(&ap, dev) = dev;
  473                 return sys_mknod(p, &ap, retval);
  474         }
  475 }
  476 
  477 
  478 int
  479 svr4_sys_mknod(p, v, retval)
  480         register struct proc *p;
  481         void *v;
  482         register_t *retval;
  483 {
  484         struct svr4_sys_mknod_args *uap = v;
  485         return svr4_mknod(p, retval,
  486                           SCARG(uap, path), SCARG(uap, mode),
  487                           svr4_to_bsd_odev_t(SCARG(uap, dev)));
  488 }
  489 
  490 
  491 int
  492 svr4_sys_xmknod(p, v, retval)
  493         register struct proc *p;
  494         void *v;
  495         register_t *retval;
  496 {
  497         struct svr4_sys_xmknod_args *uap = v;
  498         return svr4_mknod(p, retval,
  499                           SCARG(uap, path), SCARG(uap, mode),
  500                           svr4_to_bsd_dev_t(SCARG(uap, dev)));
  501 }
  502 
  503 
  504 int
  505 svr4_sys_vhangup(p, v, retval)
  506         struct proc *p;
  507         void *v;
  508         register_t *retval;
  509 {
  510         return 0;
  511 }
  512 
  513 
  514 int
  515 svr4_sys_sysconfig(p, v, retval)
  516         register struct proc *p;
  517         void *v;
  518         register_t *retval;
  519 {
  520         struct svr4_sys_sysconfig_args *uap = v;
  521         extern int      maxfiles;
  522 
  523         switch (SCARG(uap, name)) {
  524         case SVR4_CONFIG_UNUSED:
  525                 *retval = 0;
  526                 break;
  527         case SVR4_CONFIG_NGROUPS:
  528                 *retval = NGROUPS_MAX;
  529                 break;
  530         case SVR4_CONFIG_CHILD_MAX:
  531                 *retval = maxproc;
  532                 break;
  533         case SVR4_CONFIG_OPEN_FILES:
  534                 *retval = maxfiles;
  535                 break;
  536         case SVR4_CONFIG_POSIX_VER:
  537                 *retval = 198808;
  538                 break;
  539         case SVR4_CONFIG_PAGESIZE:
  540                 *retval = NBPG;
  541                 break;
  542         case SVR4_CONFIG_CLK_TCK:
  543                 *retval = 60;   /* should this be `hz', ie. 100? */
  544                 break;
  545         case SVR4_CONFIG_XOPEN_VER:
  546                 *retval = 2;    /* XXX: What should that be? */
  547                 break;
  548         case SVR4_CONFIG_PROF_TCK:
  549                 *retval = 60;   /* XXX: What should that be? */
  550                 break;
  551         case SVR4_CONFIG_NPROC_CONF:
  552                 *retval = 1;    /* Only one processor for now */
  553                 break;
  554         case SVR4_CONFIG_NPROC_ONLN:
  555                 *retval = 1;    /* And it better be online */
  556                 break;
  557         case SVR4_CONFIG_AIO_LISTIO_MAX:
  558         case SVR4_CONFIG_AIO_MAX:
  559         case SVR4_CONFIG_AIO_PRIO_DELTA_MAX:
  560                 *retval = 0;    /* No aio support */
  561                 break;
  562         case SVR4_CONFIG_DELAYTIMER_MAX:
  563                 *retval = 0;    /* No delaytimer support */
  564                 break;
  565 #ifdef SYSVMSG
  566         case SVR4_CONFIG_MQ_OPEN_MAX:
  567                 *retval = msginfo.msgmni;
  568                 break;
  569 #endif
  570         case SVR4_CONFIG_MQ_PRIO_MAX:
  571                 *retval = 0;    /* XXX: Don't know */
  572                 break;
  573         case SVR4_CONFIG_RTSIG_MAX:
  574                 *retval = 0;
  575                 break;
  576 #ifdef SYSVSEM
  577         case SVR4_CONFIG_SEM_NSEMS_MAX:
  578                 *retval = seminfo.semmni;
  579                 break;
  580         case SVR4_CONFIG_SEM_VALUE_MAX:
  581                 *retval = seminfo.semvmx;
  582                 break;
  583 #endif
  584         case SVR4_CONFIG_SIGQUEUE_MAX:
  585                 *retval = 0;    /* XXX: Don't know */
  586                 break;
  587         case SVR4_CONFIG_SIGRT_MIN:
  588         case SVR4_CONFIG_SIGRT_MAX:
  589                 *retval = 0;    /* No real time signals */
  590                 break;
  591         case SVR4_CONFIG_TIMER_MAX:
  592                 *retval = 3;    /* XXX: real, virtual, profiling */
  593                 break;
  594         case SVR4_CONFIG_PHYS_PAGES:
  595                 *retval = uvmexp.npages;
  596                 break;
  597         case SVR4_CONFIG_AVPHYS_PAGES:
  598                 *retval = uvmexp.active;        /* XXX: active instead of avg */
  599                 break;
  600         default:
  601                 return EINVAL;
  602         }
  603         return 0;
  604 }
  605 
  606 #define SVR4_RLIMIT_NOFILE      5       /* Other RLIMIT_* are the same */
  607 #define SVR4_RLIMIT_VMEM        6       /* Other RLIMIT_* are the same */
  608 #define SVR4_RLIM_NLIMITS       7
  609 
  610 int
  611 svr4_sys_getrlimit(p, v, retval)
  612         register struct proc *p;
  613         void *v;
  614         register_t *retval;
  615 {
  616         struct svr4_sys_getrlimit_args *uap = v;
  617         struct compat_43_sys_getrlimit_args ap;
  618 
  619         if (SCARG(uap, which) >= SVR4_RLIM_NLIMITS)
  620                 return EINVAL;
  621 
  622         if (SCARG(uap, which) == SVR4_RLIMIT_NOFILE)
  623                 SCARG(uap, which) = RLIMIT_NOFILE;
  624         if (SCARG(uap, which) == SVR4_RLIMIT_VMEM)
  625                 SCARG(uap, which) = RLIMIT_RSS;
  626 
  627         SCARG(&ap, which) = SCARG(uap, which);
  628         SCARG(&ap, rlp) = SCARG(uap, rlp);
  629 
  630         return compat_43_sys_getrlimit(p, &ap, retval);
  631 }
  632 
  633 int
  634 svr4_sys_setrlimit(p, v, retval)
  635         register struct proc *p;
  636         void *v;
  637         register_t *retval;
  638 {
  639         struct svr4_sys_setrlimit_args *uap = v;
  640         struct compat_43_sys_setrlimit_args ap;
  641 
  642         if (SCARG(uap, which) >= SVR4_RLIM_NLIMITS)
  643                 return EINVAL;
  644 
  645         if (SCARG(uap, which) == SVR4_RLIMIT_NOFILE)
  646                 SCARG(uap, which) = RLIMIT_NOFILE;
  647         if (SCARG(uap, which) == SVR4_RLIMIT_VMEM)
  648                 SCARG(uap, which) = RLIMIT_RSS;
  649 
  650         SCARG(&ap, which) = SCARG(uap, which);
  651         SCARG(&ap, rlp) = SCARG(uap, rlp);
  652 
  653         return compat_43_sys_setrlimit(p, uap, retval);
  654 }
  655 
  656 
  657 /* ARGSUSED */
  658 int
  659 svr4_sys_break(p, v, retval)
  660         register struct proc *p;
  661         void *v;
  662         register_t *retval;
  663 {
  664         struct svr4_sys_break_args *uap = v;
  665         register struct vmspace *vm = p->p_vmspace;
  666         vaddr_t         new, old;
  667         int             error;
  668         register int    diff;
  669 
  670         old = (vaddr_t) vm->vm_daddr;
  671         new = round_page((vaddr_t)SCARG(uap, nsize));
  672         diff = new - old;
  673 
  674         DPRINTF(("break(1): old %lx new %lx diff %x\n", old, new, diff));
  675 
  676         if (diff > p->p_rlimit[RLIMIT_DATA].rlim_cur)
  677                 return ENOMEM;
  678 
  679         old = round_page(old + ctob(vm->vm_dsize));
  680         DPRINTF(("break(2): dsize = %x ctob %x\n",
  681                  vm->vm_dsize, ctob(vm->vm_dsize)));
  682 
  683         diff = new - old;
  684         DPRINTF(("break(3): old %lx new %lx diff %x\n", old, new, diff));
  685 
  686         if (diff > 0) {
  687                 error = uvm_map(&vm->vm_map, &old, diff, NULL, UVM_UNKNOWN_OFFSET,
  688                         0, UVM_MAPFLAG(UVM_PROT_ALL, UVM_PROT_ALL, UVM_INH_COPY,
  689                                     UVM_ADV_NORMAL,
  690                                     UVM_FLAG_AMAPPAD|UVM_FLAG_FIXED|
  691                                     UVM_FLAG_OVERLAY|UVM_FLAG_COPYONW));
  692                 if (error) {
  693                         uprintf("sbrk: grow failed, return = %d\n", error);
  694                         return error;
  695                 }
  696                 vm->vm_dsize += btoc(diff);
  697         } else if (diff < 0) {
  698                 diff = -diff;
  699                 uvm_deallocate(&vm->vm_map, new, diff);
  700                 vm->vm_dsize -= btoc(diff);
  701         }
  702         return 0;
  703 }
  704 
  705 static __inline clock_t
  706 timeval_to_clock_t(tv)
  707         struct timeval *tv;
  708 {
  709         return tv->tv_sec * hz + tv->tv_usec / (1000000 / hz);
  710 }
  711 
  712 int
  713 svr4_sys_times(p, v, retval)
  714         register struct proc *p;
  715         void *v;
  716         register_t *retval;
  717 {
  718         struct svr4_sys_times_args *uap = v;
  719         int                      error;
  720         struct tms               tms;
  721         struct timeval           t;
  722         struct rusage           *ru;
  723         struct rusage            r;
  724         struct sys_getrusage_args        ga;
  725 
  726         caddr_t sg = stackgap_init(p->p_emul);
  727         ru = stackgap_alloc(&sg, sizeof(struct rusage));
  728 
  729         SCARG(&ga, who) = RUSAGE_SELF;
  730         SCARG(&ga, rusage) = ru;
  731 
  732         error = sys_getrusage(p, &ga, retval);
  733         if (error)
  734                 return error;
  735 
  736         if ((error = copyin(ru, &r, sizeof r)) != 0)
  737                 return error;
  738 
  739         tms.tms_utime = timeval_to_clock_t(&r.ru_utime);
  740         tms.tms_stime = timeval_to_clock_t(&r.ru_stime);
  741 
  742         SCARG(&ga, who) = RUSAGE_CHILDREN;
  743         error = sys_getrusage(p, &ga, retval);
  744         if (error)
  745                 return error;
  746 
  747         if ((error = copyin(ru, &r, sizeof r)) != 0)
  748                 return error;
  749 
  750         tms.tms_cutime = timeval_to_clock_t(&r.ru_utime);
  751         tms.tms_cstime = timeval_to_clock_t(&r.ru_stime);
  752 
  753         microtime(&t);
  754         *retval = timeval_to_clock_t(&t);
  755 
  756         return copyout(&tms, SCARG(uap, tp), sizeof(tms));
  757 }
  758 
  759 
  760 int
  761 svr4_sys_ulimit(p, v, retval)
  762         register struct proc *p;
  763         void *v;
  764         register_t *retval;
  765 {
  766         struct svr4_sys_ulimit_args *uap = v;
  767 
  768         switch (SCARG(uap, cmd)) {
  769         case SVR4_GFILLIM:
  770                 *retval = p->p_rlimit[RLIMIT_FSIZE].rlim_cur / 512;
  771                 return 0;
  772 
  773         case SVR4_SFILLIM:
  774                 {
  775                         int error;
  776                         struct sys_setrlimit_args srl;
  777                         struct rlimit krl;
  778                         caddr_t sg = stackgap_init(p->p_emul);
  779                         struct rlimit *url = (struct rlimit *) 
  780                                 stackgap_alloc(&sg, sizeof *url);
  781 
  782                         krl.rlim_cur = SCARG(uap, newlimit) * 512;
  783                         krl.rlim_max = p->p_rlimit[RLIMIT_FSIZE].rlim_max;
  784 
  785                         error = copyout(&krl, url, sizeof(*url));
  786                         if (error)
  787                                 return error;
  788 
  789                         SCARG(&srl, which) = RLIMIT_FSIZE;
  790                         SCARG(&srl, rlp) = url;
  791 
  792                         error = sys_setrlimit(p, &srl, retval);
  793                         if (error)
  794                                 return error;
  795 
  796                         *retval = p->p_rlimit[RLIMIT_FSIZE].rlim_cur;
  797                         return 0;
  798                 }
  799 
  800         case SVR4_GMEMLIM:
  801                 {
  802                         struct vmspace *vm = p->p_vmspace;
  803                         *retval = (long) vm->vm_daddr +
  804                                   p->p_rlimit[RLIMIT_DATA].rlim_cur;
  805                         return 0;
  806                 }
  807 
  808         case SVR4_GDESLIM:
  809                 *retval = p->p_rlimit[RLIMIT_NOFILE].rlim_cur;
  810                 return 0;
  811 
  812         default:
  813                 return EINVAL;
  814         }
  815 }
  816 
  817 
  818 static struct proc *
  819 svr4_pfind(pid)
  820         pid_t pid;
  821 {
  822         struct proc *p;
  823 
  824         /* look in the live processes */
  825         if ((p = pfind(pid)) != NULL)
  826                 return p;
  827 
  828         /* look in the zombies */
  829         LIST_FOREACH(p, &zombproc, p_list)
  830                 if (p->p_pid == pid)
  831                         return p;
  832 
  833         return NULL;
  834 }
  835 
  836 
  837 int
  838 svr4_sys_pgrpsys(p, v, retval)
  839         register struct proc *p;
  840         void *v;
  841         register_t *retval;
  842 {
  843         struct svr4_sys_pgrpsys_args *uap = v;
  844         int error;
  845 
  846         switch (SCARG(uap, cmd)) {
  847         case 0:                 /* getpgrp() */
  848                 *retval = p->p_pgrp->pg_id;
  849                 return 0;
  850 
  851         case 1:                 /* setpgrp() */
  852                 {
  853                         struct sys_setpgid_args sa;
  854 
  855                         SCARG(&sa, pid) = 0;
  856                         SCARG(&sa, pgid) = 0;
  857                         if ((error = sys_setpgid(p, &sa, retval)) != 0)
  858                                 return error;
  859                         *retval = p->p_pgrp->pg_id;
  860                         return 0;
  861                 }
  862 
  863         case 2:                 /* getsid(pid) */
  864                 if (SCARG(uap, pid) != 0 &&
  865                     (p = svr4_pfind(SCARG(uap, pid))) == NULL)
  866                         return ESRCH;
  867                 /* 
  868                  * we return the pid of the session leader for this
  869                  * process
  870                  */
  871                 *retval = (register_t) p->p_session->s_leader->p_pid;
  872                 return 0;
  873 
  874         case 3:                 /* setsid() */
  875                 return sys_setsid(p, NULL, retval);
  876 
  877         case 4:                 /* getpgid(pid) */
  878 
  879                 if (SCARG(uap, pid) != 0 &&
  880                     (p = svr4_pfind(SCARG(uap, pid))) == NULL)
  881                         return ESRCH;
  882 
  883                 *retval = (int) p->p_pgrp->pg_id;
  884                 return 0;
  885 
  886         case 5:                 /* setpgid(pid, pgid); */
  887                 {
  888                         struct sys_setpgid_args sa;
  889 
  890                         SCARG(&sa, pid) = SCARG(uap, pid);
  891                         SCARG(&sa, pgid) = SCARG(uap, pgid);
  892                         return sys_setpgid(p, &sa, retval);
  893                 }
  894 
  895         default:
  896                 return EINVAL;
  897         }
  898 }
  899 
  900 struct svr4_hrtcntl_args {
  901         syscallarg(int)                         cmd;
  902         syscallarg(int)                         fun;
  903         syscallarg(int)                         clk;
  904         syscallarg(svr4_hrt_interval_t *)       iv;
  905         syscallarg(svr4_hrt_time_t *)           ti;
  906 };
  907 
  908 static int
  909 svr4_hrtcntl(p, uap, retval)
  910         register struct proc *p;
  911         register struct svr4_hrtcntl_args *uap;
  912         register_t *retval;
  913 {
  914         switch (SCARG(uap, fun)) {
  915         case SVR4_HRT_CNTL_RES:
  916                 DPRINTF(("htrcntl(RES)\n"));
  917                 *retval = SVR4_HRT_USEC;
  918                 return 0;
  919 
  920         case SVR4_HRT_CNTL_TOFD:
  921                 DPRINTF(("htrcntl(TOFD)\n"));
  922                 {
  923                         struct timeval tv;
  924                         svr4_hrt_time_t t;
  925                         if (SCARG(uap, clk) != SVR4_HRT_CLK_STD) {
  926                                 DPRINTF(("clk == %d\n", SCARG(uap, clk)));
  927                                 return EINVAL;
  928                         }
  929                         if (SCARG(uap, ti) == NULL) {
  930                                 DPRINTF(("ti NULL\n"));
  931                                 return EINVAL;
  932                         }
  933                         microtime(&tv);
  934                         t.h_sec = tv.tv_sec;
  935                         t.h_rem = tv.tv_usec;
  936                         t.h_res = SVR4_HRT_USEC;
  937                         return copyout(&t, SCARG(uap, ti), sizeof(t));
  938                 }
  939 
  940         case SVR4_HRT_CNTL_START:
  941                 DPRINTF(("htrcntl(START)\n"));
  942                 return ENOSYS;
  943 
  944         case SVR4_HRT_CNTL_GET:
  945                 DPRINTF(("htrcntl(GET)\n"));
  946                 return ENOSYS;
  947         default:
  948                 DPRINTF(("Bad htrcntl command %d\n", SCARG(uap, fun)));
  949                 return ENOSYS;
  950         }
  951 }
  952 
  953 int
  954 svr4_sys_hrtsys(p, v, retval) 
  955         register struct proc *p;
  956         void *v;
  957         register_t *retval;
  958 {
  959         struct svr4_sys_hrtsys_args *uap = v;
  960 
  961         switch (SCARG(uap, cmd)) {
  962         case SVR4_HRT_CNTL:
  963                 return svr4_hrtcntl(p, (struct svr4_hrtcntl_args *) uap,
  964                                     retval);
  965 
  966         case SVR4_HRT_ALRM:
  967                 DPRINTF(("hrtalarm\n"));
  968                 return ENOSYS;
  969 
  970         case SVR4_HRT_SLP:
  971                 DPRINTF(("hrtsleep\n"));
  972                 return ENOSYS;
  973 
  974         case SVR4_HRT_CAN:
  975                 DPRINTF(("hrtcancel\n"));
  976                 return ENOSYS;
  977 
  978         default:
  979                 DPRINTF(("Bad hrtsys command %d\n", SCARG(uap, cmd)));
  980                 return EINVAL;
  981         }
  982 }
  983 
  984 static int
  985 svr4_setinfo(p, st, s)
  986         struct proc *p;
  987         int st;
  988         svr4_siginfo_t *s;
  989 {
  990         svr4_siginfo_t i;
  991 
  992         bzero(&i, sizeof(i));
  993 
  994         i.svr4_si_signo = SVR4_SIGCHLD;
  995         i.svr4_si_errno = 0;    /* XXX? */
  996 
  997         if (p) {
  998                 i.svr4_si_pid = p->p_pid;
  999                 if (p->p_stat == SZOMB) {
 1000                         i.svr4_si_stime = p->p_ru->ru_stime.tv_sec;
 1001                         i.svr4_si_utime = p->p_ru->ru_utime.tv_sec;
 1002                 } else {
 1003                         i.svr4_si_stime = p->p_stats->p_ru.ru_stime.tv_sec;
 1004                         i.svr4_si_utime = p->p_stats->p_ru.ru_utime.tv_sec;
 1005                 }
 1006         }
 1007 
 1008         if (WIFEXITED(st)) {
 1009                 i.svr4_si_status = WEXITSTATUS(st);
 1010                 i.svr4_si_code = SVR4_CLD_EXITED;
 1011         }
 1012         else if (WIFSTOPPED(st)) {
 1013                 i.svr4_si_status = bsd_to_svr4_sig[WSTOPSIG(st)];
 1014 
 1015                 if (i.svr4_si_status == SVR4_SIGCONT)
 1016                         i.svr4_si_code = SVR4_CLD_CONTINUED;
 1017                 else
 1018                         i.svr4_si_code = SVR4_CLD_STOPPED;
 1019         } else {
 1020                 i.svr4_si_status = bsd_to_svr4_sig[WTERMSIG(st)];
 1021 
 1022                 if (WCOREDUMP(st))
 1023                         i.svr4_si_code = SVR4_CLD_DUMPED;
 1024                 else
 1025                         i.svr4_si_code = SVR4_CLD_KILLED;
 1026         }
 1027 
 1028         DPRINTF(("siginfo [pid %ld signo %d code %d errno %d status %d]\n",
 1029                  i.svr4_si_pid, i.svr4_si_signo, i.svr4_si_code,
 1030                  i.svr4_si_errno, i.svr4_si_status));
 1031 
 1032         return copyout(&i, s, sizeof(i));
 1033 }
 1034 
 1035 
 1036 int
 1037 svr4_sys_waitsys(q, v, retval) 
 1038         struct proc *q;
 1039         void *v;
 1040         register_t *retval;
 1041 {
 1042         struct svr4_sys_waitsys_args *uap = v;
 1043         int nfound;
 1044         int error;
 1045         struct proc *p, *t;
 1046 
 1047         switch (SCARG(uap, grp)) {
 1048         case SVR4_P_PID:        
 1049                 break;
 1050 
 1051         case SVR4_P_PGID:
 1052                 SCARG(uap, id) = -q->p_pgid;
 1053                 break;
 1054 
 1055         case SVR4_P_ALL:
 1056                 SCARG(uap, id) = WAIT_ANY;
 1057                 break;
 1058 
 1059         default:
 1060                 return (EINVAL);
 1061         }
 1062 
 1063         DPRINTF(("waitsys(%d, %d, %p, %x)\n", SCARG(uap, grp), SCARG(uap, id),
 1064             SCARG(uap, info), SCARG(uap, options)));
 1065 
 1066 loop:
 1067         nfound = 0;
 1068         LIST_FOREACH(p, &q->p_children, p_sibling) {
 1069                 if (SCARG(uap, id) != WAIT_ANY &&
 1070                     p->p_pid != SCARG(uap, id) &&
 1071                     p->p_pgid != -SCARG(uap, id)) {
 1072                         DPRINTF(("pid %d pgid %d != %d\n", p->p_pid,
 1073                                  p->p_pgid, SCARG(uap, id)));
 1074                         continue;
 1075                 }
 1076                 nfound++;
 1077                 if (p->p_stat == SZOMB && 
 1078                     ((SCARG(uap, options) & (SVR4_WEXITED|SVR4_WTRAPPED)))) {
 1079                         *retval = 0;
 1080                         DPRINTF(("found %d\n", p->p_pid));
 1081                         error = svr4_setinfo(p, p->p_xstat, SCARG(uap, info));
 1082                         if (error)
 1083                                 return (error);
 1084 
 1085                         if ((SCARG(uap, options) & SVR4_WNOWAIT)) {
 1086                                 DPRINTF(("Don't wait\n"));
 1087                                 return (0);
 1088                         }
 1089 
 1090                         /*
 1091                          * If we got the child via a ptrace 'attach',
 1092                          * we need to give it back to the old parent.
 1093                          */
 1094                         if (p->p_oppid && (t = pfind(p->p_oppid))) {
 1095                                 p->p_oppid = 0;
 1096                                 proc_reparent(p, t);
 1097                                 psignal(t, SIGCHLD);
 1098                                 wakeup((caddr_t)t);
 1099                                 return (0);
 1100                         }
 1101 
 1102                         scheduler_wait_hook(q, p);
 1103                         p->p_xstat = 0;
 1104                         ruadd(&q->p_stats->p_cru, p->p_ru);
 1105 
 1106                         proc_zap(p);
 1107                         return (0);
 1108                 }
 1109                 if (p->p_stat == SSTOP && (p->p_flag & P_WAITED) == 0 &&
 1110                     (p->p_flag & P_TRACED ||
 1111                     (SCARG(uap, options) & (SVR4_WSTOPPED|SVR4_WCONTINUED)))) {
 1112                         DPRINTF(("jobcontrol %d\n", p->p_pid));
 1113                         if (((SCARG(uap, options) & SVR4_WNOWAIT)) == 0)
 1114                                 atomic_setbits_int(&p->p_flag, P_WAITED);
 1115                         *retval = 0;
 1116                         return (svr4_setinfo(p, W_STOPCODE(p->p_xstat),
 1117                            SCARG(uap, info)));
 1118                 }
 1119         }
 1120 
 1121         if (nfound == 0)
 1122                 return (ECHILD);
 1123 
 1124         if (SCARG(uap, options) & SVR4_WNOHANG) {
 1125                 *retval = 0;
 1126                 if ((error = svr4_setinfo(NULL, 0, SCARG(uap, info))) != 0)
 1127                         return (error);
 1128                 return (0);
 1129         }
 1130 
 1131         if ((error = tsleep((caddr_t)q, PWAIT | PCATCH, "svr4_wait", 0)) != 0)
 1132                 return (error);
 1133         goto loop;
 1134 }
 1135 
 1136 static void
 1137 bsd_statfs_to_svr4_statvfs(bfs, sfs)
 1138         const struct statfs *bfs;
 1139         struct svr4_statvfs *sfs;
 1140 {
 1141         sfs->f_bsize = bfs->f_iosize; /* XXX */
 1142         sfs->f_frsize = bfs->f_bsize;
 1143         sfs->f_blocks = bfs->f_blocks;
 1144         sfs->f_bfree = bfs->f_bfree;
 1145         sfs->f_bavail = bfs->f_bavail;
 1146         sfs->f_files = bfs->f_files;
 1147         sfs->f_ffree = bfs->f_ffree;
 1148         sfs->f_favail = bfs->f_ffree;
 1149         sfs->f_fsid = bfs->f_fsid.val[0];
 1150         bcopy(bfs->f_fstypename, sfs->f_basetype, sizeof(sfs->f_basetype));
 1151         sfs->f_flag = 0;
 1152         if (bfs->f_flags & MNT_RDONLY)
 1153                 sfs->f_flag |= SVR4_ST_RDONLY;
 1154         if (bfs->f_flags & MNT_NOSUID)
 1155                 sfs->f_flag |= SVR4_ST_NOSUID;
 1156         sfs->f_namemax = MAXNAMLEN;
 1157         bcopy(bfs->f_fstypename, sfs->f_fstr, sizeof(sfs->f_fstr)); /* XXX */
 1158         bzero(sfs->f_filler, sizeof(sfs->f_filler));
 1159 }
 1160 
 1161 
 1162 static void
 1163 bsd_statfs_to_svr4_statvfs64(bfs, sfs)
 1164         const struct statfs *bfs;
 1165         struct svr4_statvfs64 *sfs; 
 1166 {
 1167         sfs->f_bsize = bfs->f_iosize; /* XXX */
 1168         sfs->f_frsize = bfs->f_bsize;
 1169         sfs->f_blocks = bfs->f_blocks;
 1170         sfs->f_bfree = bfs->f_bfree;
 1171         sfs->f_bavail = bfs->f_bavail;
 1172         sfs->f_files = bfs->f_files;
 1173         sfs->f_ffree = bfs->f_ffree;  
 1174         sfs->f_favail = bfs->f_ffree;
 1175         sfs->f_fsid = bfs->f_fsid.val[0];
 1176         bcopy(bfs->f_fstypename, sfs->f_basetype, sizeof(sfs->f_basetype));
 1177         sfs->f_flag = 0;
 1178         if (bfs->f_flags & MNT_RDONLY)
 1179                 sfs->f_flag |= SVR4_ST_RDONLY;
 1180         if (bfs->f_flags & MNT_NOSUID)
 1181                 sfs->f_flag |= SVR4_ST_NOSUID;
 1182         sfs->f_namemax = MAXNAMLEN;   
 1183         bcopy(bfs->f_fstypename, sfs->f_fstr, sizeof(sfs->f_fstr)); /* XXX */
 1184         bzero(sfs->f_filler, sizeof(sfs->f_filler));
 1185 }
 1186 
 1187 
 1188 int
 1189 svr4_sys_statvfs(p, v, retval) 
 1190         register struct proc *p;
 1191         void *v;
 1192         register_t *retval;
 1193 {
 1194         struct svr4_sys_statvfs_args *uap = v;
 1195         struct sys_statfs_args  fs_args;
 1196         caddr_t sg = stackgap_init(p->p_emul);
 1197         struct statfs *fs = stackgap_alloc(&sg, sizeof(struct statfs));
 1198         struct statfs bfs;
 1199         struct svr4_statvfs sfs;
 1200         int error;
 1201 
 1202         SVR4_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
 1203         SCARG(&fs_args, path) = SCARG(uap, path);
 1204         SCARG(&fs_args, buf) = fs;
 1205 
 1206         if ((error = sys_statfs(p, &fs_args, retval)) != 0)
 1207                 return error;
 1208 
 1209         if ((error = copyin(fs, &bfs, sizeof(bfs))) != 0)
 1210                 return error;
 1211 
 1212         bsd_statfs_to_svr4_statvfs(&bfs, &sfs);
 1213 
 1214         return copyout(&sfs, SCARG(uap, fs), sizeof(sfs));
 1215 }
 1216 
 1217 
 1218 int
 1219 svr4_sys_fstatvfs(p, v, retval) 
 1220         register struct proc *p;
 1221         void *v;
 1222         register_t *retval;
 1223 {
 1224         struct svr4_sys_fstatvfs_args *uap = v;
 1225         struct sys_fstatfs_args fs_args;
 1226         caddr_t sg = stackgap_init(p->p_emul);
 1227         struct statfs *fs = stackgap_alloc(&sg, sizeof(struct statfs));
 1228         struct statfs bfs;
 1229         struct svr4_statvfs sfs;
 1230         int error;
 1231 
 1232         SCARG(&fs_args, fd) = SCARG(uap, fd);
 1233         SCARG(&fs_args, buf) = fs;
 1234 
 1235         if ((error = sys_fstatfs(p, &fs_args, retval)) != 0)
 1236                 return error;
 1237 
 1238         if ((error = copyin(fs, &bfs, sizeof(bfs))) != 0)
 1239                 return error;
 1240 
 1241         bsd_statfs_to_svr4_statvfs(&bfs, &sfs);
 1242 
 1243         return copyout(&sfs, SCARG(uap, fs), sizeof(sfs));
 1244 }
 1245 
 1246 
 1247 int
 1248 svr4_sys_fstatvfs64(p, v, retval)
 1249         register struct proc *p;
 1250         void *v;
 1251         register_t *retval;
 1252 {
 1253         struct svr4_sys_fstatvfs64_args *uap = v;
 1254         struct sys_fstatfs_args fs_args;
 1255         caddr_t sg = stackgap_init(p->p_emul);
 1256         struct statfs *fs = stackgap_alloc(&sg, sizeof(struct statfs));
 1257         struct statfs bfs;
 1258         struct svr4_statvfs64 sfs;
 1259         int error;
 1260 
 1261         SCARG(&fs_args, fd) = SCARG(uap, fd);
 1262         SCARG(&fs_args, buf) = fs;
 1263 
 1264         if ((error = sys_fstatfs(p, &fs_args, retval)) != 0)
 1265                 return error;
 1266 
 1267         if ((error = copyin(fs, &bfs, sizeof(bfs))) != 0)
 1268                 return error;
 1269 
 1270         bsd_statfs_to_svr4_statvfs64(&bfs, &sfs);
 1271 
 1272         return copyout(&sfs, SCARG(uap, fs), sizeof(sfs));
 1273 }
 1274 
 1275 
 1276 int
 1277 svr4_sys_alarm(p, v, retval)
 1278         register struct proc *p;
 1279         void *v;
 1280         register_t *retval;
 1281 {
 1282         struct svr4_sys_alarm_args *uap = v;
 1283         int error;
 1284         struct itimerval *ntp, *otp, tp;
 1285         struct sys_setitimer_args sa;
 1286         caddr_t sg = stackgap_init(p->p_emul);
 1287 
 1288         ntp = stackgap_alloc(&sg, sizeof(struct itimerval));
 1289         otp = stackgap_alloc(&sg, sizeof(struct itimerval));
 1290 
 1291         timerclear(&tp.it_interval);
 1292         tp.it_value.tv_sec = SCARG(uap, sec);
 1293         tp.it_value.tv_usec = 0;
 1294 
 1295         if ((error = copyout(&tp, ntp, sizeof(tp))) != 0)
 1296                 return error;
 1297 
 1298         SCARG(&sa, which) = ITIMER_REAL;
 1299         SCARG(&sa, itv) = ntp;
 1300         SCARG(&sa, oitv) = otp;
 1301 
 1302         if ((error = sys_setitimer(p, &sa, retval)) != 0)
 1303                 return error;
 1304 
 1305         if ((error = copyin(otp, &tp, sizeof(tp))) != 0)
 1306                 return error;
 1307 
 1308         if (tp.it_value.tv_usec)
 1309                 tp.it_value.tv_sec++;
 1310 
 1311         *retval = (register_t) tp.it_value.tv_sec;
 1312 
 1313         return 0;
 1314 }
 1315 
 1316 
 1317 int
 1318 svr4_sys_gettimeofday(p, v, retval)
 1319         register struct proc *p;
 1320         void *v;
 1321         register_t *retval;
 1322 {
 1323         struct svr4_sys_gettimeofday_args *uap = v;
 1324 
 1325         if (SCARG(uap, tp)) {
 1326                 struct timeval atv;
 1327 
 1328                 microtime(&atv);
 1329                 return copyout(&atv, SCARG(uap, tp), sizeof (atv));
 1330         }
 1331 
 1332         return 0;
 1333 }
 1334 
 1335 int
 1336 svr4_sys_facl(p, v, retval)
 1337         register struct proc *p;
 1338         void *v;
 1339         register_t *retval;
 1340 {
 1341         struct svr4_sys_facl_args *uap = v;
 1342 
 1343         *retval = 0;
 1344 
 1345         switch (SCARG(uap, cmd)) {
 1346         case SVR4_SYS_SETACL:
 1347                 /* We don't support acls on any filesystem */
 1348                 return ENOSYS;
 1349 
 1350         case SVR4_SYS_GETACL:
 1351                 return copyout(retval, &SCARG(uap, num),
 1352                     sizeof(SCARG(uap, num)));
 1353 
 1354         case SVR4_SYS_GETACLCNT:
 1355                 return 0;
 1356 
 1357         default:
 1358                 return EINVAL;
 1359         }
 1360 }
 1361 
 1362 int
 1363 svr4_sys_acl(p, v, retval)
 1364         register struct proc *p;
 1365         void *v;
 1366         register_t *retval;
 1367 {
 1368         return svr4_sys_facl(p, v, retval);     /* XXX: for now the same */
 1369 }
 1370 
 1371 int
 1372 svr4_sys_auditsys(p, v, retval)
 1373         register struct proc *p;
 1374         void *v;
 1375         register_t *retval;
 1376 {
 1377         /*
 1378          * XXX: Big brother is *not* watching.
 1379          */
 1380         return 0;
 1381 }
 1382 
 1383 int
 1384 svr4_sys_memcntl(p, v, retval)
 1385         register struct proc *p;
 1386         void *v;
 1387         register_t *retval;
 1388 {
 1389         struct svr4_sys_memcntl_args *uap = v;
 1390         struct sys_mprotect_args ap;
 1391 
 1392         SCARG(&ap, addr) = SCARG(uap, addr);
 1393         SCARG(&ap, len) = SCARG(uap, len);
 1394         SCARG(&ap, prot) = SCARG(uap, attr);
 1395 
 1396         /* XXX: no locking, invalidating, or syncing supported */
 1397         return sys_mprotect(p, &ap, retval);
 1398 }
 1399 
 1400 int
 1401 svr4_sys_nice(p, v, retval)
 1402         register struct proc *p;
 1403         void *v;
 1404         register_t *retval;
 1405 {
 1406         struct svr4_sys_nice_args *uap = v;
 1407         struct sys_setpriority_args ap;
 1408         int error;
 1409 
 1410         SCARG(&ap, which) = PRIO_PROCESS;
 1411         SCARG(&ap, who) = 0;
 1412         SCARG(&ap, prio) = SCARG(uap, prio);
 1413 
 1414         if ((error = sys_setpriority(p, &ap, retval)) != 0)
 1415                 return error;
 1416 
 1417         if ((error = sys_getpriority(p, &ap, retval)) != 0)
 1418                 return error;
 1419 
 1420         return 0;
 1421 }
 1422 
 1423 /* ARGSUSED */
 1424 int
 1425 svr4_sys_setegid(p, v, retval)
 1426         struct proc *p;
 1427         void *v;
 1428         register_t *retval;
 1429 {
 1430         struct sys_setegid_args /* {
 1431                 syscallarg(gid_t) egid;
 1432         } */ *uap = v;
 1433 
 1434 #if defined(COMPAT_LINUX) && defined(i386)
 1435         if (SCARG(uap, egid) > 60000) {
 1436                 /*
 1437                  * One great fuckup deserves another.  The Linux people
 1438                  * made this their personality system call.  But we can't
 1439                  * tell if a binary is SVR4 or Linux until they do that
 1440                  * system call, in some cases.  So when we get it, and the
 1441                  * value is out of some magical range, switch to Linux
 1442                  * emulation and pray.
 1443                  */
 1444                 extern struct emul emul_linux_elf;
 1445 
 1446                 p->p_emul = &emul_linux_elf;
 1447                 p->p_os = OOS_LINUX;
 1448 #ifdef KTRACE
 1449                 if (KTRPOINT(p, KTR_EMUL))
 1450                         ktremul(p, p->p_emul->e_name);
 1451 #endif
 1452                 return (0);
 1453         }
 1454 #else
 1455         (void)uap;
 1456 #endif
 1457         return (sys_setegid(p, v, retval));
 1458 }
 1459 
 1460 int
 1461 svr4_sys_rdebug(p, v, retval)
 1462         struct proc *p;
 1463         void *v;
 1464         register_t *retval;
 1465 {
 1466 #ifdef COMPAT_SVR4_NCR
 1467         return (ENXIO);
 1468 #else
 1469         return (p->p_os == OOS_NCR ? ENXIO : sys_nosys(p, v, retval));
 1470 #endif
 1471 }

/* [<][>][^][v][top][bottom][index][help] */