root/compat/svr4/svr4_ipc.c

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

DEFINITIONS

This source file includes following definitions.
  1. svr4_to_bsd_ipc_perm
  2. bsd_to_svr4_ipc_perm
  3. bsd_to_svr4_semid_ds
  4. svr4_to_bsd_semid_ds
  5. svr4_semctl
  6. svr4_semget
  7. svr4_semop
  8. svr4_sys_semsys
  9. bsd_to_svr4_msqid_ds
  10. svr4_to_bsd_msqid_ds
  11. svr4_msgsnd
  12. svr4_msgrcv
  13. svr4_msgget
  14. svr4_msgctl
  15. svr4_sys_msgsys
  16. bsd_to_svr4_shmid_ds
  17. svr4_to_bsd_shmid_ds
  18. svr4_shmat
  19. svr4_shmdt
  20. svr4_shmget
  21. svr4_shmctl
  22. svr4_sys_shmsys

    1 /*      $OpenBSD: svr4_ipc.c,v 1.9 2002/03/14 01:26:51 millert Exp $    */
    2 /*      $NetBSD: svr4_ipc.c,v 1.3 1997/03/30 17:21:02 christos Exp $    */
    3 
    4 /*
    5  * Copyright (c) 1995 Christos Zoulas.  All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  * 3. All advertising materials mentioning features or use of this software
   16  *    must display the following acknowledgement:
   17  *      This product includes software developed by Christos Zoulas.
   18  * 4. The name of the author may not be used to endorse or promote products
   19  *    derived from this software without specific prior written permission.
   20  *
   21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   24  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   26  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   31  * 
   32  * Mostly stolen from: linux_ipc.c,v 1.4 1995/06/24 20:20:22 christos Exp
   33  */
   34 
   35 #include <sys/types.h>
   36 #include <sys/param.h>
   37 #include <sys/kernel.h>
   38 #include <sys/shm.h>
   39 #include <sys/msg.h>
   40 #include <sys/sem.h>
   41 #include <sys/proc.h>
   42 #include <sys/uio.h>
   43 #include <sys/time.h>
   44 #include <sys/malloc.h>
   45 #include <sys/mman.h>
   46 #include <sys/systm.h>
   47 #include <sys/stat.h>
   48 
   49 #include <sys/mount.h>
   50 #include <sys/syscallargs.h>
   51 
   52 #include <compat/svr4/svr4_types.h>
   53 #include <compat/svr4/svr4_signal.h>
   54 #include <compat/svr4/svr4_syscallargs.h>
   55 #include <compat/svr4/svr4_util.h>
   56 #include <compat/svr4/svr4_ipc.h>
   57 
   58 #if defined(SYSVMSG) || defined(SYSVSHM) || defined(SYSVSEM)
   59 static void svr4_to_bsd_ipc_perm(const struct svr4_ipc_perm *,
   60                                       struct ipc_perm *);
   61 static void bsd_to_svr4_ipc_perm(const struct ipc_perm *,
   62                                       struct svr4_ipc_perm *);
   63 #endif
   64 
   65 #ifdef SYSVSEM
   66 static void bsd_to_svr4_semid_ds(const struct semid_ds *,
   67                                       struct svr4_semid_ds *);
   68 static void svr4_to_bsd_semid_ds(const struct svr4_semid_ds *,
   69                                       struct semid_ds *);
   70 static int svr4_semop(struct proc *, void *, register_t *);
   71 static int svr4_semget(struct proc *, void *, register_t *);
   72 static int svr4_semctl(struct proc *, void *, register_t *);
   73 #endif
   74 
   75 #ifdef SYSVMSG
   76 static void bsd_to_svr4_msqid_ds(const struct msqid_ds *,
   77                                       struct svr4_msqid_ds *);
   78 static void svr4_to_bsd_msqid_ds(const struct svr4_msqid_ds *,
   79                                       struct msqid_ds *);
   80 static int svr4_msgsnd(struct proc *, void *, register_t *);
   81 static int svr4_msgrcv(struct proc *, void *, register_t *);
   82 static int svr4_msgget(struct proc *, void *, register_t *);
   83 static int svr4_msgctl(struct proc *, void *, register_t *);
   84 #endif
   85 
   86 #ifdef SYSVSHM
   87 static void bsd_to_svr4_shmid_ds(const struct shmid_ds *,
   88                                       struct svr4_shmid_ds *);
   89 static void svr4_to_bsd_shmid_ds(const struct svr4_shmid_ds *,
   90                                       struct shmid_ds *);
   91 static int svr4_shmat(struct proc *, void *, register_t *);
   92 static int svr4_shmdt(struct proc *, void *, register_t *);
   93 static int svr4_shmget(struct proc *, void *, register_t *);
   94 static int svr4_shmctl(struct proc *, void *, register_t *);
   95 #endif
   96 
   97 #if defined(SYSVMSG) || defined(SYSVSHM) || defined(SYSVSEM)
   98 
   99 static void
  100 svr4_to_bsd_ipc_perm(spp, bpp)
  101         const struct svr4_ipc_perm *spp;
  102         struct ipc_perm *bpp;
  103 {
  104         bpp->key = spp->key;
  105         bpp->uid = spp->uid;
  106         bpp->gid = spp->gid;
  107         bpp->cuid = spp->cuid;
  108         bpp->cgid = spp->cgid;
  109         bpp->mode = spp->mode;
  110         bpp->seq = spp->seq;
  111 }
  112 
  113 static void
  114 bsd_to_svr4_ipc_perm(bpp, spp)
  115         const struct ipc_perm *bpp;
  116         struct svr4_ipc_perm *spp;
  117 {
  118         spp->key = bpp->key;
  119         spp->uid = bpp->uid;
  120         spp->gid = bpp->gid;
  121         spp->cuid = bpp->cuid;
  122         spp->cgid = bpp->cgid;
  123         spp->mode = bpp->mode;
  124         spp->seq = bpp->seq;
  125 }
  126 #endif
  127 
  128 #ifdef SYSVSEM
  129 static void
  130 bsd_to_svr4_semid_ds(bds, sds)
  131         const struct semid_ds *bds;
  132         struct svr4_semid_ds *sds;
  133 {
  134         bsd_to_svr4_ipc_perm(&bds->sem_perm, &sds->sem_perm);
  135         sds->sem_base = (struct svr4_sem *) bds->sem_base;
  136         sds->sem_nsems = bds->sem_nsems;
  137         sds->sem_otime = bds->sem_otime;
  138         sds->sem_pad1 = bds->sem_pad1;
  139         sds->sem_ctime = bds->sem_ctime;
  140         sds->sem_pad2 = bds->sem_pad2;
  141 }
  142 
  143 static void
  144 svr4_to_bsd_semid_ds(sds, bds)
  145         const struct svr4_semid_ds *sds;
  146         struct semid_ds *bds;
  147 {
  148         svr4_to_bsd_ipc_perm(&sds->sem_perm, &bds->sem_perm);
  149         bds->sem_base = (struct sem *) sds->sem_base;
  150         bds->sem_nsems = sds->sem_nsems;
  151         bds->sem_otime = sds->sem_otime;
  152         bds->sem_pad1 = sds->sem_pad1;
  153         bds->sem_ctime = sds->sem_ctime;
  154         bds->sem_pad2 = sds->sem_pad2;
  155 }
  156 
  157 struct svr4_sys_semctl_args {
  158         syscallarg(int) what;
  159         syscallarg(int) semid;
  160         syscallarg(int) semnum;
  161         syscallarg(int) cmd;
  162         syscallarg(void *) arg;
  163 };
  164 
  165 static int
  166 svr4_semctl(p, v, retval)
  167         struct proc *p;
  168         void *v;
  169         register_t *retval;
  170 {
  171         int error;
  172         struct svr4_sys_semctl_args *uap = v;
  173         struct sys___semctl_args ap;
  174         struct svr4_semid_ds ss;
  175         struct semid_ds bs;
  176         caddr_t sg = stackgap_init(p->p_emul);
  177 
  178         SCARG(&ap, semid) = SCARG(uap, semid);
  179         SCARG(&ap, semnum) = SCARG(uap, semnum);
  180 
  181         switch (SCARG(uap, cmd)) {
  182         case SVR4_SEM_GETZCNT:
  183         case SVR4_SEM_GETNCNT:
  184         case SVR4_SEM_GETPID:
  185         case SVR4_SEM_GETVAL:
  186                 switch (SCARG(uap, cmd)) {
  187                 case SVR4_SEM_GETZCNT:
  188                         SCARG(&ap, cmd) = GETZCNT;
  189                         break;
  190                 case SVR4_SEM_GETNCNT:
  191                         SCARG(&ap, cmd) = GETNCNT;
  192                         break;
  193                 case SVR4_SEM_GETPID:
  194                         SCARG(&ap, cmd) = GETPID;
  195                         break;
  196                 case SVR4_SEM_GETVAL:
  197                         SCARG(&ap, cmd) = GETVAL;
  198                         break;
  199                 }
  200                 return sys___semctl(p, &ap, retval);
  201 
  202         case SVR4_SEM_SETVAL:
  203                 SCARG(&ap, arg)->val = (int) SCARG(uap, arg);
  204                 SCARG(&ap, cmd) = SETVAL;
  205                 return sys___semctl(p, &ap, retval);
  206 
  207         case SVR4_SEM_GETALL:
  208                 SCARG(&ap, arg)->array = SCARG(uap, arg);
  209                 SCARG(&ap, cmd) = GETVAL;
  210                 return sys___semctl(p, &ap, retval);
  211 
  212         case SVR4_SEM_SETALL:
  213                 SCARG(&ap, arg)->array = SCARG(uap, arg);
  214                 SCARG(&ap, cmd) = SETVAL;
  215                 return sys___semctl(p, &ap, retval);
  216 
  217         case SVR4_IPC_STAT:
  218                 SCARG(&ap, cmd) = IPC_STAT;
  219                 SCARG(&ap, arg)->buf = stackgap_alloc(&sg, sizeof(bs));
  220                 if ((error = sys___semctl(p, &ap, retval)) != 0)
  221                         return error;
  222                 error = copyin(SCARG(&ap, arg)->buf, &bs, sizeof bs);
  223                 if (error)
  224                         return error;
  225                 bsd_to_svr4_semid_ds(&bs, &ss);
  226                 return copyout(&ss, SCARG(uap, arg), sizeof ss);
  227 
  228         case SVR4_IPC_SET:
  229                 SCARG(&ap, cmd) = IPC_SET;
  230                 SCARG(&ap, arg)->buf = stackgap_alloc(&sg, sizeof(bs));
  231                 error = copyin(SCARG(uap, arg), (caddr_t) &ss, sizeof ss);
  232                 if (error)
  233                         return error;
  234                 svr4_to_bsd_semid_ds(&ss, &bs);
  235                 error = copyout(&bs, SCARG(&ap, arg)->buf, sizeof bs);
  236                 if (error)
  237                         return error;
  238                 return sys___semctl(p, &ap, retval);
  239 
  240         case SVR4_IPC_RMID:
  241                 SCARG(&ap, cmd) = IPC_RMID;
  242                 SCARG(&ap, arg)->buf = stackgap_alloc(&sg, sizeof(bs));
  243                 error = copyin(SCARG(uap, arg), &ss, sizeof ss);
  244                 if (error)
  245                         return error;
  246                 svr4_to_bsd_semid_ds(&ss, &bs);
  247                 error = copyout(&bs, SCARG(&ap, arg)->buf, sizeof bs);
  248                 if (error)
  249                         return error;
  250                 return sys___semctl(p, &ap, retval);
  251 
  252         default:
  253                 return EINVAL;
  254         }
  255 }
  256 
  257 struct svr4_sys_semget_args {
  258         syscallarg(int) what;
  259         syscallarg(svr4_key_t) key;
  260         syscallarg(int) nsems;
  261         syscallarg(int) semflg;
  262 };
  263 
  264 static int
  265 svr4_semget(p, v, retval)
  266         struct proc *p;
  267         void *v;
  268         register_t *retval;
  269 {
  270         struct svr4_sys_semget_args *uap = v;
  271         struct sys_semget_args ap;
  272 
  273         SCARG(&ap, key) = SCARG(uap, key);
  274         SCARG(&ap, nsems) = SCARG(uap, nsems);
  275         SCARG(&ap, semflg) = SCARG(uap, semflg);
  276 
  277         return sys_semget(p, &ap, retval);
  278 }
  279 
  280 struct svr4_sys_semop_args {
  281         syscallarg(int) what;
  282         syscallarg(int) semid;
  283         syscallarg(struct svr4_sembuf *) sops;
  284         syscallarg(u_int) nsops;
  285 };
  286 
  287 static int
  288 svr4_semop(p, v, retval)
  289         struct proc *p;
  290         void *v;
  291         register_t *retval;
  292 {
  293         struct svr4_sys_semop_args *uap = v;
  294         struct sys_semop_args ap;
  295 
  296         SCARG(&ap, semid) = SCARG(uap, semid);
  297         /* These are the same */
  298         SCARG(&ap, sops) = (struct sembuf *) SCARG(uap, sops);
  299         SCARG(&ap, nsops) = SCARG(uap, nsops);
  300 
  301         return sys_semop(p, &ap, retval);
  302 }
  303 
  304 int
  305 svr4_sys_semsys(p, v, retval)
  306         struct proc *p;
  307         void *v;
  308         register_t *retval;
  309 {
  310         struct svr4_sys_semsys_args *uap = v;
  311 
  312         DPRINTF(("svr4_semsys(%d)\n", SCARG(uap, what)));
  313 
  314         switch (SCARG(uap, what)) {
  315         case SVR4_semctl:
  316                 return svr4_semctl(p, v, retval);
  317         case SVR4_semget:
  318                 return svr4_semget(p, v, retval);
  319         case SVR4_semop:
  320                 return svr4_semop(p, v, retval);
  321         default:
  322                 return EINVAL;
  323         }
  324 }
  325 #endif
  326 
  327 #ifdef SYSVMSG
  328 static void
  329 bsd_to_svr4_msqid_ds(bds, sds)
  330         const struct msqid_ds *bds;
  331         struct svr4_msqid_ds *sds;
  332 {
  333         bsd_to_svr4_ipc_perm(&bds->msg_perm, &sds->msg_perm);
  334         sds->msg_first = (struct svr4_msg *) bds->msg_first;
  335         sds->msg_last = (struct svr4_msg *) bds->msg_last;
  336         sds->msg_cbytes = bds->msg_cbytes;
  337         sds->msg_qnum = bds->msg_qnum;
  338         sds->msg_qbytes = bds->msg_qbytes;
  339         sds->msg_lspid = bds->msg_lspid;
  340         sds->msg_lrpid = bds->msg_lrpid;
  341         sds->msg_stime = bds->msg_stime;
  342         sds->msg_pad1 = bds->msg_pad1;
  343         sds->msg_rtime = bds->msg_rtime;
  344         sds->msg_pad2 = bds->msg_pad2;
  345         sds->msg_ctime = bds->msg_ctime;
  346         sds->msg_pad3 = bds->msg_pad3;
  347 
  348         /* use the padding for the rest of the fields */
  349         {
  350                 const short *pad = (const short *) bds->msg_pad4;
  351                 sds->msg_cv = pad[0];
  352                 sds->msg_qnum_cv = pad[1];
  353         }
  354 }
  355 
  356 static void
  357 svr4_to_bsd_msqid_ds(sds, bds)
  358         const struct svr4_msqid_ds *sds;
  359         struct msqid_ds *bds;
  360 {
  361         svr4_to_bsd_ipc_perm(&sds->msg_perm, &bds->msg_perm);
  362         bds->msg_first = (struct msg *) sds->msg_first;
  363         bds->msg_last = (struct msg *) sds->msg_last;
  364         bds->msg_cbytes = sds->msg_cbytes;
  365         bds->msg_qnum = sds->msg_qnum;
  366         bds->msg_qbytes = sds->msg_qbytes;
  367         bds->msg_lspid = sds->msg_lspid;
  368         bds->msg_lrpid = sds->msg_lrpid;
  369         bds->msg_stime = sds->msg_stime;
  370         bds->msg_pad1 = sds->msg_pad1;
  371         bds->msg_rtime = sds->msg_rtime;
  372         bds->msg_pad2 = sds->msg_pad2;
  373         bds->msg_ctime = sds->msg_ctime;
  374         bds->msg_pad3 = sds->msg_pad3;
  375 
  376         /* use the padding for the rest of the fields */
  377         {
  378                 short *pad = (short *) bds->msg_pad4;
  379                 pad[0] = sds->msg_cv;
  380                 pad[1] = sds->msg_qnum_cv;
  381         }
  382 }
  383 
  384 struct svr4_sys_msgsnd_args {
  385         syscallarg(int) what;
  386         syscallarg(int) msqid;
  387         syscallarg(void *) msgp;
  388         syscallarg(size_t) msgsz;
  389         syscallarg(int) msgflg;
  390 };
  391 
  392 static int
  393 svr4_msgsnd(p, v, retval)
  394         struct proc *p;
  395         void *v;
  396         register_t *retval;
  397 {
  398         struct svr4_sys_msgsnd_args *uap = v;
  399         struct sys_msgsnd_args ap;
  400 
  401         SCARG(&ap, msqid) = SCARG(uap, msqid);
  402         SCARG(&ap, msgp) = SCARG(uap, msgp);
  403         SCARG(&ap, msgsz) = SCARG(uap, msgsz);
  404         SCARG(&ap, msgflg) = SCARG(uap, msgflg);
  405 
  406         return sys_msgsnd(p, &ap, retval);
  407 }
  408 
  409 struct svr4_sys_msgrcv_args {
  410         syscallarg(int) what;
  411         syscallarg(int) msqid;
  412         syscallarg(void *) msgp;
  413         syscallarg(size_t) msgsz;
  414         syscallarg(long) msgtyp;
  415         syscallarg(int) msgflg;
  416 };
  417 
  418 static int
  419 svr4_msgrcv(p, v, retval)
  420         struct proc *p;
  421         void *v;
  422         register_t *retval;
  423 {
  424         struct svr4_sys_msgrcv_args *uap = v;
  425         struct sys_msgrcv_args ap;
  426 
  427         SCARG(&ap, msqid) = SCARG(uap, msqid);
  428         SCARG(&ap, msgp) = SCARG(uap, msgp);
  429         SCARG(&ap, msgsz) = SCARG(uap, msgsz);
  430         SCARG(&ap, msgtyp) = SCARG(uap, msgtyp);
  431         SCARG(&ap, msgflg) = SCARG(uap, msgflg);
  432 
  433         return sys_msgrcv(p, &ap, retval);
  434 }
  435         
  436 struct svr4_sys_msgget_args {
  437         syscallarg(int) what;
  438         syscallarg(svr4_key_t) key;
  439         syscallarg(int) msgflg;
  440 };
  441 
  442 static int
  443 svr4_msgget(p, v, retval)
  444         struct proc *p;
  445         void *v;
  446         register_t *retval;
  447 {
  448         struct svr4_sys_msgget_args *uap = v;
  449         struct sys_msgget_args ap;
  450 
  451         SCARG(&ap, key) = SCARG(uap, key);
  452         SCARG(&ap, msgflg) = SCARG(uap, msgflg);
  453 
  454         return sys_msgget(p, &ap, retval);
  455 }
  456 
  457 struct svr4_sys_msgctl_args {
  458         syscallarg(int) what;
  459         syscallarg(int) msqid;
  460         syscallarg(int) cmd;
  461         syscallarg(struct svr4_msqid_ds *) buf;
  462 };
  463 
  464 static int
  465 svr4_msgctl(p, v, retval)
  466         struct proc *p;
  467         void *v;
  468         register_t *retval;
  469 {
  470         int error;
  471         struct svr4_sys_msgctl_args *uap = v;
  472         struct sys_msgctl_args ap;
  473         struct svr4_msqid_ds ss;
  474         struct msqid_ds bs;
  475         caddr_t sg = stackgap_init(p->p_emul);
  476 
  477         SCARG(&ap, msqid) = SCARG(uap, msqid);
  478         SCARG(&ap, cmd) = SCARG(uap, cmd);
  479         SCARG(&ap, buf) = stackgap_alloc(&sg, sizeof(bs));
  480 
  481         switch (SCARG(uap, cmd)) {
  482         case SVR4_IPC_STAT:
  483                 SCARG(&ap, cmd) = IPC_STAT;
  484                 if ((error = sys_msgctl(p, &ap, retval)) != 0)
  485                         return error;
  486                 error = copyin(SCARG(&ap, buf), &bs, sizeof bs);
  487                 if (error)
  488                         return error;
  489                 bsd_to_svr4_msqid_ds(&bs, &ss);
  490                 return copyout(&ss, SCARG(uap, buf), sizeof ss);
  491 
  492         case SVR4_IPC_SET:
  493                 SCARG(&ap, cmd) = IPC_SET;
  494                 error = copyin(SCARG(uap, buf), &ss, sizeof ss);
  495                 if (error)
  496                         return error;
  497                 svr4_to_bsd_msqid_ds(&ss, &bs);
  498                 error = copyout(&bs, SCARG(&ap, buf), sizeof bs);
  499                 if (error)
  500                         return error;
  501                 return sys_msgctl(p, &ap, retval);
  502 
  503         case SVR4_IPC_RMID:
  504                 SCARG(&ap, cmd) = IPC_RMID;
  505                 error = copyin(SCARG(uap, buf), &ss, sizeof ss);
  506                 if (error)
  507                         return error;
  508                 svr4_to_bsd_msqid_ds(&ss, &bs);
  509                 error = copyout(&bs, SCARG(&ap, buf), sizeof bs);
  510                 if (error)
  511                         return error;
  512                 return sys_msgctl(p, &ap, retval);
  513 
  514         default:
  515                 return EINVAL;
  516         }
  517 }
  518 
  519 int
  520 svr4_sys_msgsys(p, v, retval)
  521         struct proc *p;
  522         void *v;
  523         register_t *retval;
  524 {
  525         struct svr4_sys_msgsys_args *uap = v;
  526 
  527         DPRINTF(("svr4_msgsys(%d)\n", SCARG(uap, what)));
  528 
  529         switch (SCARG(uap, what)) {
  530         case SVR4_msgsnd:
  531                 return svr4_msgsnd(p, v, retval);
  532         case SVR4_msgrcv:
  533                 return svr4_msgrcv(p, v, retval);
  534         case SVR4_msgget:
  535                 return svr4_msgget(p, v, retval);
  536         case SVR4_msgctl:
  537                 return svr4_msgctl(p, v, retval);
  538         default:
  539                 return EINVAL;
  540         }
  541 }
  542 #endif
  543 
  544 #ifdef SYSVSHM
  545 
  546 static void
  547 bsd_to_svr4_shmid_ds(bds, sds)
  548         const struct shmid_ds *bds;
  549         struct svr4_shmid_ds *sds;
  550 {
  551         bsd_to_svr4_ipc_perm(&bds->shm_perm, &sds->shm_perm);
  552         sds->shm_segsz = bds->shm_segsz;
  553         sds->shm_lkcnt = 0;
  554         sds->shm_lpid = bds->shm_lpid;
  555         sds->shm_cpid = bds->shm_cpid;
  556         sds->shm_amp = bds->shm_internal;
  557         sds->shm_nattch = bds->shm_nattch;
  558         sds->shm_cnattch = 0;
  559         sds->shm_atime = bds->shm_atime;
  560         sds->shm_pad1 = 0;
  561         sds->shm_dtime = bds->shm_dtime;
  562         sds->shm_pad2 = 0;
  563         sds->shm_ctime = bds->shm_ctime;
  564         sds->shm_pad3 = 0;
  565 }
  566 
  567 static void
  568 svr4_to_bsd_shmid_ds(sds, bds)
  569         const struct svr4_shmid_ds *sds;
  570         struct shmid_ds *bds;
  571 {
  572         svr4_to_bsd_ipc_perm(&sds->shm_perm, &bds->shm_perm);
  573         bds->shm_segsz = sds->shm_segsz;
  574         bds->shm_lpid = sds->shm_lpid;
  575         bds->shm_cpid = sds->shm_cpid;
  576         bds->shm_internal = sds->shm_amp;
  577         bds->shm_nattch = sds->shm_nattch;
  578         bds->shm_atime = sds->shm_atime;
  579         bds->shm_dtime = sds->shm_dtime;
  580         bds->shm_ctime = sds->shm_ctime;
  581 }
  582 
  583 struct svr4_sys_shmat_args {
  584         syscallarg(int) what;
  585         syscallarg(int) shmid;
  586         syscallarg(void *) shmaddr;
  587         syscallarg(int) shmflg;
  588 };
  589 
  590 static int
  591 svr4_shmat(p, v, retval)
  592         struct proc *p;
  593         void *v;
  594         register_t *retval;
  595 {
  596         struct svr4_sys_shmat_args *uap = v;
  597         struct sys_shmat_args ap;
  598 
  599         SCARG(&ap, shmid) = SCARG(uap, shmid);
  600         SCARG(&ap, shmaddr) = SCARG(uap, shmaddr);
  601         SCARG(&ap, shmflg) = SCARG(uap, shmflg);
  602 
  603         return sys_shmat(p, &ap, retval);
  604 }
  605 
  606 struct svr4_sys_shmdt_args {
  607         syscallarg(int) what;
  608         syscallarg(void *) shmaddr;
  609 };
  610 
  611 static int
  612 svr4_shmdt(p, v, retval)
  613         struct proc *p;
  614         void *v;
  615         register_t *retval;
  616 {
  617         struct svr4_sys_shmdt_args *uap = v;
  618         struct sys_shmdt_args ap;
  619 
  620         SCARG(&ap, shmaddr) = SCARG(uap, shmaddr);
  621 
  622         return sys_shmdt(p, &ap, retval);
  623 }
  624 
  625 struct svr4_sys_shmget_args {
  626         syscallarg(int) what;
  627         syscallarg(key_t) key;
  628         syscallarg(int) size;
  629         syscallarg(int) shmflg;
  630 };
  631 
  632 static int
  633 svr4_shmget(p, v, retval)
  634         struct proc *p;
  635         void *v;
  636         register_t *retval;
  637 {
  638         struct svr4_sys_shmget_args *uap = v;
  639         struct sys_shmget_args ap;
  640 
  641         SCARG(&ap, key) = SCARG(uap, key);
  642         SCARG(&ap, size) = SCARG(uap, size);
  643         SCARG(&ap, shmflg) = SCARG(uap, shmflg);
  644 
  645         return sys_shmget(p, &ap, retval);
  646 }
  647 
  648 struct svr4_sys_shmctl_args {
  649         syscallarg(int) what;
  650         syscallarg(int) shmid;
  651         syscallarg(int) cmd;
  652         syscallarg(struct svr4_shmid_ds *) buf;
  653 };
  654 
  655 int
  656 svr4_shmctl(p, v, retval)
  657         struct proc *p;
  658         void *v;
  659         register_t *retval;
  660 {
  661         struct svr4_sys_shmctl_args *uap = v;
  662         int error;
  663         caddr_t sg = stackgap_init(p->p_emul);
  664         struct sys_shmctl_args ap;
  665         struct shmid_ds bs;
  666         struct svr4_shmid_ds ss;
  667 
  668         SCARG(&ap, shmid) = SCARG(uap, shmid);
  669 
  670         if (SCARG(uap, buf) != NULL) {
  671                 SCARG(&ap, buf) = stackgap_alloc(&sg, sizeof (struct shmid_ds));
  672                 switch (SCARG(uap, cmd)) {
  673                 case SVR4_IPC_SET:
  674                 case SVR4_IPC_RMID:
  675                 case SVR4_SHM_LOCK:
  676                 case SVR4_SHM_UNLOCK:
  677                         error = copyin(SCARG(uap, buf), (caddr_t) &ss,
  678                             sizeof ss);
  679                         if (error)
  680                                 return error;
  681                         svr4_to_bsd_shmid_ds(&ss, &bs);
  682                         error = copyout(&bs, SCARG(&ap, buf), sizeof bs);
  683                         if (error)
  684                                 return error;
  685                         break;
  686                 default:
  687                         break;
  688                 }
  689         }
  690         else
  691                 SCARG(&ap, buf) = NULL;
  692 
  693 
  694         switch (SCARG(uap, cmd)) {
  695         case SVR4_IPC_STAT:
  696                 SCARG(&ap, cmd) = IPC_STAT;
  697                 if ((error = sys_shmctl(p, &ap, retval)) != 0)
  698                         return error;
  699                 if (SCARG(uap, buf) == NULL)
  700                         return 0;
  701                 error = copyin(SCARG(&ap, buf), &bs, sizeof bs);
  702                 if (error)
  703                         return error;
  704                 bsd_to_svr4_shmid_ds(&bs, &ss);
  705                 return copyout(&ss, SCARG(uap, buf), sizeof ss);
  706 
  707         case SVR4_IPC_SET:
  708                 SCARG(&ap, cmd) = IPC_SET;
  709                 return sys_shmctl(p, &ap, retval);
  710 
  711         case SVR4_IPC_RMID:
  712         case SVR4_SHM_LOCK:
  713         case SVR4_SHM_UNLOCK:
  714                 switch (SCARG(uap, cmd)) {
  715                 case SVR4_IPC_RMID:
  716                         SCARG(&ap, cmd) = IPC_RMID;
  717                         break;
  718                 case SVR4_SHM_LOCK:
  719                         SCARG(&ap, cmd) = SHM_LOCK;
  720                         break;
  721                 case SVR4_SHM_UNLOCK:
  722                         SCARG(&ap, cmd) = SHM_UNLOCK;
  723                         break;
  724                 default:
  725                         return EINVAL;
  726                 }
  727                 return sys_shmctl(p, &ap, retval);
  728 
  729         default:
  730                 return EINVAL;
  731         }
  732 }
  733 
  734 int
  735 svr4_sys_shmsys(p, v, retval)
  736         struct proc *p;
  737         void *v;
  738         register_t *retval;
  739 {
  740         struct svr4_sys_shmsys_args *uap = v;
  741 
  742         DPRINTF(("svr4_shmsys(%d)\n", SCARG(uap, what)));
  743 
  744         switch (SCARG(uap, what)) {
  745         case SVR4_shmat:
  746                 return svr4_shmat(p, v, retval);
  747         case SVR4_shmdt:
  748                 return svr4_shmdt(p, v, retval);
  749         case SVR4_shmget:
  750                 return svr4_shmget(p, v, retval);
  751         case SVR4_shmctl:
  752                 return svr4_shmctl(p, v, retval);
  753         default:
  754                 return ENOSYS;
  755         }
  756 }
  757 #endif /* SYSVSHM */

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