diff options
Diffstat (limited to 'usr/src/lib/libbc/libc/sys/common/semsys.c')
-rw-r--r-- | usr/src/lib/libbc/libc/sys/common/semsys.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/usr/src/lib/libbc/libc/sys/common/semsys.c b/usr/src/lib/libbc/libc/sys/common/semsys.c new file mode 100644 index 0000000000..be523f6a3a --- /dev/null +++ b/usr/src/lib/libbc/libc/sys/common/semsys.c @@ -0,0 +1,118 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* Copyright (c) 1984 AT&T */ +/* All Rights Reserved */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +#include <syscall.h> +#include <varargs.h> +#include <sys/types.h> +#include <sys/ipc.h> +#include <sys/sem.h> + +/* semsys dispatch argument */ +#define SEMCTL 0 +#define SEMGET 1 +#define SEMOP 2 + +/*VARARGS3*/ +semctl(semid, semnum, cmd, arg) +int semid, cmd; +int semnum; +union semun arg; +{ + switch (cmd) { + + case IPC_STAT: + case IPC_SET: + cmd += 10; + /* fall-through */ + case SETVAL: + case GETALL: + case SETALL: + return(_syscall(SYS_semsys,SEMCTL,semid,semnum,cmd,arg.val)); + + case IPC_RMID: + cmd += 10; + /* fall-through */ + default: + return(_syscall(SYS_semsys,SEMCTL,semid,semnum,cmd,0)); + } +} + +semget(key, nsems, semflg) +key_t key; +int nsems, semflg; +{ + return(_syscall(SYS_semsys, SEMGET, key, nsems, semflg)); +} + +semop(semid, sops, nsops) +int semid; +struct sembuf *sops; +int nsops; +{ + return(_syscall(SYS_semsys, SEMOP, semid, sops, nsops)); +} + +semsys(sysnum, va_alist) +int sysnum; +va_dcl +{ + va_list ap; + int semid, cmd; + int semnum, val; + union semun arg; + key_t key; + int nsems, semflg; + struct sembuf *sops; + int nsops; + + va_start(ap); + switch (sysnum) { + case SEMCTL: + semid=va_arg(ap, int); + semnum=va_arg(ap, int); + cmd=va_arg(ap, int); + val=va_arg(ap, int); + if ((cmd == IPC_STAT) || (cmd == IPC_SET) || (cmd == IPC_RMID)) + cmd += 10; + return(_syscall(SYS_semsys, SEMCTL, semid, semnum, cmd, val)); + case SEMGET: + key=va_arg(ap, key_t); + nsems=va_arg(ap, int); + semflg=va_arg(ap, int); + return(semget(key, nsems, semflg)); + case SEMOP: + semid=va_arg(ap, int); + sops=va_arg(ap, struct sembuf *); + nsops=va_arg(ap, int); + return(semop(semid, sops, nsops)); + } +} + |