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
)
56 optparse(&srv
, argv
+1);
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);
68 if (srv
.user
) su(srv
.user
);
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
);
80 list
.prev
= list
.next
= &list
;
81 walinit(&srv
.wal
, &list
);
82 prot_replay(&srv
, &list
);