1*0Sstevel@tonic-gate /*
2*0Sstevel@tonic-gate  * CDDL HEADER START
3*0Sstevel@tonic-gate  *
4*0Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*0Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*0Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*0Sstevel@tonic-gate  * with the License.
8*0Sstevel@tonic-gate  *
9*0Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*0Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*0Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*0Sstevel@tonic-gate  * and limitations under the License.
13*0Sstevel@tonic-gate  *
14*0Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*0Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*0Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*0Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*0Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*0Sstevel@tonic-gate  *
20*0Sstevel@tonic-gate  * CDDL HEADER END
21*0Sstevel@tonic-gate  */
22*0Sstevel@tonic-gate /*
23*0Sstevel@tonic-gate  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24*0Sstevel@tonic-gate  * Use is subject to license terms.
25*0Sstevel@tonic-gate  */
26*0Sstevel@tonic-gate 
27*0Sstevel@tonic-gate /*      Copyright (c) 1984 AT&T */
28*0Sstevel@tonic-gate /*        All Rights Reserved   */
29*0Sstevel@tonic-gate 
30*0Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*0Sstevel@tonic-gate 
32*0Sstevel@tonic-gate #include	<syscall.h>
33*0Sstevel@tonic-gate #include	<varargs.h>
34*0Sstevel@tonic-gate #include	<sys/types.h>
35*0Sstevel@tonic-gate #include	<sys/ipc.h>
36*0Sstevel@tonic-gate #include	<sys/sem.h>
37*0Sstevel@tonic-gate 
38*0Sstevel@tonic-gate /* semsys dispatch argument */
39*0Sstevel@tonic-gate #define SEMCTL  0
40*0Sstevel@tonic-gate #define SEMGET  1
41*0Sstevel@tonic-gate #define SEMOP   2
42*0Sstevel@tonic-gate 
43*0Sstevel@tonic-gate /*VARARGS3*/
44*0Sstevel@tonic-gate semctl(semid, semnum, cmd, arg)
45*0Sstevel@tonic-gate int semid, cmd;
46*0Sstevel@tonic-gate int semnum;
47*0Sstevel@tonic-gate union semun arg;
48*0Sstevel@tonic-gate {
49*0Sstevel@tonic-gate 	switch (cmd) {
50*0Sstevel@tonic-gate 
51*0Sstevel@tonic-gate 	case IPC_STAT:
52*0Sstevel@tonic-gate 	case IPC_SET:
53*0Sstevel@tonic-gate 		cmd += 10;
54*0Sstevel@tonic-gate 		/* fall-through */
55*0Sstevel@tonic-gate 	case SETVAL:
56*0Sstevel@tonic-gate 	case GETALL:
57*0Sstevel@tonic-gate 	case SETALL:
58*0Sstevel@tonic-gate 		return(_syscall(SYS_semsys,SEMCTL,semid,semnum,cmd,arg.val));
59*0Sstevel@tonic-gate 
60*0Sstevel@tonic-gate 	case IPC_RMID:
61*0Sstevel@tonic-gate 		cmd += 10;
62*0Sstevel@tonic-gate 		/* fall-through */
63*0Sstevel@tonic-gate 	default:
64*0Sstevel@tonic-gate 		return(_syscall(SYS_semsys,SEMCTL,semid,semnum,cmd,0));
65*0Sstevel@tonic-gate 	}
66*0Sstevel@tonic-gate }
67*0Sstevel@tonic-gate 
68*0Sstevel@tonic-gate semget(key, nsems, semflg)
69*0Sstevel@tonic-gate key_t key;
70*0Sstevel@tonic-gate int nsems, semflg;
71*0Sstevel@tonic-gate {
72*0Sstevel@tonic-gate 	return(_syscall(SYS_semsys, SEMGET, key, nsems, semflg));
73*0Sstevel@tonic-gate }
74*0Sstevel@tonic-gate 
75*0Sstevel@tonic-gate semop(semid, sops, nsops)
76*0Sstevel@tonic-gate int semid;
77*0Sstevel@tonic-gate struct sembuf *sops;
78*0Sstevel@tonic-gate int nsops;
79*0Sstevel@tonic-gate {
80*0Sstevel@tonic-gate 	return(_syscall(SYS_semsys, SEMOP, semid, sops, nsops));
81*0Sstevel@tonic-gate }
82*0Sstevel@tonic-gate 
83*0Sstevel@tonic-gate semsys(sysnum, va_alist)
84*0Sstevel@tonic-gate int sysnum;
85*0Sstevel@tonic-gate va_dcl
86*0Sstevel@tonic-gate {
87*0Sstevel@tonic-gate 	va_list ap;
88*0Sstevel@tonic-gate 	int semid, cmd;
89*0Sstevel@tonic-gate 	int semnum, val;
90*0Sstevel@tonic-gate 	union semun arg;
91*0Sstevel@tonic-gate 	key_t key;
92*0Sstevel@tonic-gate 	int nsems, semflg;
93*0Sstevel@tonic-gate 	struct sembuf *sops;
94*0Sstevel@tonic-gate 	int nsops;
95*0Sstevel@tonic-gate 
96*0Sstevel@tonic-gate 	va_start(ap);
97*0Sstevel@tonic-gate 	switch (sysnum) {
98*0Sstevel@tonic-gate 	case SEMCTL:
99*0Sstevel@tonic-gate 		semid=va_arg(ap, int);
100*0Sstevel@tonic-gate 		semnum=va_arg(ap, int);
101*0Sstevel@tonic-gate 		cmd=va_arg(ap, int);
102*0Sstevel@tonic-gate 		val=va_arg(ap, int);
103*0Sstevel@tonic-gate 		if ((cmd == IPC_STAT) || (cmd == IPC_SET) || (cmd == IPC_RMID))
104*0Sstevel@tonic-gate 			cmd += 10;
105*0Sstevel@tonic-gate 		return(_syscall(SYS_semsys, SEMCTL, semid, semnum, cmd, val));
106*0Sstevel@tonic-gate 	case SEMGET:
107*0Sstevel@tonic-gate 		key=va_arg(ap, key_t);
108*0Sstevel@tonic-gate 		nsems=va_arg(ap, int);
109*0Sstevel@tonic-gate 		semflg=va_arg(ap, int);
110*0Sstevel@tonic-gate 		return(semget(key, nsems, semflg));
111*0Sstevel@tonic-gate 	case SEMOP:
112*0Sstevel@tonic-gate 		semid=va_arg(ap, int);
113*0Sstevel@tonic-gate 		sops=va_arg(ap, struct sembuf *);
114*0Sstevel@tonic-gate 		nsops=va_arg(ap, int);
115*0Sstevel@tonic-gate 		return(semop(semid, sops, nsops));
116*0Sstevel@tonic-gate 	}
117*0Sstevel@tonic-gate }
118*0Sstevel@tonic-gate 
119