[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] tools/misc: fix xenwatchdogd invocation
On 26.03.2024 06:15, zithro / Cyril Rébert wrote: > --- a/tools/misc/xenwatchdogd.c > +++ b/tools/misc/xenwatchdogd.c > @@ -8,26 +8,34 @@ > #include <stdlib.h> > #include <unistd.h> > #include <signal.h> > +#include <string.h> > #include <stdio.h> > > +#define _GNU_SOURCE This wants defining first thing in a file (or even on the compiler command line), to (properly) affect all headers. > +#include <getopt.h> > +#if !defined(__GNUC__) && !defined(__GNUG__) Why __GNUG__ in a C file? And anyway, why is this construct needed? You don't ... > +#define __attribute__(arg) /* empty */ ... use any attributes down from here. You mention xentop as where you've taken them from. I view those as questionable. If in fact you had used any other utility's source for reference, you wouldn't have encountered such. > +#endif > + > xc_interface *h; > int id = 0; > > void daemonize(void) > { > switch (fork()) { > - case -1: > - err(1, "fork"); > - case 0: > - break; > - default: > - exit(0); > + case -1: > + err(1, "fork"); > + case 0: > + break; > + default: > + exit(0); > } The case labels were properly indented, weren't they? And all other re- indentation you do wants splitting from the functional change. > @@ -52,39 +60,68 @@ void catch_usr1(int sig) > > int main(int argc, char **argv) > { > + > int t, s; What would this new blank line be good for? > int ret; > + I'd even question this one. > + char *usage = "usage: %s <timeout> <sleep>"; static const char[] > + int opt, optind = 0; > + > + struct option lopts[] = { static const > + { "help", no_argument, NULL, 'h' }, > + }; > + const char *sopts = "h"; > + > + while ((opt = getopt_long(argc, argv, sopts, lopts, &optind)) != -1) { > + switch (opt) { > + case '?': > + case 'h': > + errx(1, usage, argv[0]); This isn't an error and hence wants to produce an exit code of 0. > + break; > + default: > + errx(1, usage, argv[0]); > + } Please be consistent with break statements: Either you omit them uniformly when a noreturn function is call, or you put them there in all cases. > + } > > if (argc < 2) > - errx(1, "usage: %s <timeout> <sleep>", argv[0]); > + errx(1, usage, argv[0]); > > daemonize(); > > h = xc_interface_open(NULL, NULL, 0); > if (h == NULL) > - err(1, "xc_interface_open"); > + err(1, "xc_interface_open"); > + > + t = strtoul(argv[1], &argv[1], 0); > + > + // argv1 NaN NaN is a term normally used for floating point values only. > + if ( *argv[1] != '\0' ) > + errx(1, "Error: timeout must be a number, got '%s'", argv[1]); This still doesn't guarantee a numeric: An empty string as argument would still yield a value of 0 if I'm not mistaken. As would a string consisting of just blanks. > - t = strtoul(argv[1], NULL, 0); > if (t == ULONG_MAX) > - err(1, "strtoul"); > + err(1, "strtoul"); > > s = t / 2; > if (argc == 3) { > - s = strtoul(argv[2], NULL, 0); > - if (s == ULONG_MAX) > - err(1, "strtoul"); > + s = strtoul(argv[2], &argv[2], 0); > + // argv2 NaN > + if ( *argv[2] != '\0' ){ > + errx(1, "Error: sleep must be a number, got '%s'", argv[2]); > + } Like above you don't really need braces here. If, however, you add them, the opening one wants to be separated by a blank from the closing parenthesis. And following other style in this file, there do not want to be blanks immediately inside the parentheses. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |