]>
Commit | Line | Data |
---|---|---|
a6df500f | 1 | /* sem.cc: XSI IPC interface for Cygwin. |
1c001dd2 | 2 | |
61522196 | 3 | Copyright 2002, 2003, 2004, 2005, 2008, 2009, 2012 Red Hat, Inc. |
1c001dd2 CS |
4 | |
5 | This file is part of Cygwin. | |
6 | ||
7 | This software is a copyrighted work licensed under the terms of the | |
8 | Cygwin license. Please consult the file "CYGWIN_LICENSE" for | |
9 | details. */ | |
10 | ||
11 | #include "winsup.h" | |
a6df500f | 12 | #include <unistd.h> |
1c001dd2 | 13 | |
a6df500f | 14 | #include "sigproc.h" |
1c001dd2 | 15 | |
a6df500f | 16 | #include "cygserver_sem.h" |
893ac8e0 | 17 | #include "cygtls.h" |
a6df500f CV |
18 | |
19 | /* | |
20 | * client_request_sem Constructors | |
21 | */ | |
22 | ||
23 | client_request_sem::client_request_sem (int semid, | |
24 | int semnum, | |
25 | int cmd, | |
26 | union semun *arg) | |
27 | : client_request (CYGSERVER_REQUEST_SEM, &_parameters, sizeof (_parameters)) | |
28 | { | |
29 | _parameters.in.semop = SEMOP_semctl; | |
30 | ipc_set_proc_info (_parameters.in.ipcblk); | |
31 | ||
32 | _parameters.in.ctlargs.semid = semid; | |
33 | _parameters.in.ctlargs.semnum = semnum; | |
34 | _parameters.in.ctlargs.cmd = cmd; | |
35 | _parameters.in.ctlargs.arg = arg; | |
36 | ||
37 | msglen (sizeof (_parameters.in)); | |
38 | } | |
39 | ||
40 | client_request_sem::client_request_sem (key_t key, | |
41 | int nsems, | |
42 | int semflg) | |
43 | : client_request (CYGSERVER_REQUEST_SEM, &_parameters, sizeof (_parameters)) | |
44 | { | |
45 | _parameters.in.semop = SEMOP_semget; | |
46 | ipc_set_proc_info (_parameters.in.ipcblk); | |
47 | ||
48 | _parameters.in.getargs.key = key; | |
49 | _parameters.in.getargs.nsems = nsems; | |
50 | _parameters.in.getargs.semflg = semflg; | |
51 | ||
52 | msglen (sizeof (_parameters.in)); | |
53 | } | |
54 | ||
55 | client_request_sem::client_request_sem (int semid, | |
56 | struct sembuf *sops, | |
57 | size_t nsops) | |
58 | : client_request (CYGSERVER_REQUEST_SEM, &_parameters, sizeof (_parameters)) | |
59 | { | |
60 | _parameters.in.semop = SEMOP_semop; | |
61 | ipc_set_proc_info (_parameters.in.ipcblk); | |
62 | ||
63 | _parameters.in.opargs.semid = semid; | |
64 | _parameters.in.opargs.sops = sops; | |
65 | _parameters.in.opargs.nsops = nsops; | |
66 | ||
67 | msglen (sizeof (_parameters.in)); | |
68 | } | |
a6df500f CV |
69 | |
70 | /* | |
71 | * XSI semaphore API. These are exported by the DLL. | |
72 | */ | |
1c001dd2 CS |
73 | |
74 | extern "C" int | |
75 | semctl (int semid, int semnum, int cmd, ...) | |
76 | { | |
a6df500f CV |
77 | union semun arg = {0}; |
78 | if (cmd == IPC_STAT || cmd == IPC_SET || cmd == IPC_INFO || cmd == SEM_INFO | |
79 | || cmd == GETALL || cmd == SETALL || cmd == SETVAL) | |
80 | { | |
81 | va_list ap; | |
82 | va_start (ap, cmd); | |
83 | arg = va_arg (ap, union semun); | |
84 | va_end (ap); | |
85 | } | |
61522196 CV |
86 | syscall_printf ("semctl (semid = %d, semnum = %d, cmd = %d, arg = %p)", |
87 | semid, semnum, cmd, arg.buf); | |
893ac8e0 CF |
88 | myfault efault; |
89 | if (efault.faulted (EFAULT)) | |
a6df500f CV |
90 | return -1; |
91 | client_request_sem request (semid, semnum, cmd, &arg); | |
92 | if (request.make_request () == -1 || request.retval () == -1) | |
93 | { | |
94 | syscall_printf ("-1 [%d] = semctl ()", request.error_code ()); | |
95 | set_errno (request.error_code ()); | |
bd0e3521 | 96 | if (request.error_code () == ENOSYS) |
e3778517 | 97 | raise (SIGSYS); |
a6df500f CV |
98 | return -1; |
99 | } | |
100 | return request.retval (); | |
1c001dd2 CS |
101 | } |
102 | ||
103 | extern "C" int | |
104 | semget (key_t key, int nsems, int semflg) | |
105 | { | |
61522196 | 106 | syscall_printf ("semget (key = %U, nsems = %d, semflg = %y)", |
a6df500f CV |
107 | key, nsems, semflg); |
108 | client_request_sem request (key, nsems, semflg); | |
109 | if (request.make_request () == -1 || request.retval () == -1) | |
110 | { | |
6b0d86c5 | 111 | syscall_printf ("-1 [%d] = semget ()", request.error_code ()); |
a6df500f | 112 | set_errno (request.error_code ()); |
bd0e3521 | 113 | if (request.error_code () == ENOSYS) |
e3778517 | 114 | raise (SIGSYS); |
a6df500f CV |
115 | return -1; |
116 | } | |
117 | return request.retval (); | |
1c001dd2 CS |
118 | } |
119 | ||
120 | extern "C" int | |
121 | semop (int semid, struct sembuf *sops, size_t nsops) | |
122 | { | |
61522196 | 123 | syscall_printf ("semop (semid = %d, sops = %p, nsops = %ld)", |
a6df500f | 124 | semid, sops, nsops); |
893ac8e0 CF |
125 | myfault efault; |
126 | if (efault.faulted (EFAULT)) | |
a6df500f CV |
127 | return -1; |
128 | client_request_sem request (semid, sops, nsops); | |
129 | if (request.make_request () == -1 || request.retval () == -1) | |
130 | { | |
6b0d86c5 | 131 | syscall_printf ("-1 [%d] = semop ()", request.error_code ()); |
a6df500f | 132 | set_errno (request.error_code ()); |
bd0e3521 | 133 | if (request.error_code () == ENOSYS) |
e3778517 | 134 | raise (SIGSYS); |
a6df500f CV |
135 | return -1; |
136 | } | |
137 | return request.retval (); | |
1c001dd2 | 138 | } |