/* * Processes with pipes open are currently considered to share arbitrary * information in both directions (i.e., the data and the direction are * not tracked). Therefore, pipe information is stored in the fd_map so * that subsequent calls to fork/exec can check for existant pipes. If any * are found, the two process spines are joined (see action.c for details). */ int pipe(int fds[2]) { int ret = real_pipe(fds); if (!ret) { struct hash zero; memset(&zero, 0, sizeof(struct hash)); fd_map_open(fds[0], O_RDONLY | WO_PIPE, &zero); fd_map_open(fds[1], O_WRONLY | WO_PIPE, &zero); } return ret; }
/** * register internal signal handler, * initalize local variables * * TODO: see register_interrupt */ void native_interrupt_init(void) { struct sigaction sa; DEBUG("native_interrupt_init\n"); VALGRIND_STACK_REGISTER(__isr_stack, __isr_stack + sizeof(__isr_stack)); VALGRIND_DEBUG("VALGRIND_STACK_REGISTER(%p, %p)\n", __isr_stack, (void*)((int)__isr_stack + sizeof(__isr_stack))); native_interrupts_enabled = 1; _native_sigpend = 0; for (int i = 0; i < 255; i++) { native_irq_handlers[i] = NULL; } sa.sa_sigaction = native_isr_entry; if (sigfillset(&sa.sa_mask) == -1) { err(EXIT_FAILURE, "native_interrupt_init: sigfillset"); } sa.sa_flags = SA_RESTART | SA_SIGINFO | SA_ONSTACK; /* We want to white list authorized signals */ if (sigfillset(&_native_sig_set) == -1) { err(EXIT_FAILURE, "native_interrupt_init: sigprocmask"); } /* we need to disable all signals during our signal handler as it * can not cope with interrupted signals ... */ if (sigfillset(&_native_sig_set_dint) == -1) { err(EXIT_FAILURE, "native_interrupt_init: sigfillset"); } /* SIGUSR1 is intended for debugging purposes and shall always be * enabled */ if (sigdelset(&_native_sig_set, SIGUSR1) == -1) { err(EXIT_FAILURE, "native_interrupt_init: sigdelset"); } if (sigdelset(&_native_sig_set_dint, SIGUSR1) == -1) { err(EXIT_FAILURE, "native_interrupt_init: sigdelset"); } /* SIGUSR1 is handled like a regular interrupt */ if (sigaction(SIGUSR1, &sa, NULL)) { err(EXIT_FAILURE, "native_interrupt_init: sigaction"); } if (getcontext(&native_isr_context) == -1) { err(EXIT_FAILURE, "native_interrupt_init: getcontext"); } native_isr_context.uc_stack.ss_sp = __isr_stack; native_isr_context.uc_stack.ss_size = SIGSTKSZ; native_isr_context.uc_stack.ss_flags = 0; _native_isr_ctx = &native_isr_context; static stack_t sigstk; sigstk.ss_sp = sigalt_stk; sigstk.ss_size = SIGSTKSZ; sigstk.ss_flags = 0; if (sigaltstack(&sigstk, NULL) < 0) { err(EXIT_FAILURE, "native_interrupt_init: sigaltstack"); } makecontext(&native_isr_context, native_irq_handler, 0); _native_in_syscall = 0; if (real_pipe(_sig_pipefd) == -1) { err(EXIT_FAILURE, "native_interrupt_init: pipe"); } /* allow for ctrl+c to shut down gracefully always */ //register_interrupt(SIGINT, native_shutdown); sa.sa_sigaction = native_shutdown; if (sigdelset(&_native_sig_set, SIGINT) == -1) { err(EXIT_FAILURE, "native_interrupt_init: sigdelset"); } if (sigdelset(&_native_sig_set_dint, SIGINT) == -1) { err(EXIT_FAILURE, "native_interrupt_init: sigdelset"); } if (sigaction(SIGINT, &sa, NULL)) { err(EXIT_FAILURE, "native_interrupt_init: sigaction"); } puts("RIOT native interrupts/signals initialized."); }