Deleted Added
full compact
svr4_signal.c (107839) svr4_signal.c (107849)
1/*
2 * Copyright (c) 1998 Mark Newton
3 * Copyright (c) 1994 Christos Zoulas
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 11 unchanged lines hidden (view full) ---

20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
1/*
2 * Copyright (c) 1998 Mark Newton
3 * Copyright (c) 1994 Christos Zoulas
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 11 unchanged lines hidden (view full) ---

20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $FreeBSD: head/sys/compat/svr4/svr4_signal.c 107839 2002-12-13 22:41:47Z alfred $
28 * $FreeBSD: head/sys/compat/svr4/svr4_signal.c 107849 2002-12-14 01:56:26Z alfred $
29 */
30
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/filedesc.h>
34#include <sys/lock.h>
35#include <sys/mutex.h>
36#include <sys/proc.h>

--- 227 unchanged lines hidden (view full) ---

264{
265 struct svr4_sigaction *nisa, *oisa, tmpisa;
266 struct sigaction *nbsa, *obsa, tmpbsa;
267 struct sigaction_args sa;
268 caddr_t sg;
269 int error;
270
271 DPRINTF(("@@@ svr4_sys_sigaction(%d, %d, %d)\n", td->td_proc->p_pid,
29 */
30
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/filedesc.h>
34#include <sys/lock.h>
35#include <sys/mutex.h>
36#include <sys/proc.h>

--- 227 unchanged lines hidden (view full) ---

264{
265 struct svr4_sigaction *nisa, *oisa, tmpisa;
266 struct sigaction *nbsa, *obsa, tmpbsa;
267 struct sigaction_args sa;
268 caddr_t sg;
269 int error;
270
271 DPRINTF(("@@@ svr4_sys_sigaction(%d, %d, %d)\n", td->td_proc->p_pid,
272 SCARG(uap, signum),
273 SVR4_SVR42BSD_SIG(SCARG(uap, signum))));
272 uap->signum,
273 SVR4_SVR42BSD_SIG(uap->signum)));
274
275 sg = stackgap_init();
274
275 sg = stackgap_init();
276 nisa = SCARG(uap, nsa);
277 oisa = SCARG(uap, osa);
276 nisa = uap->nsa;
277 oisa = uap->osa;
278
279 if (oisa != NULL)
280 obsa = stackgap_alloc(&sg, sizeof(struct sigaction));
281 else
282 obsa = NULL;
283
284 if (nisa != NULL) {
285 nbsa = stackgap_alloc(&sg, sizeof(struct sigaction));

--- 10 unchanged lines hidden (view full) ---

296 int i;
297 for (i = 0; i < 4; i++)
298 DPRINTF(("\tssa_mask[%d] = %lx\n", i,
299 nisa->ssa_mask.bits[i]));
300 DPRINTF(("\tssa_handler = %p\n", nisa->ssa_handler));
301 }
302#endif
303
278
279 if (oisa != NULL)
280 obsa = stackgap_alloc(&sg, sizeof(struct sigaction));
281 else
282 obsa = NULL;
283
284 if (nisa != NULL) {
285 nbsa = stackgap_alloc(&sg, sizeof(struct sigaction));

--- 10 unchanged lines hidden (view full) ---

296 int i;
297 for (i = 0; i < 4; i++)
298 DPRINTF(("\tssa_mask[%d] = %lx\n", i,
299 nisa->ssa_mask.bits[i]));
300 DPRINTF(("\tssa_handler = %p\n", nisa->ssa_handler));
301 }
302#endif
303
304 SCARG(&sa, sig) = SVR4_SVR42BSD_SIG(SCARG(uap, signum));
305 SCARG(&sa, act) = nbsa;
306 SCARG(&sa, oact) = obsa;
304 sa.sig = SVR4_SVR42BSD_SIG(uap->signum);
305 sa.act = nbsa;
306 sa.oact = obsa;
307
308 if ((error = sigaction(td, &sa)) != 0)
309 return error;
310
311 if (oisa != NULL) {
312 if ((error = copyin(obsa, &tmpbsa, sizeof(tmpbsa))) != 0)
313 return error;
314 bsd_to_svr4_sigaction(&tmpbsa, &tmpisa);

--- 12 unchanged lines hidden (view full) ---

327 struct svr4_sigaltstack *nsss, *osss, tmpsss;
328 struct sigaltstack *nbss, *obss, tmpbss;
329 struct sigaltstack_args sa;
330 caddr_t sg;
331 int error, *retval;
332
333 retval = td->td_retval;
334 sg = stackgap_init();
307
308 if ((error = sigaction(td, &sa)) != 0)
309 return error;
310
311 if (oisa != NULL) {
312 if ((error = copyin(obsa, &tmpbsa, sizeof(tmpbsa))) != 0)
313 return error;
314 bsd_to_svr4_sigaction(&tmpbsa, &tmpisa);

--- 12 unchanged lines hidden (view full) ---

327 struct svr4_sigaltstack *nsss, *osss, tmpsss;
328 struct sigaltstack *nbss, *obss, tmpbss;
329 struct sigaltstack_args sa;
330 caddr_t sg;
331 int error, *retval;
332
333 retval = td->td_retval;
334 sg = stackgap_init();
335 nsss = SCARG(uap, nss);
336 osss = SCARG(uap, oss);
335 nsss = uap->nss;
336 osss = uap->oss;
337
338 if (osss != NULL)
339 obss = stackgap_alloc(&sg, sizeof(struct sigaltstack));
340 else
341 obss = NULL;
342
343 if (nsss != NULL) {
344 nbss = stackgap_alloc(&sg, sizeof(struct sigaltstack));
345 if ((error = copyin(nsss, &tmpsss, sizeof(tmpsss))) != 0)
346 return error;
347 svr4_to_bsd_sigaltstack(&tmpsss, &tmpbss);
348 if ((error = copyout(&tmpbss, nbss, sizeof(tmpbss))) != 0)
349 return error;
350 } else
351 nbss = NULL;
352
337
338 if (osss != NULL)
339 obss = stackgap_alloc(&sg, sizeof(struct sigaltstack));
340 else
341 obss = NULL;
342
343 if (nsss != NULL) {
344 nbss = stackgap_alloc(&sg, sizeof(struct sigaltstack));
345 if ((error = copyin(nsss, &tmpsss, sizeof(tmpsss))) != 0)
346 return error;
347 svr4_to_bsd_sigaltstack(&tmpsss, &tmpbss);
348 if ((error = copyout(&tmpbss, nbss, sizeof(tmpbss))) != 0)
349 return error;
350 } else
351 nbss = NULL;
352
353 SCARG(&sa, ss) = nbss;
354 SCARG(&sa, oss) = obss;
353 sa.ss = nbss;
354 sa.oss = obss;
355
356 if ((error = sigaltstack(td, &sa)) != 0)
357 return error;
358
359 if (obss != NULL) {
360 if ((error = copyin(obss, &tmpbss, sizeof(tmpbss))) != 0)
361 return error;
362 bsd_to_svr4_sigaltstack(&tmpbss, &tmpsss);

--- 13 unchanged lines hidden (view full) ---

376 struct svr4_sys_signal_args *uap;
377{
378 int signum;
379 int error, *retval = td->td_retval;
380 caddr_t sg = stackgap_init();
381
382 DPRINTF(("@@@ svr4_sys_signal(%d)\n", td->td_proc->p_pid));
383
355
356 if ((error = sigaltstack(td, &sa)) != 0)
357 return error;
358
359 if (obss != NULL) {
360 if ((error = copyin(obss, &tmpbss, sizeof(tmpbss))) != 0)
361 return error;
362 bsd_to_svr4_sigaltstack(&tmpbss, &tmpsss);

--- 13 unchanged lines hidden (view full) ---

376 struct svr4_sys_signal_args *uap;
377{
378 int signum;
379 int error, *retval = td->td_retval;
380 caddr_t sg = stackgap_init();
381
382 DPRINTF(("@@@ svr4_sys_signal(%d)\n", td->td_proc->p_pid));
383
384 signum = SVR4_SVR42BSD_SIG(SVR4_SIGNO(SCARG(uap, signum)));
384 signum = SVR4_SVR42BSD_SIG(SVR4_SIGNO(uap->signum));
385 if (signum <= 0 || signum > SVR4_NSIG)
386 return (EINVAL);
387
385 if (signum <= 0 || signum > SVR4_NSIG)
386 return (EINVAL);
387
388 switch (SVR4_SIGCALL(SCARG(uap, signum))) {
388 switch (SVR4_SIGCALL(uap->signum)) {
389 case SVR4_SIGDEFER_MASK:
389 case SVR4_SIGDEFER_MASK:
390 if (SCARG(uap, handler) == SVR4_SIG_HOLD)
390 if (uap->handler == SVR4_SIG_HOLD)
391 goto sighold;
392 /* FALLTHROUGH */
393
394 case SVR4_SIGNAL_MASK:
395 {
396 struct sigaction_args sa_args;
397 struct sigaction *nbsa, *obsa, sa;
398
399 nbsa = stackgap_alloc(&sg, sizeof(struct sigaction));
400 obsa = stackgap_alloc(&sg, sizeof(struct sigaction));
391 goto sighold;
392 /* FALLTHROUGH */
393
394 case SVR4_SIGNAL_MASK:
395 {
396 struct sigaction_args sa_args;
397 struct sigaction *nbsa, *obsa, sa;
398
399 nbsa = stackgap_alloc(&sg, sizeof(struct sigaction));
400 obsa = stackgap_alloc(&sg, sizeof(struct sigaction));
401 SCARG(&sa_args, sig) = signum;
402 SCARG(&sa_args, act) = nbsa;
403 SCARG(&sa_args, oact) = obsa;
401 sa_args.sig = signum;
402 sa_args.act = nbsa;
403 sa_args.oact = obsa;
404
404
405 sa.sa_handler = (sig_t) SCARG(uap, handler);
405 sa.sa_handler = (sig_t) uap->handler;
406 SIGEMPTYSET(sa.sa_mask);
407 sa.sa_flags = 0;
408
409 if (signum != SIGALRM)
410 sa.sa_flags = SA_RESTART;
411
412 if ((error = copyout(&sa, nbsa, sizeof(sa))) != 0)
413 return error;

--- 13 unchanged lines hidden (view full) ---

427sighold:
428 {
429 struct sigprocmask_args sa;
430 sigset_t *set;
431
432 set = stackgap_alloc(&sg, sizeof(sigset_t));
433 SIGEMPTYSET(*set);
434 SIGADDSET(*set, signum);
406 SIGEMPTYSET(sa.sa_mask);
407 sa.sa_flags = 0;
408
409 if (signum != SIGALRM)
410 sa.sa_flags = SA_RESTART;
411
412 if ((error = copyout(&sa, nbsa, sizeof(sa))) != 0)
413 return error;

--- 13 unchanged lines hidden (view full) ---

427sighold:
428 {
429 struct sigprocmask_args sa;
430 sigset_t *set;
431
432 set = stackgap_alloc(&sg, sizeof(sigset_t));
433 SIGEMPTYSET(*set);
434 SIGADDSET(*set, signum);
435 SCARG(&sa, how) = SIG_BLOCK;
436 SCARG(&sa, set) = set;
437 SCARG(&sa, oset) = NULL;
435 sa.how = SIG_BLOCK;
436 sa.set = set;
437 sa.oset = NULL;
438 return sigprocmask(td, &sa);
439 }
440
441 case SVR4_SIGRELSE_MASK:
442 {
443 struct sigprocmask_args sa;
444 sigset_t *set;
445
446 set = stackgap_alloc(&sg, sizeof(sigset_t));
447 SIGEMPTYSET(*set);
448 SIGADDSET(*set, signum);
438 return sigprocmask(td, &sa);
439 }
440
441 case SVR4_SIGRELSE_MASK:
442 {
443 struct sigprocmask_args sa;
444 sigset_t *set;
445
446 set = stackgap_alloc(&sg, sizeof(sigset_t));
447 SIGEMPTYSET(*set);
448 SIGADDSET(*set, signum);
449 SCARG(&sa, how) = SIG_UNBLOCK;
450 SCARG(&sa, set) = set;
451 SCARG(&sa, oset) = NULL;
449 sa.how = SIG_UNBLOCK;
450 sa.set = set;
451 sa.oset = NULL;
452 return sigprocmask(td, &sa);
453 }
454
455 case SVR4_SIGIGNORE_MASK:
456 {
457 struct sigaction_args sa_args;
458 struct sigaction *bsa, sa;
459
460 bsa = stackgap_alloc(&sg, sizeof(struct sigaction));
452 return sigprocmask(td, &sa);
453 }
454
455 case SVR4_SIGIGNORE_MASK:
456 {
457 struct sigaction_args sa_args;
458 struct sigaction *bsa, sa;
459
460 bsa = stackgap_alloc(&sg, sizeof(struct sigaction));
461 SCARG(&sa_args, sig) = signum;
462 SCARG(&sa_args, act) = bsa;
463 SCARG(&sa_args, oact) = NULL;
461 sa_args.sig = signum;
462 sa_args.act = bsa;
463 sa_args.oact = NULL;
464
465 sa.sa_handler = SIG_IGN;
466 SIGEMPTYSET(sa.sa_mask);
467 sa.sa_flags = 0;
468 if ((error = copyout(&sa, bsa, sizeof(sa))) != 0)
469 return error;
470 if ((error = sigaction(td, &sa_args)) != 0) {
471 DPRINTF(("sigignore: sigaction failed\n"));

--- 7 unchanged lines hidden (view full) ---

479 struct sigsuspend_args sa;
480 sigset_t *set;
481
482 set = stackgap_alloc(&sg, sizeof(sigset_t));
483 PROC_LOCK(td->td_proc);
484 *set = td->td_proc->p_sigmask;
485 PROC_UNLOCK(td->td_proc);
486 SIGDELSET(*set, signum);
464
465 sa.sa_handler = SIG_IGN;
466 SIGEMPTYSET(sa.sa_mask);
467 sa.sa_flags = 0;
468 if ((error = copyout(&sa, bsa, sizeof(sa))) != 0)
469 return error;
470 if ((error = sigaction(td, &sa_args)) != 0) {
471 DPRINTF(("sigignore: sigaction failed\n"));

--- 7 unchanged lines hidden (view full) ---

479 struct sigsuspend_args sa;
480 sigset_t *set;
481
482 set = stackgap_alloc(&sg, sizeof(sigset_t));
483 PROC_LOCK(td->td_proc);
484 *set = td->td_proc->p_sigmask;
485 PROC_UNLOCK(td->td_proc);
486 SIGDELSET(*set, signum);
487 SCARG(&sa, sigmask) = set;
487 sa.sigmask = set;
488 return sigsuspend(td, &sa);
489 }
490
491 default:
492 return (ENOSYS);
493 }
494}
495
496
497int
498svr4_sys_sigprocmask(td, uap)
499 struct thread *td;
500 struct svr4_sys_sigprocmask_args *uap;
501{
502 svr4_sigset_t sss;
503 sigset_t bss;
504 int error = 0, *retval;
505
506 retval = td->td_retval;
488 return sigsuspend(td, &sa);
489 }
490
491 default:
492 return (ENOSYS);
493 }
494}
495
496
497int
498svr4_sys_sigprocmask(td, uap)
499 struct thread *td;
500 struct svr4_sys_sigprocmask_args *uap;
501{
502 svr4_sigset_t sss;
503 sigset_t bss;
504 int error = 0, *retval;
505
506 retval = td->td_retval;
507 if (SCARG(uap, oset) != NULL) {
507 if (uap->oset != NULL) {
508 /* Fix the return value first if needed */
509 PROC_LOCK(td->td_proc);
510 bsd_to_svr4_sigset(&td->td_proc->p_sigmask, &sss);
511 PROC_UNLOCK(td->td_proc);
508 /* Fix the return value first if needed */
509 PROC_LOCK(td->td_proc);
510 bsd_to_svr4_sigset(&td->td_proc->p_sigmask, &sss);
511 PROC_UNLOCK(td->td_proc);
512 if ((error = copyout(&sss, SCARG(uap, oset), sizeof(sss))) != 0)
512 if ((error = copyout(&sss, uap->oset, sizeof(sss))) != 0)
513 return error;
514 }
515
513 return error;
514 }
515
516 if (SCARG(uap, set) == NULL)
516 if (uap->set == NULL)
517 /* Just examine */
518 return 0;
519
517 /* Just examine */
518 return 0;
519
520 if ((error = copyin(SCARG(uap, set), &sss, sizeof(sss))) != 0)
520 if ((error = copyin(uap->set, &sss, sizeof(sss))) != 0)
521 return error;
522
523 svr4_to_bsd_sigset(&sss, &bss);
524
525 PROC_LOCK(td->td_proc);
521 return error;
522
523 svr4_to_bsd_sigset(&sss, &bss);
524
525 PROC_LOCK(td->td_proc);
526 switch (SCARG(uap, how)) {
526 switch (uap->how) {
527 case SVR4_SIG_BLOCK:
528 SIGSETOR(td->td_proc->p_sigmask, bss);
529 SIG_CANTMASK(td->td_proc->p_sigmask);
530 break;
531
532 case SVR4_SIG_UNBLOCK:
533 SIGSETNAND(td->td_proc->p_sigmask, bss);
534 signotify(td->td_proc);

--- 20 unchanged lines hidden (view full) ---

555 struct svr4_sys_sigpending_args *uap;
556{
557 sigset_t bss;
558 int *retval;
559 svr4_sigset_t sss;
560
561 DPRINTF(("@@@ svr4_sys_sigpending(%d)\n", td->td_proc->p_pid));
562 retval = td->td_retval;
527 case SVR4_SIG_BLOCK:
528 SIGSETOR(td->td_proc->p_sigmask, bss);
529 SIG_CANTMASK(td->td_proc->p_sigmask);
530 break;
531
532 case SVR4_SIG_UNBLOCK:
533 SIGSETNAND(td->td_proc->p_sigmask, bss);
534 signotify(td->td_proc);

--- 20 unchanged lines hidden (view full) ---

555 struct svr4_sys_sigpending_args *uap;
556{
557 sigset_t bss;
558 int *retval;
559 svr4_sigset_t sss;
560
561 DPRINTF(("@@@ svr4_sys_sigpending(%d)\n", td->td_proc->p_pid));
562 retval = td->td_retval;
563 switch (SCARG(uap, what)) {
563 switch (uap->what) {
564 case 1: /* sigpending */
564 case 1: /* sigpending */
565 if (SCARG(uap, mask) == NULL)
565 if (uap->mask == NULL)
566 return 0;
567 PROC_LOCK(td->td_proc);
568 bss = td->td_proc->p_siglist;
569 SIGSETAND(bss, td->td_proc->p_sigmask);
570 PROC_UNLOCK(td->td_proc);
571 bsd_to_svr4_sigset(&bss, &sss);
572 break;
573

--- 7 unchanged lines hidden (view full) ---

581 }
582#endif
583 break;
584
585 default:
586 return EINVAL;
587 }
588
566 return 0;
567 PROC_LOCK(td->td_proc);
568 bss = td->td_proc->p_siglist;
569 SIGSETAND(bss, td->td_proc->p_sigmask);
570 PROC_UNLOCK(td->td_proc);
571 bsd_to_svr4_sigset(&bss, &sss);
572 break;
573

--- 7 unchanged lines hidden (view full) ---

581 }
582#endif
583 break;
584
585 default:
586 return EINVAL;
587 }
588
589 return copyout(&sss, SCARG(uap, mask), sizeof(sss));
589 return copyout(&sss, uap->mask, sizeof(sss));
590}
591
592int
593svr4_sys_sigsuspend(td, uap)
594 register struct thread *td;
595 struct svr4_sys_sigsuspend_args *uap;
596{
597 svr4_sigset_t sss;
598 sigset_t *bss;
599 struct sigsuspend_args sa;
600 int error;
601 caddr_t sg = stackgap_init();
602
590}
591
592int
593svr4_sys_sigsuspend(td, uap)
594 register struct thread *td;
595 struct svr4_sys_sigsuspend_args *uap;
596{
597 svr4_sigset_t sss;
598 sigset_t *bss;
599 struct sigsuspend_args sa;
600 int error;
601 caddr_t sg = stackgap_init();
602
603 if ((error = copyin(SCARG(uap, ss), &sss, sizeof(sss))) != 0)
603 if ((error = copyin(uap->ss, &sss, sizeof(sss))) != 0)
604 return error;
605
606 bss = stackgap_alloc(&sg, sizeof(sigset_t));
607 svr4_to_bsd_sigset(&sss, bss);
608
604 return error;
605
606 bss = stackgap_alloc(&sg, sizeof(sigset_t));
607 svr4_to_bsd_sigset(&sss, bss);
608
609 SCARG(&sa, sigmask) = bss;
609 sa.sigmask = bss;
610 return sigsuspend(td, &sa);
611}
612
613
614int
615svr4_sys_kill(td, uap)
616 register struct thread *td;
617 struct svr4_sys_kill_args *uap;
618{
619 struct kill_args ka;
620
610 return sigsuspend(td, &sa);
611}
612
613
614int
615svr4_sys_kill(td, uap)
616 register struct thread *td;
617 struct svr4_sys_kill_args *uap;
618{
619 struct kill_args ka;
620
621 SCARG(&ka, pid) = SCARG(uap, pid);
622 SCARG(&ka, signum) = SVR4_SVR42BSD_SIG(SCARG(uap, signum));
621 ka.pid = uap->pid;
622 ka.signum = SVR4_SVR42BSD_SIG(uap->signum);
623 return kill(td, &ka);
624}
625
626
627int
628svr4_sys_context(td, uap)
629 register struct thread *td;
630 struct svr4_sys_context_args *uap;

--- 35 unchanged lines hidden (view full) ---

666
667int
668svr4_sys_pause(td, uap)
669 register struct thread *td;
670 struct svr4_sys_pause_args *uap;
671{
672 struct sigsuspend_args bsa;
673
623 return kill(td, &ka);
624}
625
626
627int
628svr4_sys_context(td, uap)
629 register struct thread *td;
630 struct svr4_sys_context_args *uap;

--- 35 unchanged lines hidden (view full) ---

666
667int
668svr4_sys_pause(td, uap)
669 register struct thread *td;
670 struct svr4_sys_pause_args *uap;
671{
672 struct sigsuspend_args bsa;
673
674 SCARG(&bsa, sigmask) = &td->td_proc->p_sigmask;
674 bsa.sigmask = &td->td_proc->p_sigmask;
675 return sigsuspend(td, &bsa);
676}
675 return sigsuspend(td, &bsa);
676}