make range allocation dynamic
[debian/dhcpd-pools.git] / src / getdata.c
index b1e79b9..1334855 100644 (file)
@@ -1,19 +1,18 @@
-/*
-** Copyright (C) 2006- Sami Kerola <kerolasa@iki.fi>
-**  
-** This program is free software; you can redistribute it and/or modify
+/* 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 2 of the License, or
+** 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, write to the Free Software 
-** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+** along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #ifdef HAVE_CONFIG_H
@@ -61,9 +60,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;
@@ -76,16 +76,18 @@ int parse_leases(void)
                err(EXIT_FAILURE, "parse_leases: %s",
                    config.dhcpdlease_file);
        }
-#ifdef POSIX_FADV_NOREUSE
-       posix_fadvise((long) dhcpd_leases, 0, 0, POSIX_FADV_NOREUSE);
+#ifdef POSIX_FADV_WILLNEED
+       posix_fadvise((long) dhcpd_leases, 0, 0, POSIX_FADV_WILLNEED);
        if (errno) {
-               err(EXIT_FAILURE, "parse_leases: fadvise noreuse");
+               err(EXIT_FAILURE, "parse_leases: fadvise %s",
+                   config.dhcpdlease_file);
        }
-#endif                         /* POSIX_FADV_NOREUSE */
+#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 sequential");
+               err(EXIT_FAILURE, "parse_leases: fadvise %s",
+                   config.dhcpdlease_file);
        }
 #endif                         /* POSIX_FADV_SEQUENTIAL */
 
@@ -106,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);
@@ -139,19 +145,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;
 }
 
@@ -228,16 +240,16 @@ char *parse_config(int is_include, char *config_file,
        if (dhcpd_config == NULL) {
                err(EXIT_FAILURE, "parse_config: %s", config_file);
        }
-#ifdef POSIX_FADV_NOREUSE
-       posix_fadvise((long) dhcpd_config, 0, 0, POSIX_FADV_NOREUSE);
+#ifdef POSIX_FADV_WILLNEED
+       posix_fadvise((long) dhcpd_config, 0, 0, POSIX_FADV_WILLNEED);
        if (errno) {
-               err(EXIT_FAILURE, "parse_config: fadvise noreuse");
+               err(EXIT_FAILURE, "parse_config: fadvise %s", config_file);
        }
-#endif                         /* POSIX_FADV_NOREUSE */
+#endif                         /* POSIX_FADV_WILLNEED */
 #ifdef POSIX_FADV_SEQUENTIAL
        posix_fadvise((long) dhcpd_config, 0, 0, POSIX_FADV_SEQUENTIAL);
        if (errno) {
-               err(EXIT_FAILURE, "parse_config: fadvise sequential");
+               err(EXIT_FAILURE, "parse_config: fadvise %s", config_file);
        }
 #endif                         /* POSIX_FADV_SEQUENTIAL */
 
@@ -374,9 +386,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;
@@ -415,7 +432,15 @@ char *parse_config(int is_include, char *config_file,
                                         * 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_NAMES and recompile");
+                               }
+                               if (SHARED_NETWORKS <
+                                   num_shared_networks + 2) {
+                                       /* FIXME: make this
+                                        * away by reallocationg
+                                        * more space. */
+                                       errx(EXIT_FAILURE,
+                                            "parse_config: increase default.h SHARED_NETWORKS and recompile");
                                }
                                argument = 0;
                                braces_shared = braces;
@@ -441,5 +466,6 @@ char *parse_config(int is_include, char *config_file,
                }
        }
        free(word);
+       fclose(dhcpd_config);
        return next_free_shared_name;
 }