예제 #1
0
파일: main.c 프로젝트: davidzwb/miniftp
int main(int argc, char *argv[])
{
	pid_t pid;

	int listenfd;
	int connfd;
	
	socklen_t len;
	struct sockaddr_in cliaddr;

	loadconf("miniftp.conf");
	printf("server_addr: %s\n", server_addr);
	printf("server_port: %d\n", server_port);
	printf("server_max_connfd: %d\n", server_max_connfd);


	if (geteuid() != 0)//need root privilege.
	{
		printf("please use root privilege.\n");
		exit(0);
	}

	listenfd = startserver(NULL, 7777);

	len = sizeof(cliaddr);
	if ((connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &len)) == -1)
		perror("accept");
	pid = fork();
	if (pid == -1)
		perror("fork");
	else if (pid == 0)//child
	{
		startsession(connfd);
	}

	wait(NULL); //wait for child to terminate.

	return 0;
}
예제 #2
0
파일: ddm.c 프로젝트: SteelTermite/ddm
int main(int argc, char *argv[])
{
	const char *action = NULL;
	struct sigaction sa;

	ARGBEGIN {
	case 'l':
	case 'r':
	case 's':
		if (writefifo(fifofile, ARGC()) == -1)
			die("cannot write to fifo\n");
		exit(EXIT_SUCCESS);
	default:
		usage();
	} ARGEND;
	
	if (argc > 1)
		usage();

	if (getuid() != 0)
		die("only root can run this program\n");
	if (getlock(pidfile) == -1)
		die("cannot get exclusive lock\n");
	if (createfifo(fifofile, 0666) == -1)
		die("cannot create fifo\n");

	sa.sa_flags = SA_NOCLDSTOP;
	sa.sa_handler = catchsignal;
	sigemptyset(&sa.sa_mask);
	sigaction(SIGCHLD, &sa, NULL);

	signal(SIGINT, catchsignal);
	signal(SIGHUP, catchsignal);
	signal(SIGQUIT, catchsignal);
	signal(SIGTERM, catchsignal);
	signal(SIGKILL, catchsignal);
	signal(SIGPIPE, catchsignal);

	startserver(server, display);
	do {
		const char *user, *pass;
		char c;

		if (autologin && authenticate(autologin, NULL)) {
			autologin = NULL;
			goto login;
		}

		creategui();
		do {
			rungui(&user, &pass);
			if (!strcmp(user, "reboot"))
				action = rebootcmd;
			else if (!strcmp(user, "shutdown"))
				action = shutdowncmd;
		} while (!action && !authenticate(user, pass));
		destroygui();

		if (action)
			break;

login:		childpid = startsession(child, env);

		c = readfifo(fifofile);
		if (c == 'r')
			action = rebootcmd;
		else if (c == 's')
			action = shutdowncmd;
		else if (!c)
			while (childpid)
				sleep(10);

		stopsession();
	} while (!action);
	signal(SIGINT, SIG_IGN);
	signal(SIGHUP, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	signal(SIGTERM, SIG_DFL);
	signal(SIGKILL, SIG_DFL);
	signal(SIGCHLD, SIG_DFL);
	signal(SIGPIPE, SIG_IGN);
	stopserver();

	removefifo(fifofile);
	removelock(pidfile);

	return system(action);
}