From 171ff1d7045de1059556f674470aa87a853563f0 Mon Sep 17 00:00:00 2001 From: Sami Kerola Date: Tue, 8 Feb 2011 22:11:49 +0100 Subject: [PATCH] Allow xml output with leases to use output file Signed-off-by: Sami Kerola --- src/dhcpd-pools.c | 16 +++------------- src/dhcpd-pools.h | 10 ++++++++++ src/getdata.c | 38 +++++++++++++++++++++++++------------- src/getopt.c | 9 ++++++--- src/other.c | 12 ++++++++++++ src/output.c | 33 +++++++++++++-------------------- src/sort.c | 2 +- 7 files changed, 70 insertions(+), 50 deletions(-) diff --git a/src/dhcpd-pools.c b/src/dhcpd-pools.c index 1e1c377..386ccf4 100644 --- a/src/dhcpd-pools.c +++ b/src/dhcpd-pools.c @@ -114,7 +114,8 @@ int main(int argc, char **argv) /* Output sorting option */ sorts = strlen(optarg); if (5 < sorts) { - warnx("main: only first 5 sort orders will be used"); + warnx + ("main: only first 5 sort orders will be used"); strncpy(config.sort, optarg, (size_t) 5); sorts = 5; } else { @@ -193,12 +194,6 @@ 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"); - }; - parse_leases(); prepare_data(); do_counting(); @@ -219,12 +214,6 @@ int main(int argc, char **argv) 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"); - }; - clean_up(); return (EXIT_SUCCESS); } @@ -239,6 +228,7 @@ int prepare_memory() safe_malloc(sizeof(char) * SHARED_NETWORKS_NAMES); ranges = safe_malloc(sizeof(struct range_t) * RANGES); + macaddr = NULL; /* First shared network entry is all networks */ strcpy(shared_net_names, "All networks"); diff --git a/src/dhcpd-pools.h b/src/dhcpd-pools.h index 4c4e79d..a17c6b8 100644 --- a/src/dhcpd-pools.h +++ b/src/dhcpd-pools.h @@ -59,6 +59,13 @@ struct range_t unsigned long int touched; unsigned long int backups; }; +struct macaddr_t +{ + char *ethernet; + char *ip; + struct macaddr_t *next; +}; + /* Global variables */ static int const true = 1; static int const false = 0; @@ -86,6 +93,8 @@ unsigned long int num_touches; unsigned long int *backups; unsigned long int num_backups; +struct macaddr_t *macaddr; + /* Function prototypes */ int prepare_memory (void); int parse_leases (void); @@ -96,6 +105,7 @@ int do_counting (void); void flip_ranges(struct range_t *ranges, struct range_t *tmp_ranges); /* General support functions */ void *safe_malloc (const size_t size); +inline char *safe_strdup(const char *str); void print_version (void); void usage (int status); /* qsort required functions... */ diff --git a/src/getdata.c b/src/getdata.c index 4486086..fe513ae 100644 --- a/src/getdata.c +++ b/src/getdata.c @@ -60,9 +60,10 @@ extern char *malloc(); int parse_leases(void) { FILE *dhcpd_leases; - char *line, *ipstring, *macstring, *macstring2; + char *line, *ipstring, *macstring; struct in_addr inp; struct stat lease_file_stats; + struct macaddr_t *macaddr_p; unsigned long leasesmallocsize; unsigned long touchesmallocsize; unsigned long backupsmallocsize; @@ -78,13 +79,15 @@ int parse_leases(void) #ifdef POSIX_FADV_WILLNEED posix_fadvise((long) dhcpd_leases, 0, 0, POSIX_FADV_WILLNEED); if (errno) { - err(EXIT_FAILURE, "parse_leases: fadvise %s", config.dhcpdlease_file); + err(EXIT_FAILURE, "parse_leases: fadvise %s", + config.dhcpdlease_file); } #endif /* POSIX_FADV_WILLNEED */ #ifdef POSIX_FADV_SEQUENTIAL posix_fadvise((long) dhcpd_leases, 0, 0, POSIX_FADV_SEQUENTIAL); if (errno) { - err(EXIT_FAILURE, "parse_leases: fadvise %s", config.dhcpdlease_file); + err(EXIT_FAILURE, "parse_leases: fadvise %s", + config.dhcpdlease_file); } #endif /* POSIX_FADV_SEQUENTIAL */ @@ -105,8 +108,12 @@ int parse_leases(void) line = safe_malloc(sizeof(long int) * MAXLEN); ipstring = safe_malloc(sizeof(long int) * MAXLEN); - macstring = safe_malloc(sizeof(long int) * MAXLEN); - macstring2 = safe_malloc(sizeof(long int) * MAXLEN); + if (config.output_format[0] == 'X') { + macstring = safe_malloc(sizeof(char) * 18); + macaddr = safe_malloc(sizeof(struct macaddr_t)); + macaddr_p = macaddr; + macaddr_p->next = NULL; + } while (!feof(dhcpd_leases)) { fgets(line, MAXLEN, dhcpd_leases); @@ -138,19 +145,24 @@ int parse_leases(void) assert(!(backupsmallocsize < num_backups)); } - /* FIXME: move to output.c and use the FILE - * *outfile */ - if ((config.output_format[0] == 'X') + if ((macaddr != NULL) && (sw_active_lease == 1) && (strstr(line, "hardware ethernet"))) { nth_field(3, macstring, line); - macstring[strlen(macstring) - 1] = '\0'; - - printf - ("\n\t%s\n\t%s\n\n", - ipstring, macstring); + macstring[17] = '\0'; + macaddr_p->ethernet = safe_strdup(macstring); + macaddr_p->ip = safe_strdup(ipstring); + macaddr_p->next = + safe_malloc(sizeof(struct macaddr_t)); + macaddr_p = macaddr_p->next; + macaddr_p->next = NULL; } } + free(line); + free(ipstring); + if (macaddr != NULL) { + free(macstring); + } return 0; } diff --git a/src/getopt.c b/src/getopt.c index 697169c..9f01d83 100644 --- a/src/getopt.c +++ b/src/getopt.c @@ -700,7 +700,8 @@ int long_only; _ ("%s: option `--%s' doesn't allow an argument\n"), argv[0], - pfound->name); + pfound-> + name); else /* +option or -option */ fprintf(stderr, @@ -710,7 +711,8 @@ int long_only; argv[optind - 1][0], - pfound->name); + pfound-> + name); } nextchar += strlen(nextchar); @@ -884,7 +886,8 @@ int long_only; else { if (print_errors) fprintf(stderr, _("\ -%s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); +%s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound-> + name); nextchar += strlen(nextchar); diff --git a/src/other.c b/src/other.c index 4ad6b01..60406e5 100644 --- a/src/other.c +++ b/src/other.c @@ -50,6 +50,16 @@ void *safe_malloc(const size_t size) return ret; } +/* Simple strdup wrapper */ +inline char *safe_strdup(const char *str) +{ + char *ret = strdup(str); + + if (!ret && str) + err(EXIT_FAILURE, "cannot duplicate string"); + return ret; +} + void flip_ranges(struct range_t *ranges, struct range_t *tmp_ranges) { unsigned int i = num_ranges - 1, j; @@ -66,6 +76,7 @@ void flip_ranges(struct range_t *ranges, struct range_t *tmp_ranges) void clean_up(void) { int ret; + if (errno) { warn("clean_up: errno (%d) set but not checked in correct place.\nif this is repeatable send strace output as a bug report", errno); } @@ -78,6 +89,7 @@ void clean_up(void) if (errno || ret) { warn("clean_up: stderr"); } + free(config.dhcpdconf_file); free(config.dhcpdlease_file); free(config.output_file); diff --git a/src/output.c b/src/output.c index 657af88..874efa4 100644 --- a/src/output.c +++ b/src/output.c @@ -190,6 +190,7 @@ int output_xml(void) struct in_addr first, last; struct range_t *range_p; struct shared_network_t *shared_p; + struct macaddr_t *macaddr_p; int ret; FILE *outfile; @@ -206,13 +207,22 @@ int output_xml(void) range_p = ranges; shared_p = shared_networks; + fprintf(outfile, "\n"); + + if (macaddr != NULL) { + for (macaddr_p = macaddr; macaddr_p->next != NULL; + macaddr_p = macaddr_p->next) { + fprintf(outfile, + "\n\t%s\n\t%s\n\n", + macaddr_p->ip, macaddr_p->ethernet); + } + } + if (config.output_limit[1] & output_limit_bit_1) { for (i = 0; i < num_ranges; i++) { first.s_addr = ntohl(range_p->first_ip + 1); last.s_addr = ntohl(range_p->last_ip - 1); - fprintf(outfile, "\n"); - if (range_p->shared_net) { fprintf(outfile, "\t%s\n", @@ -235,9 +245,7 @@ int output_xml(void) fprintf(outfile, "\t%lu\n", range_p->last_ip - range_p->first_ip - 1 - range_p->count); - range_p++; - fprintf(outfile, "\n"); } } @@ -245,7 +253,6 @@ int output_xml(void) if (config.output_limit[1] & output_limit_bit_2) { for (i = 0; i < num_shared_networks; i++) { shared_p++; - fprintf(outfile, "\n"); fprintf(outfile, "\t%s\n", shared_p->name); @@ -273,6 +280,7 @@ int output_xml(void) fprintf(outfile, "\n"); } + fprintf(outfile, "\n"); if (outfile == stdout) { ret = fflush(stdout); if (ret) { @@ -355,7 +363,6 @@ void html_footer(FILE * f) fprintf(f, "

\nData generated by "); fprintf(f, "", PACKAGE_URL); fprintf(f, "dhcpd-pools.\n

\n"); - fprintf(f, "

\n"); fprintf(f, "