Travis: stifle progress on git clone
[beanstalkd.git] / main.c
blob6a07aaadcb98b9addb9c329039198fe549da360c
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)
15 int r;
16 struct passwd *pwent;
18 errno = 0;
19 pwent = getpwnam(user);
20 if (errno) twarn("getpwnam(\"%s\")", user), exit(32);
21 if (!pwent) twarnx("getpwnam(\"%s\"): no such user", user), exit(33);
23 r = setgid(pwent->pw_gid);
24 if (r == -1) twarn("setgid(%d \"%s\")", pwent->pw_gid, user), exit(34);
26 r = setuid(pwent->pw_uid);
27 if (r == -1) twarn("setuid(%d \"%s\")", pwent->pw_uid, user), exit(34);
31 static void
32 set_sig_handlers()
34 int r;
35 struct sigaction sa;
37 sa.sa_handler = SIG_IGN;
38 sa.sa_flags = 0;
39 r = sigemptyset(&sa.sa_mask);
40 if (r == -1) twarn("sigemptyset()"), exit(111);
42 r = sigaction(SIGPIPE, &sa, 0);
43 if (r == -1) twarn("sigaction(SIGPIPE)"), exit(111);
45 sa.sa_handler = enter_drain_mode;
46 r = sigaction(SIGUSR1, &sa, 0);
47 if (r == -1) twarn("sigaction(SIGUSR1)"), exit(111);
50 int
51 main(int argc, char **argv)
53 int r;
54 struct job list = {};
56 progname = argv[0];
57 setlinebuf(stdout);
58 optparse(&srv, argv+1);
60 if (verbose) {
61 printf("pid %d\n", getpid());
64 r = make_server_socket(srv.addr, srv.port);
65 if (r == -1) twarnx("make_server_socket()"), exit(111);
66 srv.sock.fd = r;
68 prot_init();
70 if (srv.user) su(srv.user);
71 set_sig_handlers();
73 if (srv.wal.use) {
74 // We want to make sure that only one beanstalkd tries
75 // to use the wal directory at a time. So acquire a lock
76 // now and never release it.
77 if (!waldirlock(&srv.wal)) {
78 twarnx("failed to lock wal dir %s", srv.wal.dir);
79 exit(10);
82 list.prev = list.next = &list;
83 walinit(&srv.wal, &list);
84 r = prot_replay(&srv, &list);
85 if (!r) {
86 twarnx("failed to replay log");
87 return 1;
91 srvserve(&srv);
92 return 0;