improve the tests
[beanstalkd.git] / main.c
blobe35dc166a59558ec2eed8c29e7d2a293e15025af
1 #include <stdint.h>
2 #include <signal.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <errno.h>
6 #include <sys/stat.h>
7 #include <unistd.h>
8 #include <pwd.h>
9 #include <fcntl.h>
10 #include "dat.h"
12 static void
13 su(const char *user) {
14 int r;
15 struct passwd *pwent;
17 errno = 0;
18 pwent = getpwnam(user);
19 if (errno) twarn("getpwnam(\"%s\")", user), exit(32);
20 if (!pwent) twarnx("getpwnam(\"%s\"): no such user", user), exit(33);
22 r = setgid(pwent->pw_gid);
23 if (r == -1) twarn("setgid(%d \"%s\")", pwent->pw_gid, user), exit(34);
25 r = setuid(pwent->pw_uid);
26 if (r == -1) twarn("setuid(%d \"%s\")", pwent->pw_uid, user), exit(34);
30 static void
31 set_sig_handlers()
33 int r;
34 struct sigaction sa;
36 sa.sa_handler = SIG_IGN;
37 sa.sa_flags = 0;
38 r = sigemptyset(&sa.sa_mask);
39 if (r == -1) twarn("sigemptyset()"), exit(111);
41 r = sigaction(SIGPIPE, &sa, 0);
42 if (r == -1) twarn("sigaction(SIGPIPE)"), exit(111);
44 sa.sa_handler = enter_drain_mode;
45 r = sigaction(SIGUSR1, &sa, 0);
46 if (r == -1) twarn("sigaction(SIGUSR1)"), exit(111);
49 int
50 main(int argc, char **argv)
52 int r;
53 struct job list = {};
55 progname = argv[0];
56 optparse(&srv, argv+1);
58 if (verbose) {
59 printf("pid %d\n", getpid());
62 r = make_server_socket(srv.addr, srv.port);
63 if (r == -1) twarnx("make_server_socket()"), exit(111);
64 srv.sock.fd = r;
66 prot_init();
68 if (srv.user) su(srv.user);
69 set_sig_handlers();
71 if (srv.wal.use) {
72 // We want to make sure that only one beanstalkd tries
73 // to use the wal directory at a time. So acquire a lock
74 // now and never release it.
75 if (!waldirlock(&srv.wal)) {
76 twarnx("failed to lock wal dir %s", srv.wal.dir);
77 exit(10);
80 list.prev = list.next = &list;
81 walinit(&srv.wal, &list);
82 prot_replay(&srv, &list);
85 srvserve(&srv);
86 return 0;