13 vwarnx(const char *err
, const char *fmt
, va_list args
)
14 __attribute__((format(printf
, 2, 0)));
17 vwarnx(const char *err
, const char *fmt
, va_list args
)
19 fprintf(stderr
, "%s: ", progname
);
21 vfprintf(stderr
, fmt
, args
);
22 if (err
) fprintf(stderr
, ": %s", err
);
28 warn(const char *fmt
, ...)
30 char *err
= strerror(errno
); /* must be done first thing */
34 vwarnx(err
, fmt
, args
);
39 warnx(const char *fmt
, ...)
43 vwarnx(NULL
, fmt
, args
);
49 fmtalloc(char *fmt
, ...)
55 // find out how much space is needed
57 n
= vsnprintf(0, 0, fmt
, ap
) + 1; // include space for trailing NUL
63 vsnprintf(buf
, n
, fmt
, ap
);
70 // Zalloc allocates n bytes of zeroed memory and
71 // returns a pointer to it.
72 // If insufficient memory is available, zalloc returns 0.
87 warn_systemd_ignored_option(char *opt
, char *arg
)
89 if (sd_listen_fds(0) > 0) {
90 warnx("inherited listen fd; ignoring option: %s %s", opt
, arg
);
95 static void usage(int code
) __attribute__ ((noreturn
));
99 fprintf(stderr
, "Use: %s [OPTIONS]\n"
102 " -b DIR write-ahead log directory\n"
103 " -f MS fsync at most once every MS milliseconds"
104 " (use -f0 for \"always fsync\")\n"
105 " -F never fsync (default)\n"
106 " -l ADDR listen on address (default is 0.0.0.0)\n"
107 " -p PORT listen on port (default is " Portdef
")\n"
108 " -u USER become user and group\n"
109 " -z BYTES set the maximum job size in bytes (default is %d)\n"
110 " -s BYTES set the size of each write-ahead log file (default is %d)\n"
111 " (will be rounded up to a multiple of 512 bytes)\n"
112 " -c compact the binlog (default)\n"
113 " -n do not compact the binlog\n"
114 " -v show version information\n"
115 " -V increase verbosity\n"
116 " -h show this help\n",
117 progname
, JOB_DATA_SIZE_LIMIT_DEFAULT
, Filesizedef
);
122 static char *flagusage(char *flag
) __attribute__ ((noreturn
));
124 flagusage(char *flag
)
126 warnx("flag requires an argument: %s", flag
);
132 parse_size_t(char *str
)
137 r
= sscanf(str
, "%zu%c", &size
, &x
);
139 warnx("invalid size: %s", str
);
147 optparse(Server
*s
, char **argv
)
151 # define EARGF(x) (*arg ? (tmp=arg,arg="",tmp) : *argv ? *argv++ : (x))
153 while ((arg
= *argv
++) && *arg
++ == '-' && *arg
) {
154 while ((c
= *arg
++)) {
157 s
->port
= EARGF(flagusage("-p"));
158 warn_systemd_ignored_option("-p", s
->port
);
161 s
->addr
= EARGF(flagusage("-l"));
162 warn_systemd_ignored_option("-l", s
->addr
);
165 job_data_size_limit
= parse_size_t(EARGF(flagusage("-z")));
168 s
->wal
.filesize
= parse_size_t(EARGF(flagusage("-s")));
177 ms
= (int64
)parse_size_t(EARGF(flagusage("-f")));
178 s
->wal
.syncrate
= ms
* 1000000;
185 s
->user
= EARGF(flagusage("-u"));
188 s
->wal
.dir
= EARGF(flagusage("-b"));
194 printf("beanstalkd %s\n", version
);
200 warnx("unknown flag: %s", arg
-2);
206 warnx("unknown argument: %s", arg
-1);