Home | History | Annotate | Line # | Download | only in netbsd32
netbsd32_compat_50_sysv.c revision 1.1
      1 /*	$NetBSD: netbsd32_compat_50_sysv.c,v 1.1 2015/12/03 10:38:21 pgoyette Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2008 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Christos Zoulas.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  * 3. All advertising materials mentioning features or use of this software
     19  *    must display the following acknowledgement:
     20  *        This product includes software developed by the NetBSD
     21  *        Foundation, Inc. and its contributors.
     22  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23  *    contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36  * POSSIBILITY OF SUCH DAMAGE.
     37  */
     38 #include <sys/cdefs.h>
     39 __KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_50_sysv.c,v 1.1 2015/12/03 10:38:21 pgoyette Exp $");
     40 
     41 #if defined(_KERNEL_OPT)
     42 #include "opt_sysv.h"
     43 #include "opt_compat_netbsd.h"
     44 #endif
     45 
     46 #include <sys/param.h>
     47 #include <sys/systm.h>
     48 #include <sys/msg.h>
     49 #include <sys/sem.h>
     50 #include <sys/shm.h>
     51 
     52 #include <compat/netbsd32/netbsd32.h>
     53 #include <compat/netbsd32/netbsd32_syscallargs.h>
     54 #include <compat/netbsd32/netbsd32_conv.h>
     55 
     56 #if defined(COMPAT_50)
     57 
     58 #if defined(SYSVSEM)
     59 
     60 int
     61 compat_50_netbsd32___semctl14(struct lwp *l, const struct compat_50_netbsd32___semctl14_args *uap, register_t *retval)
     62 {
     63 	return do_netbsd32___semctl14(l, uap, retval, NULL);
     64 }
     65 
     66 int
     67 do_netbsd32___semctl14(struct lwp *l, const struct compat_50_netbsd32___semctl14_args *uap, register_t *retval, void *vkarg)
     68 {
     69 	/* {
     70 		syscallarg(int) semid;
     71 		syscallarg(int) semnum;
     72 		syscallarg(int) cmd;
     73 		syscallarg(netbsd32_semun50p_t) arg;
     74 	} */
     75 	struct semid_ds sembuf;
     76 	struct netbsd32_semid_ds50 sembuf32;
     77 	int cmd, error;
     78 	void *pass_arg;
     79 	union __semun karg;
     80 	union netbsd32_semun50 karg32;
     81 
     82 	cmd = SCARG(uap, cmd);
     83 
     84 	switch (cmd) {
     85 	case IPC_SET:
     86 	case IPC_STAT:
     87 		pass_arg = &sembuf;
     88 		break;
     89 
     90 	case GETALL:
     91 	case SETVAL:
     92 	case SETALL:
     93 		pass_arg = &karg;
     94 		break;
     95 	default:
     96 		pass_arg = NULL;
     97 		break;
     98 	}
     99 
    100 	if (pass_arg) {
    101 		if (vkarg != NULL)
    102 			karg32 = *(union netbsd32_semun50 *)vkarg;
    103 		else {
    104 			error = copyin(SCARG_P32(uap, arg), &karg32,
    105 					sizeof(karg32));
    106 			if (error)
    107 				return error;
    108 		}
    109 		if (pass_arg == &karg) {
    110 			switch (cmd) {
    111 			case GETALL:
    112 			case SETALL:
    113 				karg.array = NETBSD32PTR64(karg32.array);
    114 				break;
    115 			case SETVAL:
    116 				karg.val = karg32.val;
    117 				break;
    118 			}
    119 		}
    120 		if (cmd == IPC_SET) {
    121 			error = copyin(NETBSD32PTR64(karg32.buf), &sembuf32,
    122 			    sizeof(sembuf32));
    123 			if (error)
    124 				return (error);
    125 			netbsd32_to_semid_ds50(&sembuf32, &sembuf);
    126 		}
    127 	}
    128 
    129 	error = semctl1(l, SCARG(uap, semid), SCARG(uap, semnum), cmd,
    130 	    pass_arg, retval);
    131 
    132 	if (error == 0 && cmd == IPC_STAT) {
    133 		netbsd32_from_semid_ds50(&sembuf, &sembuf32);
    134 		error = copyout(&sembuf32, NETBSD32PTR64(karg32.buf),
    135 		    sizeof(sembuf32));
    136 	}
    137 
    138 	return (error);
    139 }
    140 #endif
    141 
    142 #if defined(SYSVMSG)
    143 
    144 int
    145 compat_50_netbsd32___msgctl13(struct lwp *l, const struct compat_50_netbsd32___msgctl13_args *uap, register_t *retval)
    146 {
    147 	/* {
    148 		syscallarg(int) msqid;
    149 		syscallarg(int) cmd;
    150 		syscallarg(netbsd32_msqid_ds50p_t) buf;
    151 	} */
    152 	struct msqid_ds ds;
    153 	struct netbsd32_msqid_ds50 ds32;
    154 	int error, cmd;
    155 
    156 	cmd = SCARG(uap, cmd);
    157 	if (cmd == IPC_SET) {
    158 		error = copyin(SCARG_P32(uap, buf), &ds32, sizeof(ds32));
    159 		if (error)
    160 			return error;
    161 		netbsd32_to_msqid_ds50(&ds32, &ds);
    162 	}
    163 
    164 	error = msgctl1(l, SCARG(uap, msqid), cmd,
    165 	    (cmd == IPC_SET || cmd == IPC_STAT) ? &ds : NULL);
    166 
    167 	if (error == 0 && cmd == IPC_STAT) {
    168 		netbsd32_from_msqid_ds50(&ds, &ds32);
    169 		error = copyout(&ds32, SCARG_P32(uap, buf), sizeof(ds32));
    170 	}
    171 
    172 	return error;
    173 }
    174 #endif
    175 
    176 #if defined(SYSVSHM)
    177 
    178 int
    179 compat_50_netbsd32___shmctl13(struct lwp *l, const struct compat_50_netbsd32___shmctl13_args *uap, register_t *retval)
    180 {
    181 	/* {
    182 		syscallarg(int) shmid;
    183 		syscallarg(int) cmd;
    184 		syscallarg(netbsd32_shmid_ds50p_t) buf;
    185 	} */
    186 	struct shmid_ds ds;
    187 	struct netbsd32_shmid_ds50 ds32;
    188 	int error, cmd;
    189 
    190 	cmd = SCARG(uap, cmd);
    191 	if (cmd == IPC_SET) {
    192 		error = copyin(SCARG_P32(uap, buf), &ds32, sizeof(ds32));
    193 		if (error)
    194 			return error;
    195 		netbsd32_to_shmid_ds50(&ds32, &ds);
    196 	}
    197 
    198 	error = shmctl1(l, SCARG(uap, shmid), cmd,
    199 	    (cmd == IPC_SET || cmd == IPC_STAT) ? &ds : NULL);
    200 
    201 	if (error == 0 && cmd == IPC_STAT) {
    202 		netbsd32_from_shmid_ds50(&ds, &ds32);
    203 		error = copyout(&ds32, SCARG_P32(uap, buf), sizeof(ds32));
    204 	}
    205 
    206 	return error;
    207 }
    208 #endif
    209 
    210 #endif /* COMPAT_50 */
    211