static SIGRETTYPE ctl_c(int sig) { tty_reset(tty_fd); sys_sigset(sig, orig_ctl_c); /* Set ctl_c break handler to original */ sys_sigrelease(sig); /* Allow 'sig' to come through */ kill(getpid(), sig); /* Send ourselves the signal */ sys_sigblock(sig); /* Reset to old mask */ sys_sigset(sig, ctl_c); /* Reset signal handler */ tty_set(tty_fd); }
static SIGRETTYPE suspend(int sig) { tty_reset(tty_fd); sys_sigset(sig, SIG_DFL); /* Set signal handler to default */ sys_sigrelease(sig); /* Allow 'sig' to come through */ kill(getpid(), sig); /* Send ourselves the signal */ sys_sigblock(sig); /* Reset to old mask */ sys_sigset(sig, suspend); /* Reset signal handler */ tty_set(tty_fd); }
int main(int argc, char *argv[]) { int i, from, to; int erts_spawn_executable = 0; /* OBSERVE! * Keep child setup after fork() (implemented in sys.c) up to date * if changes are made here. */ if (argc != CS_ARGV_NO_OF_ARGS) { if (argc < CS_ARGV_NO_OF_ARGS) { return 1; } else { erts_spawn_executable = 1; } } if (strcmp("false", argv[CS_ARGV_UNBIND_IX]) != 0) if (erts_unbind_from_cpu_str(argv[CS_ARGV_UNBIND_IX]) != 0) return 1; for (i = 0; i < CS_ARGV_NO_OF_DUP2_OPS; i++) { if (argv[CS_ARGV_DUP2_OP_IX(i)][0] == '-' && argv[CS_ARGV_DUP2_OP_IX(i)][1] == '\0') break; if (sscanf(argv[CS_ARGV_DUP2_OP_IX(i)], "%d:%d", &from, &to) != 2) return 1; if (dup2(from, to) < 0) return 1; } if (sscanf(argv[CS_ARGV_FD_CR_IX], "%d:%d", &from, &to) != 2) return 1; #if defined(HAVE_CLOSEFROM) closefrom(from); #elif defined(__ANDROID__) if (from <= to) { int spfd = system_properties_fd(); for (i = from; i <= to; i++) { if (i != spfd) { (void) close(i); } } } #else /* !__ANDROID__ */ for (i = from; i <= to; i++) { (void) close(i); } #endif /* HAVE_CLOSEFROM */ if (!(argv[CS_ARGV_WD_IX][0] == '.' && argv[CS_ARGV_WD_IX][1] == '\0') && chdir(argv[CS_ARGV_WD_IX]) < 0) return 1; #if defined(USE_SETPGRP_NOARGS) /* SysV */ (void) setpgrp(); #elif defined(USE_SETPGRP) /* BSD */ (void) setpgrp(0, getpid()); #else /* POSIX */ (void) setsid(); #endif sys_sigrelease(SIGCHLD); sys_sigrelease(SIGINT); sys_sigrelease(SIGUSR1); if (erts_spawn_executable) { if (argv[CS_ARGV_NO_OF_ARGS + 1] == NULL) { execl(argv[CS_ARGV_NO_OF_ARGS],argv[CS_ARGV_NO_OF_ARGS], (char *) NULL); } else { execv(argv[CS_ARGV_NO_OF_ARGS],&(argv[CS_ARGV_NO_OF_ARGS + 1])); } } else { execl(SHELL, "sh", "-c", argv[CS_ARGV_CMD_IX], (char *) NULL); } return 1; }