Allow xml output with leases to use output file
authorSami Kerola <kerolasa@iki.fi>
Tue, 8 Feb 2011 21:11:49 +0000 (22:11 +0100)
committerSami Kerola <kerolasa@iki.fi>
Tue, 8 Feb 2011 21:11:49 +0000 (22:11 +0100)
Signed-off-by: Sami Kerola <kerolasa@iki.fi>

src/dhcpd-pools.c
src/dhcpd-pools.h
src/getdata.c
src/getopt.c
src/other.c
src/output.c
src/sort.c

index 1e1c377..386ccf4 100644 (file)
@@ -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("<dhcpstatus>\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("</dhcpstatus>\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");
index 4c4e79d..a17c6b8 100644 (file)
@@ -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... */
index 4486086..fe513ae 100644 (file)
@@ -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
-                           ("<active_lease>\n\t<ip>%s</ip>\n\t<macaddress>%s</macaddress>\n</active_lease>\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;
 }
 
index 697169c..9f01d83 100644 (file)
@@ -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);
index 4ad6b01..60406e5 100644 (file)
@@ -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);
index 657af88..874efa4 100644 (file)
@@ -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, "<dhcpstatus>\n");
+
+       if (macaddr != NULL) {
+               for (macaddr_p = macaddr; macaddr_p->next != NULL;
+                    macaddr_p = macaddr_p->next) {
+                       fprintf(outfile,
+                               "<active_lease>\n\t<ip>%s</ip>\n\t<macaddress>%s</macaddress>\n</active_lease>\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, "<subnet>\n");
-
                        if (range_p->shared_net) {
                                fprintf(outfile,
                                        "\t<location>%s</location>\n",
@@ -235,9 +245,7 @@ int output_xml(void)
                        fprintf(outfile, "\t<free>%lu</free>\n",
                                range_p->last_ip - range_p->first_ip - 1 -
                                range_p->count);
-
                        range_p++;
-
                        fprintf(outfile, "</subnet>\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, "<shared-network>\n");
                        fprintf(outfile, "\t<location>%s</location>\n",
                                shared_p->name);
@@ -273,6 +280,7 @@ int output_xml(void)
                fprintf(outfile, "</summary>\n");
        }
 
+       fprintf(outfile, "</dhcpstatus>\n");
        if (outfile == stdout) {
                ret = fflush(stdout);
                if (ret) {
@@ -355,7 +363,6 @@ void html_footer(FILE * f)
        fprintf(f, "<p class=created>\nData generated by ");
        fprintf(f, "<a href=\"%s\">", PACKAGE_URL);
        fprintf(f, "dhcpd-pools</a>.\n</p>\n");
-
        fprintf(f, "<p class=updated>\n");
        fprintf(f, "<script type=\"text/javascript\">\n");
        fprintf(f, "  document.write(\"Last Updated On \" + ");
@@ -407,7 +414,6 @@ void newsection(FILE * f, char *title)
        newrow(f);
        output_line(f, "td", "calign", "&nbsp;");
        endrow(f);
-
        newrow(f);
        output_line(f, "th", "section", title);
        endrow(f);
@@ -421,7 +427,6 @@ int output_html(void)
        struct shared_network_t *shared_p;
        int ret;
        FILE *outfile;
-
        if (config.output_file[0]) {
                outfile = fopen(config.output_file, "w+");
                if (outfile == NULL) {
@@ -434,7 +439,6 @@ int output_html(void)
 
        range_p = ranges;
        shared_p = shared_networks;
-
        if (fullhtml) {
                html_header(outfile);
        }
@@ -461,7 +465,6 @@ int output_html(void)
                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);
-
                        newrow(outfile);
                        if (range_p->shared_net) {
                                output_line(outfile, "td", "calign",
@@ -508,7 +511,6 @@ int output_html(void)
        table_start(outfile);
        if (config.output_limit[0] & output_limit_bit_2) {
                newsection(outfile, "Shared networks:");
-
                newrow(outfile);
                output_line(outfile, "th", "calign", "name");
                output_line(outfile, "th", "ralign", "max");
@@ -556,7 +558,6 @@ int output_html(void)
        }
        if (config.output_limit[0] & output_limit_bit_3) {
                newsection(outfile, "Sum of all ranges:");
-
                newrow(outfile);
                output_line(outfile, "th", "calign", "name");
                output_line(outfile, "th", "ralign", "max");
@@ -626,7 +627,6 @@ int output_csv(void)
        struct shared_network_t *shared_p;
        FILE *outfile;
        int ret;
-
        if (config.output_file[0]) {
                outfile = fopen(config.output_file, "w+");
                if (outfile == NULL) {
@@ -639,7 +639,6 @@ int output_csv(void)
 
        range_p = ranges;
        shared_p = shared_networks;
-
        if (config.output_limit[0] & output_limit_bit_1) {
                fprintf(outfile, "\"Ranges:\"\n");
                fprintf
@@ -649,13 +648,11 @@ int output_csv(void)
                        fprintf(outfile, ",\"bu\",\"bu perc\"");
                }
                fprintf(outfile, "\n");
-
        }
        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);
-
                        if (range_p->shared_net) {
                                fprintf(outfile, "\"%s\",",
                                        range_p->shared_net->name);
@@ -685,7 +682,6 @@ int output_csv(void)
                                         range_p->first_ip - 1));
                        }
 
-
                        fprintf(outfile, "\n");
                        range_p++;
                }
@@ -723,8 +719,6 @@ int output_csv(void)
                        }
 
                        fprintf(outfile, "\n");
-
-
                }
                fprintf(outfile, "\n");
        }
@@ -758,7 +752,6 @@ int output_csv(void)
                                shared_networks->available);
                }
                fprintf(outfile, "\n");
-
        }
        if (outfile == stdout) {
                ret = fflush(stdout);
index 3ab7a47..c222c51 100644 (file)
@@ -119,7 +119,7 @@ void field_selector(char c)
        default:
                warnx("field_selector: unknown sort order `%c'", c);
                errx(EXIT_FAILURE, "Try `%s --help' for more information.",
-                       program_invocation_short_name);
+                    program_invocation_short_name);
        }
 }