13 su(const char *user
) {
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);
36 sa
.sa_handler
= SIG_IGN
;
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);
50 main(int argc
, char **argv
)
57 optparse(&srv
, argv
+1);
60 printf("pid %d\n", getpid());
63 r
= make_server_socket(srv
.addr
, srv
.port
);
64 if (r
== -1) twarnx("make_server_socket()"), exit(111);
69 if (srv
.user
) su(srv
.user
);
73 // We want to make sure that only one beanstalkd tries
74 // to use the wal directory at a time. So acquire a lock
75 // now and never release it.
76 if (!waldirlock(&srv
.wal
)) {
77 twarnx("failed to lock wal dir %s", srv
.wal
.dir
);
81 list
.prev
= list
.next
= &list
;
82 walinit(&srv
.wal
, &list
);
83 r
= prot_replay(&srv
, &list
);
85 twarnx("failed to replay log");