/* * Creates the privileged monitor process. It returns twice. * It returns 1 for the unprivileged slave process and 0 for the * user-privileged slave process after successful authentication. */ int monitor_init(void) { struct passwd *pw; int pair[2]; if (socketpair(AF_LOCAL, SOCK_STREAM, PF_UNSPEC, pair) == -1) fatalx("socketpair failed"); fd_monitor = pair[0]; fd_slave = pair[1]; set_monitor_signals(); slave_pid = fork(); if (slave_pid == -1) fatalx("fork of unprivileged slave failed"); if (slave_pid == 0) { /* Unprivileged slave */ set_slave_signals(); if ((pw = getpwnam(FTPD_PRIVSEP_USER)) == NULL) fatalx("privilege separation user %s not found", FTPD_PRIVSEP_USER); if (chroot(pw->pw_dir) == -1) fatalx("chroot %s: %m", pw->pw_dir); if (chdir("/") == -1) fatalx("chdir /: %m"); if (setgroups(1, &pw->pw_gid) == -1) fatalx("setgroups: %m"); if (setegid(pw->pw_gid) == -1) fatalx("setegid failed"); if (setgid(pw->pw_gid) == -1) fatalx("setgid failed"); if (seteuid(pw->pw_uid) == -1) fatalx("seteuid failed"); if (setuid(pw->pw_uid) == -1) fatalx("setuid failed"); endpwent(); close(fd_slave); return (1); } #ifdef HASSETPROCTITLE setproctitle("%s: [priv pre-auth]", remotehost); #endif handle_cmds(); /* User-privileged slave */ return (0); }
void pipe_exec_cmd(t_state *state, char *line, int stdin, int stdout) { char **cmds; int fd_in; int fd_out; fd_in = 0; fd_out = 0; handle_dup2_pipe(state, stdin, stdout); cmds = pipe_get_cmds(line, &fd_out, &fd_in); handle_dup2_redirection(state, fd_in, fd_out); handle_cmds(state, line, cmds); free_everything(cmds, state); exit(0); }
void handle_line(t_state *state, char *line) { char **cmds; int redirection_count; redirection_count = ft_wordcountwith_redirection(line, "<|>&"); if (redirection_count > 1) { if (!is_valid_cmd(state->pwd)) print_no_such_file_or_dir(state, state->shell_name, state->pwd); else if (check_if_valid_entry(state, line)) run_redirection(state, line); } else if (redirection_count == 1) { cmds = ft_strsplitwith_quote(line, " \t", 1); if (cmds && cmds[0]) handle_cmds(state, line, cmds); ft_strtabdel(&cmds); } }