Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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;
}