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);
37 sa
.sa_handler
= SIG_IGN
;
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);
51 main(int argc
, char **argv
)
58 optparse(&srv
, argv
+1);
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);
70 if (srv
.user
) su(srv
.user
);
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
);
82 list
.prev
= list
.next
= &list
;
83 walinit(&srv
.wal
, &list
);
84 r
= prot_replay(&srv
, &list
);
86 twarnx("failed to replay log");