10 #include <systemd/sd-daemon.h>
16 vwarnx(const char *err
, const char *fmt
, va_list args
)
17 __attribute__((format(printf
, 2, 0)));
20 vwarnx(const char *err
, const char *fmt
, va_list args
)
22 fprintf(stderr
, "%s: ", progname
);
24 vfprintf(stderr
, fmt
, args
);
25 if (err
) fprintf(stderr
, ": %s", err
);
31 warn(const char *fmt
, ...)
33 char *err
= strerror(errno
); /* must be done first thing */
37 vwarnx(err
, fmt
, args
);
42 warnx(const char *fmt
, ...)
46 vwarnx(NULL
, fmt
, args
);
52 fmtalloc(char *fmt
, ...)
58 // find out how much space is needed
60 n
= vsnprintf(0, 0, fmt
, ap
) + 1; // include space for trailing NUL
66 vsnprintf(buf
, n
, fmt
, ap
);
73 // Zalloc allocates n bytes of zeroed memory and
74 // returns a pointer to it.
75 // If insufficient memory is available, zalloc returns 0.
90 warn_systemd_ignored_option(char *opt
, char *arg
)
92 #ifdef HAVE_LIBSYSTEMD
93 if (sd_listen_fds(0) > 0) {
94 warnx("inherited listen fd; ignoring option: %s %s", opt
, arg
);
100 static void usage(int code
) __attribute__ ((noreturn
));
104 fprintf(stderr
, "Use: %s [OPTIONS]\n"
107 " -b DIR write-ahead log directory\n"
108 " -f MS fsync at most once every MS milliseconds (default is %dms);\n"
109 " use -f0 for \"always fsync\"\n"
111 " -l ADDR listen on address (default is 0.0.0.0)\n"
112 " -p PORT listen on port (default is " Portdef
")\n"
113 " -u USER become user and group\n"
114 " -z BYTES set the maximum job size in bytes (default is %d);\n"
115 " max allowed is %d bytes\n"
116 " -s BYTES set the size of each write-ahead log file (default is %d);\n"
117 " will be rounded up to a multiple of 4096 bytes\n"
118 " -v show version information\n"
119 " -V increase verbosity\n"
120 " -h show this help\n",
123 JOB_DATA_SIZE_LIMIT_DEFAULT
,
124 JOB_DATA_SIZE_LIMIT_MAX
,
130 static char *flagusage(char *flag
) __attribute__ ((noreturn
));
132 flagusage(char *flag
)
134 warnx("flag requires an argument: %s", flag
);
140 parse_size_t(char *str
)
145 r
= sscanf(str
, "%zu%c", &size
, &x
);
147 warnx("invalid size: %s", str
);
155 optparse(Server
*s
, char **argv
)
159 # define EARGF(x) (*arg ? (tmp=arg,arg="",tmp) : *argv ? *argv++ : (x))
161 while ((arg
= *argv
++) && *arg
++ == '-' && *arg
) {
163 while ((c
= *arg
++)) {
166 s
->port
= EARGF(flagusage("-p"));
167 warn_systemd_ignored_option("-p", s
->port
);
170 s
->addr
= EARGF(flagusage("-l"));
171 warn_systemd_ignored_option("-l", s
->addr
);
174 job_data_size_limit
= parse_size_t(EARGF(flagusage("-z")));
175 if (job_data_size_limit
> JOB_DATA_SIZE_LIMIT_MAX
) {
176 warnx("maximum job size was set to %d", JOB_DATA_SIZE_LIMIT_MAX
);
177 job_data_size_limit
= JOB_DATA_SIZE_LIMIT_MAX
;
181 s
->wal
.filesize
= parse_size_t(EARGF(flagusage("-s")));
184 warnx("-c flag was removed. binlog is always compacted.");
187 warnx("-n flag was removed. binlog is always compacted.");
190 ms
= (int64
)parse_size_t(EARGF(flagusage("-f")));
191 s
->wal
.syncrate
= ms
* 1000000;
198 s
->user
= EARGF(flagusage("-u"));
201 s
->wal
.dir
= EARGF(flagusage("-b"));
207 printf("beanstalkd %s\n", version
);
213 warnx("unknown flag: %s", arg
-2);
219 warnx("unknown argument: %s", arg
-1);