Annotation of sys/compat/osf1/osf1_signal.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: osf1_signal.c,v 1.9 2000/08/04 15:47:55 ericj Exp $ */
2: /* $NetBSD: osf1_signal.c,v 1.15 1999/05/05 00:57:43 cgd Exp $ */
3:
4: /*
5: * Copyright (c) 1999 Christopher G. Demetriou. 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 Christopher G. Demetriou
18: * for the NetBSD Project.
19: * 4. The name of the author may not be used to endorse or promote products
20: * derived from this software without specific prior written permission
21: *
22: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32: */
33:
34: #include <sys/param.h>
35: #include <sys/systm.h>
36: #include <sys/namei.h>
37: #include <sys/proc.h>
38: #include <sys/filedesc.h>
39: #include <sys/ioctl.h>
40: #include <sys/mount.h>
41: #include <sys/kernel.h>
42: #include <sys/signal.h>
43: #include <sys/signalvar.h>
44: #include <sys/malloc.h>
45:
46: #include <sys/syscallargs.h>
47:
48: #include <compat/osf1/osf1.h>
49: #include <compat/osf1/osf1_signal.h>
50: #include <compat/osf1/osf1_syscallargs.h>
51: #include <compat/osf1/osf1_util.h>
52: #include <compat/osf1/osf1_cvt.h>
53:
54: #if 0
55: int
56: osf1_sys_kill(p, v, retval)
57: struct proc *p;
58: void *v;
59: register_t *retval;
60: {
61: struct osf1_sys_kill_args *uap = v;
62: struct sys_kill_args ka;
63:
64: SCARG(&ka, pid) = SCARG(uap, pid);
65: SCARG(&ka, signum) = osf1_signal_xlist[SCARG(uap, signum)];
66: return sys_kill(p, &ka, retval);
67: }
68: #endif
69:
70: int
71: osf1_sys_sigaction(p, v, retval)
72: struct proc *p;
73: void *v;
74: register_t *retval;
75: {
76: struct osf1_sys_sigaction_args *uap = v;
77: struct osf1_sigaction *nosa, *oosa, tmposa;
78: struct sigaction *nbsa, *obsa, tmpbsa;
79: struct sys_sigaction_args sa;
80: caddr_t sg;
81: int error;
82:
83: sg = stackgap_init(p->p_emul);
84: nosa = SCARG(uap, nsa);
85: oosa = SCARG(uap, osa);
86:
87: if (oosa != NULL)
88: obsa = stackgap_alloc(&sg, sizeof(struct sigaction));
89: else
90: obsa = NULL;
91:
92: if (nosa != NULL) {
93: nbsa = stackgap_alloc(&sg, sizeof(struct sigaction));
94: if ((error = copyin(nosa, &tmposa, sizeof(tmposa))) != 0)
95: return error;
96: osf1_cvt_sigaction_to_native(&tmposa, &tmpbsa);
97: if ((error = copyout(&tmpbsa, nbsa, sizeof(tmpbsa))) != 0)
98: return error;
99: } else
100: nbsa = NULL;
101:
102: SCARG(&sa, signum) = osf1_signal_xlist[SCARG(uap, signum)];
103: SCARG(&sa, nsa) = nbsa;
104: SCARG(&sa, osa) = obsa;
105:
106: /* XXX */
107: if ((error = sys_sigaction(p, &sa, retval)) != 0)
108: return error;
109:
110: if (oosa != NULL) {
111: if ((error = copyin(obsa, &tmpbsa, sizeof(tmpbsa))) != 0)
112: return error;
113: osf1_cvt_sigaction_from_native(&tmpbsa, &tmposa);
114: if ((error = copyout(&tmposa, oosa, sizeof(tmposa))) != 0)
115: return error;
116: }
117:
118: return 0;
119: }
120:
121: int
122: osf1_sys_sigaltstack(p, v, retval)
123: struct proc *p;
124: void *v;
125: register_t *retval;
126: {
127: struct osf1_sys_sigaltstack_args *uap = v;
128: struct osf1_sigaltstack *noss, *ooss, tmposs;
129: struct sigaltstack *nbss, *obss, tmpbss;
130: struct sys_sigaltstack_args sa;
131: caddr_t sg;
132: int error;
133:
134: sg = stackgap_init(p->p_emul);
135: noss = SCARG(uap, nss);
136: ooss = SCARG(uap, oss);
137:
138: if (ooss != NULL)
139: obss = stackgap_alloc(&sg, sizeof(struct sigaltstack));
140: else
141: obss = NULL;
142:
143: if (noss != NULL) {
144: nbss = stackgap_alloc(&sg, sizeof(struct sigaltstack));
145: if ((error = copyin(noss, &tmposs, sizeof(tmposs))) != 0)
146: return error;
147: if ((error = osf1_cvt_sigaltstack_to_native(&tmposs, &tmpbss)) != 0)
148: return error;
149: if ((error = copyout(&tmpbss, nbss, sizeof(tmpbss))) != 0)
150: return error;
151: } else
152: nbss = NULL;
153:
154: SCARG(&sa, nss) = nbss;
155: SCARG(&sa, oss) = obss;
156:
157: /* XXX */
158: if ((error = sys_sigaltstack(p, &sa, retval)) != 0)
159: return error;
160:
161: if (obss != NULL) {
162: if ((error = copyin(obss, &tmpbss, sizeof(tmpbss))) != 0)
163: return error;
164: osf1_cvt_sigaltstack_from_native(&tmpbss, &tmposs);
165: if ((error = copyout(&tmposs, ooss, sizeof(tmposs))) != 0)
166: return error;
167: }
168:
169: return 0;
170: }
171:
172: #if 0
173: int
174: osf1_sys_signal(p, v, retval)
175: struct proc *p;
176: void *v;
177: register_t *retval;
178: {
179: struct osf1_sys_signal_args *uap = v;
180: int signum = osf1_signal_xlist[OSF1_SIGNO(SCARG(uap, signum))];
181: int error;
182: caddr_t sg = stackgap_init(p->p_emul);
183:
184: if (signum <= 0 || signum >= OSF1_NSIG) {
185: if (OSF1_SIGCALL(SCARG(uap, signum)) == OSF1_SIGNAL_MASK ||
186: OSF1_SIGCALL(SCARG(uap, signum)) == OSF1_SIGDEFER_MASK)
187: *retval = (int)OSF1_SIG_ERR;
188: return EINVAL;
189: }
190:
191: switch (OSF1_SIGCALL(SCARG(uap, signum))) {
192: case OSF1_SIGDEFER_MASK:
193: /*
194: * sigset is identical to signal() except
195: * that SIG_HOLD is allowed as
196: * an action.
197: */
198: if (SCARG(uap, handler) == OSF1_SIG_HOLD) {
199: struct sys_sigprocmask_args sa;
200:
201: SCARG(&sa, how) = SIG_BLOCK;
202: SCARG(&sa, mask) = sigmask(signum);
203: return sys_sigprocmask(p, &sa, retval);
204: }
205: /* FALLTHROUGH */
206:
207: case OSF1_SIGNAL_MASK:
208: {
209: struct sys_sigaction_args sa_args;
210: struct sigaction *nbsa, *obsa, sa;
211:
212: nbsa = stackgap_alloc(&sg, sizeof(struct sigaction));
213: obsa = stackgap_alloc(&sg, sizeof(struct sigaction));
214: SCARG(&sa_args, signum) = signum;
215: SCARG(&sa_args, nsa) = nbsa;
216: SCARG(&sa_args, osa) = obsa;
217:
218: sa.sa_handler = SCARG(uap, handler);
219: sigemptyset(&sa.sa_mask);
220: sa.sa_flags = 0;
221: #if 0
222: if (signum != SIGALRM)
223: sa.sa_flags = SA_RESTART;
224: #endif
225: if ((error = copyout(&sa, nbsa, sizeof(sa))) != 0)
226: return error;
227: if ((error = sys_sigaction(p, &sa_args, retval)) != 0) {
228: DPRINTF(("signal: sigaction failed: %d\n",
229: error));
230: *retval = (int)OSF1_SIG_ERR;
231: return error;
232: }
233: if ((error = copyin(obsa, &sa, sizeof(sa))) != 0)
234: return error;
235: *retval = (int)sa.sa_handler;
236: return 0;
237: }
238:
239: case OSF1_SIGHOLD_MASK:
240: {
241: struct sys_sigprocmask_args sa;
242:
243: SCARG(&sa, how) = SIG_BLOCK;
244: SCARG(&sa, mask) = sigmask(signum);
245: return sys_sigprocmask(p, &sa, retval);
246: }
247:
248: case OSF1_SIGRELSE_MASK:
249: {
250: struct sys_sigprocmask_args sa;
251:
252: SCARG(&sa, how) = SIG_UNBLOCK;
253: SCARG(&sa, mask) = sigmask(signum);
254: return sys_sigprocmask(p, &sa, retval);
255: }
256:
257: case OSF1_SIGIGNORE_MASK:
258: {
259: struct sys_sigaction_args sa_args;
260: struct sigaction *bsa, sa;
261:
262: bsa = stackgap_alloc(&sg, sizeof(struct sigaction));
263: SCARG(&sa_args, signum) = signum;
264: SCARG(&sa_args, nsa) = bsa;
265: SCARG(&sa_args, osa) = NULL;
266:
267: sa.sa_handler = SIG_IGN;
268: sigemptyset(&sa.sa_mask);
269: sa.sa_flags = 0;
270: if ((error = copyout(&sa, bsa, sizeof(sa))) != 0)
271: return error;
272: if ((error = sys_sigaction(p, &sa_args, retval)) != 0) {
273: DPRINTF(("sigignore: sigaction failed\n"));
274: return error;
275: }
276: return 0;
277: }
278:
279: case OSF1_SIGPAUSE_MASK:
280: {
281: struct sys_sigsuspend_args sa;
282:
283: SCARG(&sa, mask) = p->p_sigmask & ~sigmask(signum);
284: return sys_sigsuspend(p, &sa, retval);
285: }
286:
287: default:
288: return ENOSYS;
289: }
290: }
291:
292: int
293: osf1_sys_sigpending(p, v, retval)
294: struct proc *p;
295: void *v;
296: register_t *retval;
297: {
298: struct osf1_sys_sigpending_args *uap = v;
299: sigset_t bss;
300: osf1_sigset_t oss;
301:
302: bss = p->p_siglist & p->p_sigmask;
303: osf1_cvt_sigset_from_native(&bss, &oss);
304:
305: return copyout(&oss, SCARG(uap, mask), sizeof(oss));
306: }
307:
308: int
309: osf1_sys_sigprocmask(p, v, retval)
310: struct proc *p;
311: void *v;
312: register_t *retval;
313: {
314: struct osf1_sys_sigprocmask_args *uap = v;
315: osf1_sigset_t oss;
316: sigset_t bss;
317: int error = 0;
318:
319: if (SCARG(uap, oset) != NULL) {
320: /* Fix the return value first if needed */
321: osf1_cvt_sigset_from_native(&p->p_sigmask, &oss);
322: if ((error = copyout(&oss, SCARG(uap, oset), sizeof(oss))) != 0)
323: return error;
324: }
325:
326: if (SCARG(uap, set) == NULL)
327: /* Just examine */
328: return 0;
329:
330: if ((error = copyin(SCARG(uap, set), &oss, sizeof(oss))) != 0)
331: return error;
332:
333: osf1_cvt_sigset_to_native(&oss, &bss);
334:
335: (void) splhigh();
336:
337: switch (SCARG(uap, how)) {
338: case OSF1_SIG_BLOCK:
339: p->p_sigmask |= bss & ~sigcantmask;
340: break;
341:
342: case OSF1_SIG_UNBLOCK:
343: p->p_sigmask &= ~bss;
344: break;
345:
346: case OSF1_SIG_SETMASK:
347: p->p_sigmask = bss & ~sigcantmask;
348: break;
349:
350: default:
351: error = EINVAL;
352: break;
353: }
354:
355: (void) spl0();
356:
357: return error;
358: }
359:
360: int
361: osf1_sys_sigsuspend(p, v, retval)
362: struct proc *p;
363: void *v;
364: register_t *retval;
365: {
366: struct osf1_sys_sigsuspend_args *uap = v;
367: osf1_sigset_t oss;
368: sigset_t bss;
369: struct sys_sigsuspend_args sa;
370: int error;
371:
372: if ((error = copyin(SCARG(uap, ss), &oss, sizeof(oss))) != 0)
373: return error;
374:
375: osf1_cvt_sigset_to_native(&oss, &bss);
376:
377: SCARG(&sa, mask) = bss;
378: return sys_sigsuspend(p, &sa, retval);
379: }
380: #endif
CVSweb