X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fdhcpd-pools.c;h=ef18faa8383bb31502edfa24df7dbfa6f77de138;hb=f32e023ecf6af961f5b39f03285349336e59f214;hp=a27724d042e27759bd4100ec75c64e53047166d9;hpb=74aef1c34e31699595b4b198bcde5ac1af694260;p=debian%2Fdhcpd-pools.git diff --git a/src/dhcpd-pools.c b/src/dhcpd-pools.c index a27724d..ef18faa 100644 --- a/src/dhcpd-pools.c +++ b/src/dhcpd-pools.c @@ -27,7 +27,6 @@ #ifdef HAVE_STDLIB_H #include #else /* Not STDC_HEADERS */ -extern void exit(); extern char *malloc(); #endif /* STDC_HEADERS */ #ifdef HAVE_STRING_H @@ -36,13 +35,15 @@ extern char *malloc(); #include #endif #include +#include +#include #include "dhcpd-pools.h" #include "defaults.h" int main(int argc, char **argv) { - int c, sorts = 0; + int i, c, sorts = 0; int option_index = 0; char *tmp; struct range_t *tmp_ranges; @@ -61,17 +62,13 @@ int main(int argc, char **argv) {0, 0, 0, 0} }; - program_name = argv[0]; - atexit(clean_up); - - /* TODO: make either dynamic or find out max path lenght that auto config - * provides */ + /* FIXME: make these allocations dynamic up on need. */ config.dhcpdconf_file = safe_malloc(sizeof(char) * MAXLEN); config.dhcpdlease_file = safe_malloc(sizeof(char) * MAXLEN); config.output_file = safe_malloc(sizeof(char) * MAXLEN); - /* Make sure string has zero lenght if there is no command line - * option */ + /* Make sure string has zero lenght if there is no + * command line option */ config.output_file[0] = '\0'; /* File location defaults */ @@ -100,59 +97,30 @@ int main(int argc, char **argv) break; switch (c) { - case 0: - break; case 'c': /* config file */ - if (optarg != NULL) { - strncpy(config.dhcpdconf_file, optarg, - (size_t) MAXLEN - 1); - } else { - eprintf - ("main: for argument configuration file parameter not set"); - usage(EXIT_FAILURE); - } + strncpy(config.dhcpdconf_file, optarg, + (size_t) MAXLEN - 1); break; case 'l': /* lease file */ - if (optarg != NULL) { - strncpy(config.dhcpdlease_file, optarg, - (size_t) MAXLEN - 1); - } else { - eprintf - ("main: for argument lease file parameter not set"); - usage(EXIT_FAILURE); - } + strncpy(config.dhcpdlease_file, optarg, + (size_t) MAXLEN - 1); break; case 'f': /* Output format */ - if (optarg != NULL) { - strncpy(config.output_format, optarg, - (size_t) 1); - } else { - eprintf - ("main: for argument output format parameter not set"); - usage(EXIT_FAILURE); - } + strncpy(config.output_format, optarg, (size_t) 1); break; case 's': /* Output sorting option */ - if (optarg != NULL) { - sorts = strlen(optarg); - if (sorts > 5) { - eprintf - ("main: only 5 first sort orders will be used"); - strncpy(config.sort, optarg, - (size_t) 5); - sorts = 5; - } else { - strncpy(config.sort, optarg, - (size_t) sorts); - } + sorts = strlen(optarg); + if (5 < sorts) { + warnx("main: only first 5 sort orders will be used"); + strncpy(config.sort, optarg, (size_t) 5); + sorts = 5; } else { - eprintf - ("main: for argument sort order parameter not set"); - usage(EXIT_FAILURE); + strncpy(config.sort, optarg, + (size_t) sorts); } break; case 'r': @@ -161,51 +129,33 @@ int main(int argc, char **argv) break; case 'o': /* Output file */ - if (optarg != NULL) { - strncpy(config.output_file, optarg, - (size_t) MAXLEN - 1); - } else { - eprintf - ("main: for argument output file parameter not set"); - usage(EXIT_FAILURE); - } + strncpy(config.output_file, optarg, + (size_t) MAXLEN - 1); break; case 'L': /* Specification what will be printed */ - if (optarg != NULL) { - if (optarg[0] >= '0' && optarg[0] < '8') { - config.output_limit[0] = - (int) optarg[0] - '0'; - } else { - eprintf - ("main: output mask %s illegal", - argv[optind]); - usage(EXIT_FAILURE); - } - if (optarg[1] >= '0' && optarg[1] < '8') { - config.output_limit[1] = - (int) optarg[1] - '0'; + for (i = 0; i < 2; i++) { + if (optarg[i] >= '0' && optarg[i] < '8') { + config.output_limit[i] = + (int) optarg[i] - '0'; } else { - eprintf - ("main: output mask %s illegal", + errx(EXIT_FAILURE, + "main: output mask `%s' is illegal", optarg); - usage(EXIT_FAILURE); } - } else { - eprintf - ("main: for argument output mask parameter not set"); - usage(EXIT_FAILURE); } break; case 'v': /* Print version */ print_version(); - exit(EXIT_SUCCESS); + return (EXIT_SUCCESS); case 'h': /* Print help */ usage(EXIT_SUCCESS); default: - usage(EXIT_FAILURE); + errx(EXIT_FAILURE, + "Try `%s --help' for more information.", + program_invocation_short_name); } } @@ -230,13 +180,9 @@ int main(int argc, char **argv) case 'c': output_analysis = output_csv; break; - case 's': - /* output_analysis = output_snmp; */ - output_analysis = output_txt; - break; default: - eprintf("main: unknown ouput format"); - usage(EXIT_FAILURE); + errx(EXIT_FAILURE, "main: unknown ouput format `%c'", + config.output_format[0]); } /* Do the job */ @@ -245,6 +191,7 @@ int main(int argc, char **argv) shared_net_names + strlen(shared_net_names) + 1, shared_networks); + /* FIXME: move to output.c and use FILE *outfile */ if ((config.output_format[0] == 'x') || (config.output_format[0] == 'X')) { printf("\n"); @@ -262,13 +209,22 @@ int main(int argc, char **argv) } free(tmp_ranges); output_analysis(); - + /* After fopen in ouput ioctl does like /dev/null which + * cause ENOTTY, and clean_up will see that without this + * reset. At least linux does this, and possibly some + * other systems. There's a report from FreeBSD 8.0 which + * matches quite well with the symptom. */ + if (errno == 25) + errno = 0; + + /* FIXME: move to output.c and use FILE *outfile */ if ((config.output_format[0] == 'x') || (config.output_format[0] == 'X')) { printf("\n"); }; - exit(EXIT_SUCCESS); + clean_up(); + return (EXIT_SUCCESS); } /* Global allocations, counter resets etc */