示例#1
0
/*
 * 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);
}
示例#2
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);
}
示例#3
0
文件: cmd.c 项目: agadiffe/ft_sh
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);
	}
}