licensing: use FreeBSD license (was GNUv3)
[debian/dhcpd-pools.git] / src / getdata.c
index 4486086..2c5e627 100644 (file)
@@ -1,28 +1,42 @@
-/* http://dhcpd-pools.sourceforge.net/
-** Copyright 2006- Sami Kerola <kerolasa@iki.fi>
-**
-** This program is free software: you can redistribute it and/or modify
-** it under the terms of the GNU General Public License as published by
-** the Free Software Foundation, either version 3 of the License, or
-** (at your option) any later version.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
+/*
+ * The dhcpd-pools has BSD 2-clause license which also known as "Simplified
+ * BSD License" or "FreeBSD License".
+ *
+ * Copyright 2006- Sami Kerola. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *    1. Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *
+ *    2. Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the
+ *       distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are
+ * those of the authors and should not be interpreted as representing
+ * official policies, either expressed or implied, of Sami Kerola.
+ */
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
 
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
 #ifdef  HAVE_STDLIB_H
 #include <stdlib.h>
 #else                          /* Not STDC_HEADERS */
@@ -37,20 +51,20 @@ extern char *malloc();
 #include <strings.h>
 #endif
 
-#include <stdio.h>
 #include <arpa/inet.h>
+#include <assert.h>
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <features.h>
 #include <netinet/in.h>
-#include <sys/socket.h>
+#include <stddef.h>
+#include <stdio.h>
 #include <sys/stat.h>
-#include <sys/types.h>
 #ifndef _XOPEN_SOURCE
 #define _XOPEN_SOURCE 600
 #endif
-#include <fcntl.h>
-#include <errno.h>
-#include <err.h>
-#include <ctype.h>
-#include <assert.h>
 
 #include "dhcpd-pools.h"
 #include "defaults.h"
@@ -60,9 +74,10 @@ extern char *malloc();
 int parse_leases(void)
 {
        FILE *dhcpd_leases;
-       char *line, *ipstring, *macstring, *macstring2;
+       char *line, *ipstring, *macstring = NULL;
        struct in_addr inp;
        struct stat lease_file_stats;
+       struct macaddr_t *macaddr_p = NULL;
        unsigned long leasesmallocsize;
        unsigned long touchesmallocsize;
        unsigned long backupsmallocsize;
@@ -78,13 +93,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 +122,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 +159,25 @@ 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);
+       }
+       fclose(dhcpd_leases);
        return 0;
 }
 
@@ -199,10 +226,8 @@ int is_interesting_config_clause(char *s)
 }
 
 /* FIXME: This spagetti monster function need to be rewrote at least ones. */
-char *parse_config(int is_include, char *config_file,
-                  char *current_shared_name,
-                  char *next_free_shared_name,
-                  struct shared_network_t *shared_p)
+void parse_config(int is_include, char *config_file,
+                 struct shared_network_t *shared_p)
 {
        FILE *dhcpd_config;
        int i = 0, newclause = true, argument = false, comment =
@@ -212,14 +237,11 @@ char *parse_config(int is_include, char *config_file,
        struct in_addr inp;
        struct range_t *range_p;
 
-       char *last_shared_name;
-       last_shared_name = SHARED_NETWORKS_NAMES + shared_net_names;
-
        word = safe_malloc(sizeof(char) * MAXLEN);
 
        if (is_include) {
                /* Default place holder for ranges "All networks". */
-               shared_p->name = current_shared_name;
+               shared_p->name = shared_networks->name;
        }
 
        /* Open configuration file */
@@ -306,8 +328,6 @@ char *parse_config(int is_include, char *config_file,
                                braces--;
                                /* End of shared-network */
                                if (braces_shared == braces) {
-                                       current_shared_name =
-                                           shared_net_names;
                                        /* FIXME: Using 1000 is lame, but
                                         * works. */
                                        braces_shared = 1000;
@@ -373,9 +393,14 @@ char *parse_config(int is_include, char *config_file,
                                range_p->backups = 0;
                                range_p->shared_net = shared_p;
                                num_ranges++;
-                               if (RANGES < num_ranges) {
-                                       errx(EXIT_FAILURE,
-                                            "parse_config: Range space full! Increase RANGES and recompile.");
+                               if (RANGES < num_ranges + 1) {
+                                       RANGES *= 2;
+                                       ranges =
+                                           safe_realloc(ranges,
+                                                        sizeof(struct
+                                                               range_t) *
+                                                        RANGES);
+                                       range_p = ranges + num_ranges;
                                }
                                newclause = true;
                                break;
@@ -392,29 +417,21 @@ char *parse_config(int is_include, char *config_file,
                                break;
                        case 1:
                                /* printf ("shared-network named: %s\n", word); */
-                               strcpy(next_free_shared_name, word);
+                               num_shared_networks++;
                                shared_p =
                                    shared_networks + num_shared_networks;
-                               num_shared_networks++;
-                               shared_p++;
-                               shared_p->name = next_free_shared_name;
+                               shared_p->name = safe_strdup(word);
                                shared_p->available = 0;
                                shared_p->used = 0;
                                shared_p->touched = 0;
                                shared_p->backups = 0;
-                               /* Temporary abuse of argument
-                                * variable */
-                               argument =
-                                   strlen(next_free_shared_name) + 1;
-                               if (next_free_shared_name + argument <
-                                   last_shared_name) {
-                                       next_free_shared_name += argument;
-                               } else {
-                                       /* FIXME: make this go
+                               if (SHARED_NETWORKS <
+                                   num_shared_networks + 2) {
+                                       /* FIXME: make this
                                         * away by reallocationg
                                         * more space. */
                                        errx(EXIT_FAILURE,
-                                            "parse_config: End of shared-network space, increase SHARED_NETWORKS_NAMES and recompile");
+                                            "parse_config: increase default.h SHARED_NETWORKS and recompile");
                                }
                                argument = 0;
                                braces_shared = braces;
@@ -422,11 +439,7 @@ char *parse_config(int is_include, char *config_file,
                        case 4:
                                /* printf ("include file: %s\n", word); */
                                argument = 0;
-                               next_free_shared_name =
-                                   parse_config(false, word,
-                                                current_shared_name,
-                                                next_free_shared_name,
-                                                shared_p);
+                               parse_config(false, word, shared_p);
                                newclause = true;
                                break;
                        case 0:
@@ -440,5 +453,6 @@ char *parse_config(int is_include, char *config_file,
                }
        }
        free(word);
-       return next_free_shared_name;
+       fclose(dhcpd_config);
+       return;
 }