root/compat/ibcs2/ibcs2_misc.c

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

DEFINITIONS

This source file includes following definitions.
  1. ibcs2_sys_ulimit
  2. ibcs2_sys_waitsys
  3. ibcs2_sys_execv
  4. ibcs2_sys_execve
  5. ibcs2_sys_umount
  6. ibcs2_sys_mount
  7. ibcs2_readdir_callback
  8. ibcs2_classicread_callback
  9. ibcs2_sys_getdents
  10. ibcs2_sys_read
  11. ibcs2_sys_mknod
  12. ibcs2_sys_getgroups
  13. ibcs2_sys_setgroups
  14. ibcs2_sys_setuid
  15. ibcs2_sys_setgid
  16. xenix_sys_ftime
  17. ibcs2_sys_time
  18. ibcs2_sys_pathconf
  19. ibcs2_sys_fpathconf
  20. ibcs2_sys_sysconf
  21. ibcs2_sys_alarm
  22. ibcs2_sys_getmsg
  23. ibcs2_sys_putmsg
  24. ibcs2_sys_times
  25. ibcs2_sys_stime
  26. ibcs2_sys_utime
  27. ibcs2_sys_nice
  28. ibcs2_sys_pgrpsys
  29. ibcs2_sys_plock
  30. ibcs2_sys_uadmin
  31. ibcs2_sys_sysfs
  32. xenix_sys_rdchk
  33. xenix_sys_chsize
  34. xenix_sys_nap
  35. ibcs2_sys_unlink
  36. ibcs2_sys_chdir
  37. ibcs2_sys_chmod
  38. ibcs2_sys_chown
  39. ibcs2_sys_rmdir
  40. ibcs2_sys_mkdir
  41. ibcs2_sys_symlink
  42. ibcs2_sys_rename
  43. ibcs2_sys_readlink
  44. ibcs2_sys_sysi86

    1 /*      $OpenBSD: ibcs2_misc.c,v 1.28 2004/06/22 23:52:18 jfb Exp $     */
    2 /*      $NetBSD: ibcs2_misc.c,v 1.23 1997/01/15 01:37:49 perry Exp $    */
    3 
    4 /*
    5  * Copyright (c) 1994, 1995 Scott Bartram
    6  * Copyright (c) 1992, 1993
    7  *      The Regents of the University of California.  All rights reserved.
    8  *
    9  * This software was developed by the Computer Systems Engineering group
   10  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
   11  * contributed to Berkeley.
   12  *
   13  * All advertising materials mentioning features or use of this software
   14  * must display the following acknowledgement:
   15  *      This product includes software developed by the University of
   16  *      California, Lawrence Berkeley Laboratory.
   17  *
   18  * Redistribution and use in source and binary forms, with or without
   19  * modification, are permitted provided that the following conditions
   20  * are met:
   21  * 1. Redistributions of source code must retain the above copyright
   22  *    notice, this list of conditions and the following disclaimer.
   23  * 2. Redistributions in binary form must reproduce the above copyright
   24  *    notice, this list of conditions and the following disclaimer in the
   25  *    documentation and/or other materials provided with the distribution.
   26  * 3. Neither the name of the University nor the names of its contributors
   27  *    may be used to endorse or promote products derived from this software
   28  *    without specific prior written permission.
   29  *
   30  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   31  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   32  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   33  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   34  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   35  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   36  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   37  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   38  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   39  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   40  * SUCH DAMAGE.
   41  *
   42  * from: Header: sun_misc.c,v 1.16 93/04/07 02:46:27 torek Exp 
   43  *
   44  *      @(#)sun_misc.c  8.1 (Berkeley) 6/18/93
   45  */
   46 
   47 /*
   48  * IBCS2 compatibility module.
   49  *
   50  * IBCS2 system calls that are implemented differently in BSD are
   51  * handled here.
   52  */
   53 
   54 #include <sys/param.h>
   55 #include <sys/systm.h>
   56 #include <sys/namei.h>
   57 #include <sys/dirent.h>
   58 #include <sys/proc.h>
   59 #include <sys/file.h>
   60 #include <sys/filedesc.h>
   61 #include <sys/ioctl.h>
   62 #include <sys/kernel.h>
   63 #include <sys/malloc.h>
   64 #include <sys/mbuf.h>
   65 #include <sys/mman.h>
   66 #include <sys/mount.h>
   67 #include <sys/reboot.h>
   68 #include <sys/resource.h>
   69 #include <sys/resourcevar.h>
   70 #include <sys/socket.h>
   71 #include <sys/stat.h>
   72 #include <sys/time.h>
   73 #include <sys/times.h>
   74 #include <sys/vnode.h>
   75 #include <sys/uio.h>
   76 #include <sys/wait.h>
   77 #include <sys/utsname.h>
   78 #include <sys/unistd.h>
   79 
   80 #include <netinet/in.h>
   81 #include <sys/syscallargs.h>
   82 
   83 #include <miscfs/specfs/specdev.h>
   84 
   85 #include <uvm/uvm_extern.h>
   86 #include <sys/sysctl.h>         /* must be included after vm.h */
   87 
   88 #include <i386/include/reg.h>
   89 
   90 #include <compat/ibcs2/ibcs2_types.h>
   91 #include <compat/ibcs2/ibcs2_dirent.h>
   92 #include <compat/ibcs2/ibcs2_fcntl.h>
   93 #include <compat/ibcs2/ibcs2_time.h>
   94 #include <compat/ibcs2/ibcs2_signal.h>
   95 #include <compat/ibcs2/ibcs2_timeb.h>
   96 #include <compat/ibcs2/ibcs2_unistd.h>
   97 #include <compat/ibcs2/ibcs2_utsname.h>
   98 #include <compat/ibcs2/ibcs2_util.h>
   99 #include <compat/ibcs2/ibcs2_utime.h>
  100 #include <compat/ibcs2/ibcs2_syscallargs.h>
  101 #include <compat/ibcs2/ibcs2_sysi86.h>
  102 
  103 #include <compat/common/compat_dir.h>
  104 
  105 int
  106 ibcs2_sys_ulimit(p, v, retval)
  107         struct proc *p;
  108         void *v;
  109         register_t *retval;
  110 {
  111         struct ibcs2_sys_ulimit_args /* {
  112                 syscallarg(int) cmd;
  113                 syscallarg(int) newlimit;
  114         } */ *uap = v;
  115 #ifdef notyet
  116         int error;
  117         struct rlimit rl;
  118         struct sys_setrlimit_args sra;
  119 #endif
  120 #define IBCS2_GETFSIZE          1
  121 #define IBCS2_SETFSIZE          2
  122 #define IBCS2_GETPSIZE          3
  123 #define IBCS2_GETDTABLESIZE     4
  124         
  125         switch (SCARG(uap, cmd)) {
  126         case IBCS2_GETFSIZE:
  127                 *retval = p->p_rlimit[RLIMIT_FSIZE].rlim_cur;
  128                 return 0;
  129         case IBCS2_SETFSIZE:    /* XXX - fix this */
  130 #ifdef notyet
  131                 rl.rlim_cur = SCARG(uap, newlimit);
  132                 SCARG(&sra, which) = RLIMIT_FSIZE;
  133                 SCARG(&sra, rlp) = &rl;
  134                 error = setrlimit(p, &sra, retval);
  135                 if (!error)
  136                         *retval = p->p_rlimit[RLIMIT_FSIZE].rlim_cur;
  137                 else
  138                         DPRINTF(("failed "));
  139                 return error;
  140 #else
  141                 *retval = SCARG(uap, newlimit);
  142                 return 0;
  143 #endif
  144         case IBCS2_GETPSIZE:
  145                 *retval = p->p_rlimit[RLIMIT_RSS].rlim_cur; /* XXX */
  146                 return 0;
  147         case IBCS2_GETDTABLESIZE:
  148                 SCARG(uap, cmd) = IBCS2_SC_OPEN_MAX;
  149                 return ibcs2_sys_sysconf(p, uap, retval);
  150         default:
  151                 return ENOSYS;
  152         }
  153 }
  154 
  155 int
  156 ibcs2_sys_waitsys(p, v, retval)
  157         struct proc *p;
  158         void *v;
  159         register_t *retval;
  160 {
  161         struct ibcs2_sys_waitsys_args /* {
  162                 syscallarg(int) a1;
  163                 syscallarg(int) a2;
  164                 syscallarg(int) a3;
  165         } */ *uap = v;
  166         int error;
  167         struct sys_wait4_args w4;
  168 #define WAITPID_EFLAGS  0x8c4   /* OF, SF, ZF, PF */
  169         
  170         SCARG(&w4, rusage) = NULL;
  171         if ((p->p_md.md_regs->tf_eflags & WAITPID_EFLAGS) == WAITPID_EFLAGS) {
  172                 /* waitpid */
  173                 SCARG(&w4, pid) = SCARG(uap, a1);
  174                 SCARG(&w4, status) = (int *)SCARG(uap, a2);
  175                 SCARG(&w4, options) = SCARG(uap, a3);
  176         } else {
  177                 /* wait */
  178                 SCARG(&w4, pid) = WAIT_ANY;
  179                 SCARG(&w4, status) = (int *)SCARG(uap, a1);
  180                 SCARG(&w4, options) = 0;
  181         }
  182         if ((error = sys_wait4(p, &w4, retval)) != 0)
  183                 return error;
  184         if (SCARG(&w4, status))         /* this is real iBCS brain-damage */
  185                 return copyin((caddr_t)SCARG(&w4, status), (caddr_t)&retval[1],
  186                               sizeof(SCARG(&w4, status)));
  187         return 0;
  188 }
  189 
  190 int
  191 ibcs2_sys_execv(p, v, retval)
  192         struct proc *p;
  193         void *v;
  194         register_t *retval;
  195 {
  196         struct ibcs2_sys_execv_args /* {
  197                 syscallarg(char *) path;
  198                 syscallarg(char **) argp;
  199         } */ *uap = v;
  200         struct sys_execve_args ap;
  201         caddr_t sg;
  202 
  203         sg = stackgap_init(p->p_emul);
  204         IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
  205 
  206         SCARG(&ap, path) = SCARG(uap, path);
  207         SCARG(&ap, argp) = SCARG(uap, argp);
  208         SCARG(&ap, envp) = NULL;
  209 
  210         return sys_execve(p, &ap, retval);
  211 }
  212 
  213 int
  214 ibcs2_sys_execve(p, v, retval) 
  215         struct proc *p;
  216         void *v;
  217         register_t *retval;
  218 {
  219         struct ibcs2_sys_execve_args /* {
  220                 syscallarg(char *) path;
  221                 syscallarg(char **) argv;
  222                 syscallarg(char **) envp;
  223         } */ *uap = v;
  224         struct sys_execve_args ap;
  225         caddr_t sg;
  226 
  227         sg = stackgap_init(p->p_emul);
  228         IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
  229 
  230         SCARG(&ap, path) = SCARG(uap, path);
  231         SCARG(&ap, argp) = SCARG(uap, argp);
  232         SCARG(&ap, envp) = SCARG(uap, envp);
  233 
  234         return sys_execve(p, &ap, retval);
  235 }
  236 
  237 int
  238 ibcs2_sys_umount(p, v, retval)
  239         struct proc *p;
  240         void *v;
  241         register_t *retval;
  242 {
  243         struct ibcs2_sys_umount_args /* {
  244                 syscallarg(char *) name;
  245         } */ *uap = v;
  246         struct sys_unmount_args um;
  247 
  248         SCARG(&um, path) = SCARG(uap, name);
  249         SCARG(&um, flags) = 0;
  250         return sys_unmount(p, &um, retval);
  251 }
  252 
  253 int
  254 ibcs2_sys_mount(p, v, retval)
  255         struct proc *p;
  256         void *v;
  257         register_t *retval;
  258 {
  259 #ifdef notyet
  260         struct ibcs2_sys_mount_args /* {
  261                 syscallarg(char *) special;
  262                 syscallarg(char *) dir;
  263                 syscallarg(int) flags;
  264                 syscallarg(int) fstype;
  265                 syscallarg(char *) data;
  266                 syscallarg(int) len;
  267         } */ *uap = v;
  268         int oflags = SCARG(uap, flags), nflags, error;
  269         char fsname[MFSNAMELEN];
  270 
  271         if (oflags & (IBCS2_MS_NOSUB | IBCS2_MS_SYS5))
  272                 return (EINVAL);
  273         if ((oflags & IBCS2_MS_NEWTYPE) == 0)
  274                 return (EINVAL);
  275         nflags = 0;
  276         if (oflags & IBCS2_MS_RDONLY)
  277                 nflags |= MNT_RDONLY;
  278         if (oflags & IBCS2_MS_NOSUID)
  279                 nflags |= MNT_NOSUID;
  280         if (oflags & IBCS2_MS_REMOUNT)
  281                 nflags |= MNT_UPDATE;
  282         SCARG(uap, flags) = nflags;
  283 
  284         if (error = copyinstr((caddr_t)SCARG(uap, type), fsname, sizeof fsname,
  285                               (u_int *)0))
  286                 return (error);
  287 
  288         if (strncmp(fsname, "4.2", sizeof fsname) == 0) {
  289                 SCARG(uap, type) = (caddr_t)STACK_ALLOC();
  290                 if (error = copyout("ffs", SCARG(uap, type), sizeof("ffs")))
  291                         return (error);
  292         } else if (strncmp(fsname, "nfs", sizeof fsname) == 0) {
  293                 struct ibcs2_nfs_args sna;
  294                 struct sockaddr_in sain;
  295                 struct nfs_args na;
  296                 struct sockaddr sa;
  297 
  298                 if (error = copyin(SCARG(uap, data), &sna, sizeof sna))
  299                         return (error);
  300                 if (error = copyin(sna.addr, &sain, sizeof sain))
  301                         return (error);
  302                 bcopy(&sain, &sa, sizeof sa);
  303                 sa.sa_len = sizeof(sain);
  304                 SCARG(uap, data) = (caddr_t)STACK_ALLOC();
  305                 na.addr = (struct sockaddr *)((int)SCARG(uap, data) + sizeof na);
  306                 na.sotype = SOCK_DGRAM;
  307                 na.proto = IPPROTO_UDP;
  308                 na.fh = (nfsv2fh_t *)sna.fh;
  309                 na.flags = sna.flags;
  310                 na.wsize = sna.wsize;
  311                 na.rsize = sna.rsize;
  312                 na.timeo = sna.timeo;
  313                 na.retrans = sna.retrans;
  314                 na.hostname = sna.hostname;
  315 
  316                 if (error = copyout(&sa, na.addr, sizeof sa))
  317                         return (error);
  318                 if (error = copyout(&na, SCARG(uap, data), sizeof na))
  319                         return (error);
  320         }
  321         return (sys_mount(p, uap, retval));
  322 #else
  323         return EINVAL;
  324 #endif
  325 }
  326 
  327 /*
  328  * Read iBCS2-style directory entries.  We suck them into kernel space so
  329  * that they can be massaged before being copied out to user code.  Like
  330  * SunOS, we squish out `empty' entries.
  331  *
  332  * This is quite ugly, but what do you expect from compatibility code?
  333  */
  334 
  335 int ibcs2_readdir_callback(void *, struct dirent *, off_t);
  336 int ibcs2_classicread_callback(void *, struct dirent *, off_t);
  337 
  338 struct ibcs2_readdir_callback_args {
  339         caddr_t outp;
  340         int     resid;
  341 };
  342 
  343 int
  344 ibcs2_readdir_callback(arg, bdp, cookie)
  345         void *arg;
  346         struct dirent *bdp;
  347         off_t cookie;
  348 {
  349         struct ibcs2_dirent idb;
  350         struct ibcs2_readdir_callback_args *cb = arg; 
  351         int ibcs2_reclen;
  352         int error;
  353 
  354         ibcs2_reclen = IBCS2_RECLEN(&idb, bdp->d_namlen);
  355         if (cb->resid < ibcs2_reclen)
  356                 return (ENOMEM);
  357 
  358         /*
  359          * Massage in place to make a iBCS2-shaped dirent (otherwise
  360          * we have to worry about touching user memory outside of
  361          * the copyout() call).
  362          */
  363         idb.d_ino = (ibcs2_ino_t)bdp->d_fileno;
  364         idb.d_pad = 0;
  365         idb.d_off = (ibcs2_off_t)cookie;
  366         idb.d_reclen = (u_short)ibcs2_reclen;
  367         strlcpy(idb.d_name, bdp->d_name, sizeof(idb.d_name));
  368         error = copyout((caddr_t)&idb, cb->outp, ibcs2_reclen);
  369         if (error)
  370                 return (error);
  371 
  372         /* advance output past iBCS2-shaped entry */
  373         cb->outp += ibcs2_reclen;
  374         cb->resid -= ibcs2_reclen;
  375 
  376         return (0);
  377 }
  378 
  379 int
  380 ibcs2_classicread_callback(arg, bdp, cookie)
  381         void *arg;
  382         struct dirent *bdp;
  383         off_t cookie;
  384 {
  385         struct ibcs2_direct {
  386                 ibcs2_ino_t ino;
  387                 char name[14];
  388         } idb;
  389         struct ibcs2_readdir_callback_args *cb = arg; 
  390         int ibcs2_reclen;
  391         int error;
  392         
  393         ibcs2_reclen = 16;
  394         if (cb->resid < ibcs2_reclen)
  395                 return (ENOMEM);
  396 
  397         /*
  398          * TODO: if length(filename) > 14 then break filename into
  399          * multiple entries and set inode = 0xffff except last
  400          */
  401         idb.ino = (bdp->d_fileno > 0xfffe) ? 0xfffe : bdp->d_fileno;
  402         bzero(&idb.name, sizeof(idb.name));
  403         strncpy(idb.name, bdp->d_name, 14);
  404         error = copyout(&idb, cb->outp, ibcs2_reclen);
  405         if (error)
  406                 return (error);
  407 
  408         /* advance output past iBCS2-shaped entry */
  409         cb->outp += ibcs2_reclen;
  410         cb->resid -= ibcs2_reclen;
  411 
  412         return (0);
  413 }
  414 
  415 int
  416 ibcs2_sys_getdents(p, v, retval)
  417         struct proc *p;
  418         void *v;
  419         register_t *retval;
  420 {
  421         register struct ibcs2_sys_getdents_args /* {
  422                 syscallarg(int) fd;
  423                 syscallarg(char *) buf;
  424                 syscallarg(int) nbytes;
  425         } */ *uap = v;
  426         struct ibcs2_readdir_callback_args args;
  427         struct file *fp;
  428         int error;
  429 
  430         if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
  431                 return (error);
  432 
  433         args.resid = SCARG(uap, nbytes);
  434         args.outp = (caddr_t)SCARG(uap, buf);
  435         error = readdir_with_callback(fp, &fp->f_offset, args.resid,
  436             ibcs2_readdir_callback, &args);
  437         FRELE(fp);
  438         if (error)
  439                 return (error);
  440 
  441         *retval = SCARG(uap, nbytes) - args.resid;
  442         return (0);
  443 }
  444 
  445 int
  446 ibcs2_sys_read(p, v, retval)
  447         struct proc *p;
  448         void *v;
  449         register_t *retval;
  450 {
  451         struct ibcs2_sys_read_args /* {
  452                 syscallarg(int) fd;
  453                 syscallarg(char *) buf;
  454                 syscallarg(u_int) nbytes;
  455         } */ *uap = v;
  456         struct vnode *vp;
  457         struct ibcs2_readdir_callback_args args;
  458         struct file *fp;
  459         int error;
  460 
  461         if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0) {
  462                 if (error == EINVAL)
  463                         return sys_read(p, uap, retval);
  464                 else
  465                         return error;
  466         }
  467         if ((fp->f_flag & FREAD) == 0) {
  468                 error = EBADF;
  469                 goto bad;
  470         }
  471         vp = (struct vnode *)fp->f_data;
  472         if (vp->v_type != VDIR) {
  473                 FRELE(fp);
  474                 return sys_read(p, uap, retval);
  475         }
  476 
  477         args.resid = SCARG(uap, nbytes);
  478         args.outp = (caddr_t)SCARG(uap, buf);
  479 
  480         error = readdir_with_callback(fp, &fp->f_offset, args.resid,
  481             ibcs2_classicread_callback, &args);
  482 bad:
  483         FRELE(fp);
  484         if (error)
  485                 return (error);
  486 
  487         *retval = SCARG(uap, nbytes) - args.resid;      
  488         return (0);
  489 }
  490 
  491 int
  492 ibcs2_sys_mknod(p, v, retval)
  493         struct proc *p;
  494         void *v;
  495         register_t *retval;
  496 {
  497         struct ibcs2_sys_mknod_args /* {
  498                 syscallarg(char *) path;
  499                 syscallarg(int) mode;
  500                 syscallarg(int) dev;
  501         } */ *uap = v;
  502         caddr_t sg = stackgap_init(p->p_emul);
  503 
  504         IBCS2_CHECK_ALT_CREAT(p, &sg, SCARG(uap, path));
  505         if (S_ISFIFO(SCARG(uap, mode))) {
  506                 struct sys_mkfifo_args ap;
  507                 SCARG(&ap, path) = SCARG(uap, path);
  508                 SCARG(&ap, mode) = SCARG(uap, mode);
  509                 return sys_mkfifo(p, uap, retval);
  510         } else {
  511                 struct sys_mknod_args ap;
  512                 SCARG(&ap, path) = SCARG(uap, path);
  513                 SCARG(&ap, mode) = SCARG(uap, mode);
  514                 SCARG(&ap, dev) = SCARG(uap, dev);
  515                 return sys_mknod(p, &ap, retval);
  516         }
  517 }
  518 
  519 int
  520 ibcs2_sys_getgroups(p, v, retval)
  521         struct proc *p;
  522         void *v;
  523         register_t *retval;
  524 {
  525         struct ibcs2_sys_getgroups_args /* {
  526                 syscallarg(int) gidsetsize;
  527                 syscallarg(ibcs2_gid_t *) gidset;
  528         } */ *uap = v;
  529         int error, i;
  530         ibcs2_gid_t *iset = NULL;
  531         struct sys_getgroups_args sa;
  532         gid_t *gp;
  533         caddr_t sg = stackgap_init(p->p_emul);
  534 
  535         SCARG(&sa, gidsetsize) = SCARG(uap, gidsetsize);
  536         if (SCARG(uap, gidsetsize)) {
  537                 SCARG(&sa, gidset) = stackgap_alloc(&sg, NGROUPS_MAX *
  538                                                     sizeof(gid_t *));
  539                 iset = stackgap_alloc(&sg, SCARG(uap, gidsetsize) *
  540                                       sizeof(ibcs2_gid_t));
  541         }
  542         if ((error = sys_getgroups(p, &sa, retval)) != 0)
  543                 return error;
  544         if (iset) {
  545                 for (i = 0, gp = SCARG(&sa, gidset); i < retval[0]; i++)
  546                         iset[i] = (ibcs2_gid_t)*gp++;
  547                 if (retval[0] && (error = copyout((caddr_t)iset,
  548                     (caddr_t)SCARG(uap, gidset),
  549                     sizeof(ibcs2_gid_t) * retval[0])))
  550                         return error;
  551         }
  552         return 0;
  553 }
  554 
  555 int
  556 ibcs2_sys_setgroups(p, v, retval)
  557         struct proc *p;
  558         void *v;
  559         register_t *retval;
  560 {
  561         struct ibcs2_sys_setgroups_args /* {
  562                 syscallarg(int) gidsetsize;
  563                 syscallarg(ibcs2_gid_t *) gidset;
  564         } */ *uap = v;
  565         int error, i;
  566         ibcs2_gid_t *iset;
  567         struct sys_setgroups_args sa;
  568         gid_t *gp;
  569         caddr_t sg = stackgap_init(p->p_emul);
  570 
  571         SCARG(&sa, gidsetsize) = SCARG(uap, gidsetsize);
  572         gp = stackgap_alloc(&sg, SCARG(&sa, gidsetsize) * sizeof(gid_t *));
  573         iset = stackgap_alloc(&sg, SCARG(&sa, gidsetsize) *
  574                               sizeof(ibcs2_gid_t *));
  575         if (SCARG(&sa, gidsetsize)) {
  576                 error = copyin((caddr_t)SCARG(uap, gidset), (caddr_t)iset, 
  577                     sizeof(ibcs2_gid_t *) * SCARG(uap, gidsetsize));
  578                 if (error)
  579                         return error;
  580         }
  581         for (i = 0; i < SCARG(&sa, gidsetsize); i++)
  582                 gp[i]= (gid_t)iset[i];
  583         SCARG(&sa, gidset) = gp;
  584         return sys_setgroups(p, &sa, retval);
  585 }
  586 
  587 int
  588 ibcs2_sys_setuid(p, v, retval)
  589         struct proc *p;
  590         void *v;
  591         register_t *retval;
  592 {
  593         struct ibcs2_sys_setuid_args /* {
  594                 syscallarg(int) uid;
  595         } */ *uap = v;
  596         struct sys_setuid_args sa;
  597 
  598         SCARG(&sa, uid) = (uid_t)SCARG(uap, uid);
  599         return sys_setuid(p, &sa, retval);
  600 }
  601 
  602 int
  603 ibcs2_sys_setgid(p, v, retval)
  604         struct proc *p;
  605         void *v;
  606         register_t *retval;
  607 {
  608         struct ibcs2_sys_setgid_args /* {
  609                 syscallarg(int) gid;
  610         } */ *uap = v;
  611         struct sys_setgid_args sa;
  612 
  613         SCARG(&sa, gid) = (gid_t)SCARG(uap, gid);
  614         return sys_setgid(p, &sa, retval);
  615 }
  616 
  617 int
  618 xenix_sys_ftime(p, v, retval)
  619         struct proc *p;
  620         void *v;
  621         register_t *retval;
  622 {
  623         struct xenix_sys_ftime_args /* {
  624                 syscallarg(struct xenix_timeb *) tp;
  625         } */ *uap = v;
  626         struct timeval tv;
  627         extern struct timezone tz;
  628         struct xenix_timeb itb;
  629 
  630         microtime(&tv);
  631         itb.time = tv.tv_sec;
  632         itb.millitm = (tv.tv_usec / 1000);
  633         itb.timezone = tz.tz_minuteswest;
  634         itb.dstflag = tz.tz_dsttime;
  635         return copyout((caddr_t)&itb, (caddr_t)SCARG(uap, tp),
  636             xenix_timeb_len);
  637 }
  638 
  639 int
  640 ibcs2_sys_time(p, v, retval)
  641         struct proc *p;
  642         void *v;
  643         register_t *retval;
  644 {
  645         struct ibcs2_sys_time_args /* {
  646                 syscallarg(ibcs2_time_t *) tp;
  647         } */ *uap = v;
  648         struct timeval tv;
  649 
  650         microtime(&tv);
  651         *retval = tv.tv_sec;
  652         if (SCARG(uap, tp))
  653                 return copyout((caddr_t)&tv.tv_sec, (caddr_t)SCARG(uap, tp),
  654                                sizeof(ibcs2_time_t));
  655         else
  656                 return 0;
  657 }
  658 
  659 int
  660 ibcs2_sys_pathconf(p, v, retval)
  661         struct proc *p;
  662         void *v;
  663         register_t *retval;
  664 {
  665         struct ibcs2_sys_pathconf_args /* {
  666                 syscallarg(char *) path;
  667                 syscallarg(int) name;
  668         } */ *uap = v;
  669         SCARG(uap, name)++;     /* iBCS2 _PC_* defines are offset by one */
  670         return sys_pathconf(p, uap, retval);
  671 }
  672 
  673 int
  674 ibcs2_sys_fpathconf(p, v, retval)
  675         struct proc *p;
  676         void *v;
  677         register_t *retval;
  678 {
  679         struct ibcs2_sys_fpathconf_args /* {
  680                 syscallarg(int) fd;
  681                 syscallarg(int) name;
  682         } */ *uap = v;
  683         SCARG(uap, name)++;     /* iBCS2 _PC_* defines are offset by one */
  684         return sys_fpathconf(p, uap, retval);
  685 }
  686 
  687 int
  688 ibcs2_sys_sysconf(p, v, retval)
  689         struct proc *p;
  690         void *v;
  691         register_t *retval;
  692 {
  693         struct ibcs2_sys_sysconf_args /* {
  694                 syscallarg(int) name;
  695         } */ *uap = v;
  696         int mib[2], value, error;
  697         size_t len;
  698         struct sys___sysctl_args sa;
  699         struct sys_getrlimit_args ga;
  700 
  701         switch(SCARG(uap, name)) {
  702         case IBCS2_SC_ARG_MAX:
  703                 mib[1] = KERN_ARGMAX;
  704                 break;
  705 
  706         case IBCS2_SC_CHILD_MAX:
  707             {
  708                 caddr_t sg = stackgap_init(p->p_emul);
  709 
  710                 SCARG(&ga, which) = RLIMIT_NPROC;
  711                 SCARG(&ga, rlp) = stackgap_alloc(&sg, sizeof(struct rlimit *));
  712                 if ((error = sys_getrlimit(p, &ga, retval)) != 0)
  713                         return error;
  714                 *retval = SCARG(&ga, rlp)->rlim_cur;
  715                 return 0;
  716             }
  717 
  718         case IBCS2_SC_CLK_TCK:
  719                 *retval = hz;
  720                 return 0;
  721 
  722         case IBCS2_SC_NGROUPS_MAX:
  723                 mib[1] = KERN_NGROUPS;
  724                 break;
  725 
  726         case IBCS2_SC_OPEN_MAX:
  727             {
  728                 caddr_t sg = stackgap_init(p->p_emul);
  729 
  730                 SCARG(&ga, which) = RLIMIT_NOFILE;
  731                 SCARG(&ga, rlp) = stackgap_alloc(&sg, sizeof(struct rlimit *));
  732                 if ((error = sys_getrlimit(p, &ga, retval)) != 0)
  733                         return error;
  734                 *retval = SCARG(&ga, rlp)->rlim_cur;
  735                 return 0;
  736             }
  737                 
  738         case IBCS2_SC_JOB_CONTROL:
  739                 mib[1] = KERN_JOB_CONTROL;
  740                 break;
  741                 
  742         case IBCS2_SC_SAVED_IDS:
  743                 mib[1] = KERN_SAVED_IDS;
  744                 break;
  745                 
  746         case IBCS2_SC_VERSION:
  747                 mib[1] = KERN_POSIX1;
  748                 break;
  749                 
  750         case IBCS2_SC_PASS_MAX:
  751                 *retval = 128;          /* XXX - should we create PASS_MAX ? */
  752                 return 0;
  753 
  754         case IBCS2_SC_XOPEN_VERSION:
  755                 *retval = 2;            /* XXX: What should that be? */
  756                 return 0;
  757                 
  758         default:
  759                 return EINVAL;
  760         }
  761 
  762         mib[0] = CTL_KERN;
  763         len = sizeof(value);
  764         SCARG(&sa, name) = mib;
  765         SCARG(&sa, namelen) = 2;
  766         SCARG(&sa, old) = &value;
  767         SCARG(&sa, oldlenp) = &len;
  768         SCARG(&sa, new) = NULL;
  769         SCARG(&sa, newlen) = 0;
  770         if ((error = sys___sysctl(p, &sa, retval)) != 0)
  771                 return error;
  772         *retval = value;
  773         return 0;
  774 }
  775 
  776 int
  777 ibcs2_sys_alarm(p, v, retval)
  778         struct proc *p;
  779         void *v;
  780         register_t *retval;
  781 {
  782         struct ibcs2_sys_alarm_args /* {
  783                 syscallarg(unsigned) sec;
  784         } */ *uap = v;
  785         int error;
  786         struct itimerval *itp, *oitp;
  787         struct sys_setitimer_args sa;
  788         caddr_t sg = stackgap_init(p->p_emul);
  789 
  790         itp = stackgap_alloc(&sg, sizeof(*itp));
  791         oitp = stackgap_alloc(&sg, sizeof(*oitp));
  792         timerclear(&itp->it_interval);
  793         itp->it_value.tv_sec = SCARG(uap, sec);
  794         itp->it_value.tv_usec = 0;
  795 
  796         SCARG(&sa, which) = ITIMER_REAL;
  797         SCARG(&sa, itv) = itp;
  798         SCARG(&sa, oitv) = oitp;
  799         error = sys_setitimer(p, &sa, retval);
  800         if (error)
  801                 return error;
  802         if (oitp->it_value.tv_usec)
  803                 oitp->it_value.tv_sec++;
  804         *retval = oitp->it_value.tv_sec;
  805         return 0;
  806 }
  807 
  808 int
  809 ibcs2_sys_getmsg(p, v, retval)
  810         struct proc *p;
  811         void *v;
  812         register_t *retval;
  813 {
  814 #ifdef notyet
  815         struct ibcs2_sys_getmsg_args /* {
  816                 syscallarg(int) fd;
  817                 syscallarg(struct ibcs2_stropts *) ctl;
  818                 syscallarg(struct ibcs2_stropts *) dat;
  819                 syscallarg(int *) flags;
  820         } */ *uap = v;
  821 #endif
  822 
  823         return 0;
  824 }
  825 
  826 int
  827 ibcs2_sys_putmsg(p, v, retval)
  828         struct proc *p;
  829         void *v;
  830         register_t *retval;
  831 {
  832 #ifdef notyet
  833         struct ibcs2_sys_putmsg_args /* {
  834                 syscallarg(int) fd;
  835                 syscallarg(struct ibcs2_stropts *) ctl;
  836                 syscallarg(struct ibcs2_stropts *) dat;
  837                 syscallarg(int) flags;
  838         } */ *uap = v;
  839 #endif
  840 
  841         return 0;
  842 }
  843 
  844 int
  845 ibcs2_sys_times(p, v, retval)
  846         struct proc *p;
  847         void *v;
  848         register_t *retval;
  849 {
  850         struct ibcs2_sys_times_args /* {
  851                 syscallarg(struct tms *) tp;
  852         } */ *uap = v;
  853         int error;
  854         struct sys_getrusage_args ga;
  855         struct tms tms;
  856         struct timeval t;
  857         caddr_t sg = stackgap_init(p->p_emul);
  858         struct rusage *ru = stackgap_alloc(&sg, sizeof(*ru));
  859 #define CONVTCK(r)      (r.tv_sec * hz + r.tv_usec / (1000000 / hz))
  860 
  861         SCARG(&ga, who) = RUSAGE_SELF;
  862         SCARG(&ga, rusage) = ru;
  863         error = sys_getrusage(p, &ga, retval);
  864         if (error)
  865                 return error;
  866         tms.tms_utime = CONVTCK(ru->ru_utime);
  867         tms.tms_stime = CONVTCK(ru->ru_stime);
  868 
  869         SCARG(&ga, who) = RUSAGE_CHILDREN;
  870         error = sys_getrusage(p, &ga, retval);
  871         if (error)
  872                 return error;
  873         tms.tms_cutime = CONVTCK(ru->ru_utime);
  874         tms.tms_cstime = CONVTCK(ru->ru_stime);
  875 
  876         microtime(&t);
  877         *retval = CONVTCK(t);
  878         
  879         return copyout((caddr_t)&tms, (caddr_t)SCARG(uap, tp),
  880                        sizeof(struct tms));
  881 }
  882 
  883 int
  884 ibcs2_sys_stime(p, v, retval)
  885         struct proc *p;
  886         void *v;
  887         register_t *retval;
  888 {
  889         struct ibcs2_sys_stime_args /* {
  890                 syscallarg(long *) timep;
  891         } */ *uap = v;
  892         int error;
  893         struct sys_settimeofday_args sa;
  894         caddr_t sg = stackgap_init(p->p_emul);
  895         struct timeval *tvp;
  896 
  897         tvp = stackgap_alloc(&sg, sizeof(*SCARG(&sa, tv)));
  898         SCARG(&sa, tzp) = NULL;
  899         error = copyin((caddr_t)SCARG(uap, timep), (void *)&tvp->tv_sec,
  900             sizeof(long));
  901         if (error)
  902                 return error;
  903         tvp->tv_usec = 0;
  904         SCARG(&sa, tv) = tvp;
  905         if ((error = sys_settimeofday(p, &sa, retval)) != 0)
  906                 return EPERM;
  907         return 0;
  908 }
  909 
  910 int
  911 ibcs2_sys_utime(p, v, retval)
  912         struct proc *p;
  913         void *v;
  914         register_t *retval;
  915 {
  916         struct ibcs2_sys_utime_args /* {
  917                 syscallarg(char *) path;
  918                 syscallarg(struct ibcs2_utimbuf *) buf;
  919         } */ *uap = v;
  920         int error;
  921         struct sys_utimes_args sa;
  922         struct timeval *tp;
  923         caddr_t sg = stackgap_init(p->p_emul);
  924 
  925         tp = stackgap_alloc(&sg, 2 * sizeof(struct timeval *));
  926         IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
  927         SCARG(&sa, path) = SCARG(uap, path);
  928         if (SCARG(uap, buf)) {
  929                 struct ibcs2_utimbuf ubuf;
  930 
  931                 error = copyin((caddr_t)SCARG(uap, buf), (caddr_t)&ubuf,
  932                     sizeof(ubuf));
  933                 if (error)
  934                         return error;
  935                 tp[0].tv_sec = ubuf.actime;
  936                 tp[0].tv_usec = 0;
  937                 tp[1].tv_sec = ubuf.modtime;
  938                 tp[1].tv_usec = 0;
  939                 SCARG(&sa, tptr) = tp;
  940         } else
  941                 SCARG(&sa, tptr) = NULL;
  942         return sys_utimes(p, &sa, retval);
  943 }
  944 
  945 int
  946 ibcs2_sys_nice(p, v, retval)
  947         struct proc *p;
  948         void *v;
  949         register_t *retval;
  950 {
  951         struct ibcs2_sys_nice_args /* {
  952                 syscallarg(int) incr;
  953         } */ *uap = v;
  954         int error;
  955         struct sys_setpriority_args sa;
  956 
  957         SCARG(&sa, which) = PRIO_PROCESS;
  958         SCARG(&sa, who) = 0;
  959         SCARG(&sa, prio) = p->p_nice - PZERO + SCARG(uap, incr);
  960         if ((error = sys_setpriority(p, &sa, retval)) != 0)
  961                 return EPERM;
  962         *retval = p->p_nice - PZERO;
  963         return 0;
  964 }
  965 
  966 /*
  967  * iBCS2 getpgrp, setpgrp, setsid, and setpgid
  968  */
  969 
  970 int
  971 ibcs2_sys_pgrpsys(p, v, retval)
  972         struct proc *p;
  973         void *v;
  974         register_t *retval;
  975 {
  976         struct ibcs2_sys_pgrpsys_args /* {
  977                 syscallarg(int) type;
  978                 syscallarg(caddr_t) dummy;
  979                 syscallarg(int) pid;
  980                 syscallarg(int) pgid;
  981         } */ *uap = v;
  982         switch (SCARG(uap, type)) {
  983         case 0:                 /* getpgrp */
  984                 *retval = p->p_pgrp->pg_id;
  985                 return 0;
  986 
  987         case 1:                 /* setpgrp */
  988             {
  989                 struct sys_setpgid_args sa;
  990 
  991                 SCARG(&sa, pid) = 0;
  992                 SCARG(&sa, pgid) = 0;
  993                 sys_setpgid(p, &sa, retval);
  994                 *retval = p->p_pgrp->pg_id;
  995                 return 0;
  996             }
  997 
  998         case 2:                 /* setpgid */
  999             {
 1000                 struct sys_setpgid_args sa;
 1001 
 1002                 SCARG(&sa, pid) = SCARG(uap, pid);
 1003                 SCARG(&sa, pgid) = SCARG(uap, pgid);
 1004                 return sys_setpgid(p, &sa, retval);
 1005             }
 1006 
 1007         case 3:                 /* setsid */
 1008                 return sys_setsid(p, NULL, retval);
 1009 
 1010         default:
 1011                 return EINVAL;
 1012         }
 1013 }
 1014 
 1015 /*
 1016  * XXX - need to check for nested calls
 1017  */
 1018 
 1019 int
 1020 ibcs2_sys_plock(p, v, retval)
 1021         struct proc *p;
 1022         void *v;
 1023         register_t *retval;
 1024 {
 1025         struct ibcs2_sys_plock_args /* {
 1026                 syscallarg(int) cmd;
 1027         } */ *uap = v;
 1028         int error;
 1029 #define IBCS2_UNLOCK    0
 1030 #define IBCS2_PROCLOCK  1
 1031 #define IBCS2_TEXTLOCK  2
 1032 #define IBCS2_DATALOCK  4
 1033 
 1034         
 1035         if ((error = suser(p, 0)) != 0)
 1036                 return EPERM;
 1037         switch(SCARG(uap, cmd)) {
 1038         case IBCS2_UNLOCK:
 1039         case IBCS2_PROCLOCK:
 1040         case IBCS2_TEXTLOCK:
 1041         case IBCS2_DATALOCK:
 1042                 return 0;       /* XXX - TODO */
 1043         }
 1044         return EINVAL;
 1045 }
 1046 
 1047 int
 1048 ibcs2_sys_uadmin(p, v, retval)
 1049         struct proc *p;
 1050         void *v;
 1051         register_t *retval;
 1052 {
 1053         struct ibcs2_sys_uadmin_args /* {
 1054                 syscallarg(int) cmd;
 1055                 syscallarg(int) func;
 1056                 syscallarg(caddr_t) data;
 1057         } */ *uap = v;
 1058         int error;
 1059 
 1060 #define SCO_A_REBOOT        1
 1061 #define SCO_A_SHUTDOWN      2
 1062 #define SCO_A_REMOUNT       4
 1063 #define SCO_A_CLOCK         8
 1064 #define SCO_A_SETCONFIG     128
 1065 #define SCO_A_GETDEV        130
 1066 
 1067 #define SCO_AD_HALT         0
 1068 #define SCO_AD_BOOT         1
 1069 #define SCO_AD_IBOOT        2
 1070 #define SCO_AD_PWRDOWN      3
 1071 #define SCO_AD_PWRNAP       4
 1072 
 1073 #define SCO_AD_PANICBOOT    1
 1074 
 1075 #define SCO_AD_GETBMAJ      0
 1076 #define SCO_AD_GETCMAJ      1
 1077 
 1078         /* XXX: is this the right place for this call? */
 1079         if ((error = suser(p, 0)) != 0)
 1080                 return (error);
 1081 
 1082         switch(SCARG(uap, cmd)) {
 1083         case SCO_A_REBOOT:
 1084         case SCO_A_SHUTDOWN:
 1085                 switch(SCARG(uap, func)) {
 1086                 case SCO_AD_HALT:
 1087                 case SCO_AD_PWRDOWN:
 1088                 case SCO_AD_PWRNAP:
 1089                         boot(RB_HALT);
 1090                 case SCO_AD_BOOT:
 1091                 case SCO_AD_IBOOT:
 1092                         boot(RB_AUTOBOOT);
 1093                 }
 1094                 return EINVAL;
 1095         case SCO_A_REMOUNT:
 1096         case SCO_A_CLOCK:
 1097         case SCO_A_SETCONFIG:
 1098                 return 0;
 1099         case SCO_A_GETDEV:
 1100                 return EINVAL;  /* XXX - TODO */
 1101         }
 1102         return EINVAL;
 1103 }
 1104 
 1105 int
 1106 ibcs2_sys_sysfs(p, v, retval)
 1107         struct proc *p;
 1108         void *v;
 1109         register_t *retval;
 1110 {
 1111         struct ibcs2_sys_sysfs_args /* {
 1112                 syscallarg(int) cmd;
 1113                 syscallarg(caddr_t) d1;
 1114                 syscallarg(char *) buf;
 1115         } */ *uap = v;
 1116 
 1117 #define IBCS2_GETFSIND        1
 1118 #define IBCS2_GETFSTYP        2
 1119 #define IBCS2_GETNFSTYP       3
 1120 
 1121         switch(SCARG(uap, cmd)) {
 1122         case IBCS2_GETFSIND:
 1123         case IBCS2_GETFSTYP:
 1124         case IBCS2_GETNFSTYP:
 1125                 break;
 1126         }
 1127         return EINVAL;          /* XXX - TODO */
 1128 }
 1129 
 1130 int
 1131 xenix_sys_rdchk(p, v, retval)
 1132         struct proc *p;
 1133         void *v;
 1134         register_t *retval;
 1135 {
 1136         struct xenix_sys_rdchk_args /* {
 1137                 syscallarg(int) fd;
 1138         } */ *uap = v;
 1139         int error;
 1140         struct sys_ioctl_args sa;
 1141         caddr_t sg = stackgap_init(p->p_emul);
 1142 
 1143         SCARG(&sa, fd) = SCARG(uap, fd);
 1144         SCARG(&sa, com) = FIONREAD;
 1145         SCARG(&sa, data) = stackgap_alloc(&sg, sizeof(int));
 1146         if ((error = sys_ioctl(p, &sa, retval)) != 0)
 1147                 return error;
 1148         *retval = (*((int *)SCARG(&sa, data))) ? 1 : 0;
 1149         return 0;
 1150 }
 1151 
 1152 int
 1153 xenix_sys_chsize(p, v, retval)
 1154         struct proc *p;
 1155         void *v;
 1156         register_t *retval;
 1157 {
 1158         struct xenix_sys_chsize_args /* {
 1159                 syscallarg(int) fd;
 1160                 syscallarg(long) size;
 1161         } */ *uap = v;
 1162         struct sys_ftruncate_args sa;
 1163 
 1164         SCARG(&sa, fd) = SCARG(uap, fd);
 1165         SCARG(&sa, pad) = 0;
 1166         SCARG(&sa, length) = SCARG(uap, size);
 1167         return sys_ftruncate(p, &sa, retval);
 1168 }
 1169 
 1170 int
 1171 xenix_sys_nap(p, v, retval)
 1172         struct proc *p;
 1173         void *v;
 1174         register_t *retval;
 1175 {
 1176 #ifdef notyet
 1177         struct xenix_sys_nap_args /* {
 1178                 syscallarg(int) millisec;
 1179         } */ *uap = v;
 1180 #endif
 1181 
 1182         return ENOSYS;
 1183 }
 1184 
 1185 int
 1186 ibcs2_sys_unlink(p, v, retval)
 1187         struct proc *p;
 1188         void *v;
 1189         register_t *retval;
 1190 {
 1191         struct ibcs2_sys_unlink_args /* {
 1192                 syscallarg(char *) path;
 1193         } */ *uap = v;
 1194         caddr_t sg = stackgap_init(p->p_emul);
 1195 
 1196         IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
 1197         return sys_unlink(p, uap, retval);
 1198 }
 1199 
 1200 int
 1201 ibcs2_sys_chdir(p, v, retval)
 1202         struct proc *p;
 1203         void *v;
 1204         register_t *retval;
 1205 {
 1206         struct ibcs2_sys_chdir_args /* {
 1207                 syscallarg(char *) path;
 1208         } */ *uap = v;
 1209         caddr_t sg = stackgap_init(p->p_emul);
 1210 
 1211         IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
 1212         return sys_chdir(p, uap, retval);
 1213 }
 1214 
 1215 int
 1216 ibcs2_sys_chmod(p, v, retval)
 1217         struct proc *p;
 1218         void *v;
 1219         register_t *retval;
 1220 {
 1221         struct ibcs2_sys_chmod_args /* {
 1222                 syscallarg(char *) path;
 1223                 syscallarg(int) mode;
 1224         } */ *uap = v;
 1225         caddr_t sg = stackgap_init(p->p_emul);
 1226 
 1227         IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
 1228         return sys_chmod(p, uap, retval);
 1229 }
 1230 
 1231 int
 1232 ibcs2_sys_chown(p, v, retval)
 1233         struct proc *p;
 1234         void *v;
 1235         register_t *retval;
 1236 {
 1237         struct ibcs2_sys_chown_args /* {
 1238                 syscallarg(char *) path;
 1239                 syscallarg(int) uid;
 1240                 syscallarg(int) gid;
 1241         } */ *uap = v;
 1242         caddr_t sg = stackgap_init(p->p_emul);
 1243 
 1244         IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
 1245         return sys_chown(p, uap, retval);
 1246 }
 1247 
 1248 int
 1249 ibcs2_sys_rmdir(p, v, retval)
 1250         struct proc *p;
 1251         void *v;
 1252         register_t *retval;
 1253 {
 1254         struct ibcs2_sys_rmdir_args /* {
 1255                 syscallarg(char *) path;
 1256         } */ *uap = v;
 1257         caddr_t sg = stackgap_init(p->p_emul);
 1258 
 1259         IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
 1260         return sys_rmdir(p, uap, retval);
 1261 }
 1262 
 1263 int
 1264 ibcs2_sys_mkdir(p, v, retval)
 1265         struct proc *p;
 1266         void *v;
 1267         register_t *retval;
 1268 {
 1269         struct ibcs2_sys_mkdir_args /* {
 1270                 syscallarg(char *) path;
 1271                 syscallarg(int) mode;
 1272         } */ *uap = v;
 1273         caddr_t sg = stackgap_init(p->p_emul);
 1274 
 1275         IBCS2_CHECK_ALT_CREAT(p, &sg, SCARG(uap, path));
 1276         return sys_mkdir(p, uap, retval);
 1277 }
 1278 
 1279 int
 1280 ibcs2_sys_symlink(p, v, retval)
 1281         struct proc *p;
 1282         void *v;
 1283         register_t *retval;
 1284 {
 1285         struct ibcs2_sys_symlink_args /* {
 1286                 syscallarg(char *) path;
 1287                 syscallarg(char *) link;
 1288         } */ *uap = v;
 1289         caddr_t sg = stackgap_init(p->p_emul);
 1290 
 1291         IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
 1292         IBCS2_CHECK_ALT_CREAT(p, &sg, SCARG(uap, link));
 1293         return sys_symlink(p, uap, retval);
 1294 }
 1295 
 1296 int
 1297 ibcs2_sys_rename(p, v, retval)
 1298         struct proc *p;
 1299         void *v;
 1300         register_t *retval;
 1301 {
 1302         struct ibcs2_sys_rename_args /* {
 1303                 syscallarg(char *) from;
 1304                 syscallarg(char *) to;
 1305         } */ *uap = v;
 1306         caddr_t sg = stackgap_init(p->p_emul);
 1307 
 1308         IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, from));
 1309         IBCS2_CHECK_ALT_CREAT(p, &sg, SCARG(uap, to));
 1310         return sys_rename(p, uap, retval);
 1311 }
 1312 
 1313 int
 1314 ibcs2_sys_readlink(p, v, retval)
 1315         struct proc *p;
 1316         void *v;
 1317         register_t *retval;
 1318 {
 1319         struct ibcs2_sys_readlink_args /* {
 1320                 syscallarg(char *) path;
 1321                 syscallarg(char *) buf;
 1322                 syscallarg(int) count;
 1323         } */ *uap = v;
 1324         caddr_t sg = stackgap_init(p->p_emul);
 1325 
 1326         IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
 1327         return sys_readlink(p, uap, retval);
 1328 }
 1329 
 1330 int
 1331 ibcs2_sys_sysi86(p, v, retval)
 1332         struct proc *p;
 1333         void *v;
 1334         register_t *retval;
 1335 {
 1336         struct ibcs2_sys_sysi86_args /* {
 1337                 syscallarg(int) cmd;
 1338                 syscallarg(int) arg;
 1339         } */ *uap = v;
 1340         int val, error;
 1341 
 1342         switch (SCARG(uap, cmd)) {
 1343         case IBCS2_SI86FPHW:
 1344                 val = IBCS2_FP_NO;
 1345 #ifdef MATH_EMULATE
 1346                 val = IBCS2_FP_SW;
 1347 #else
 1348                 val = IBCS2_FP_387;             /* a real coprocessor */
 1349 #endif
 1350                 if ((error = copyout((caddr_t)&val, (caddr_t)SCARG(uap, arg),
 1351                                      sizeof(val))))
 1352                         return error;
 1353                 break;
 1354 
 1355         case IBCS2_SI86STIME:           /* XXX - not used much, if at all */
 1356         case IBCS2_SI86SETNAME:
 1357                 return EINVAL;
 1358 
 1359         case IBCS2_SI86PHYSMEM:
 1360                 *retval = ctob(physmem);
 1361                 break;
 1362 
 1363         default:
 1364                 return EINVAL;
 1365         }
 1366         return 0;
 1367 }

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