From: Sami Kerola Date: Mon, 11 Apr 2011 18:52:40 +0000 (+0200) Subject: shared network names to be dynamically allocated X-Git-Tag: v2.15~1 X-Git-Url: http://git.asbjorn.biz/?p=debian%2Fdhcpd-pools.git;a=commitdiff_plain;h=c81af2df4585433c0a86f09cb60cd40e4eef95a9 shared network names to be dynamically allocated This patch is a step a head to make data all structures completely dynamic. After this the next obvious thing to do is to make shared networks struct a linked list instead of a list. Signed-off-by: Sami Kerola --- diff --git a/src/defaults.h b/src/defaults.h index 1c81bfe..8cb69e0 100644 --- a/src/defaults.h +++ b/src/defaults.h @@ -21,9 +21,6 @@ /* Maximum line length in dhcpd.conf and dhcpd.leases */ static const int MAXLEN = 1024; -/* Total number of characters in all shared network names */ -static const unsigned int SHARED_NETWORKS_NAMES = 65536; - /* Maximum number of shared networks */ static const unsigned int SHARED_NETWORKS = 8192; diff --git a/src/dhcpd-pools.c b/src/dhcpd-pools.c index db8495b..abcb8ca 100644 --- a/src/dhcpd-pools.c +++ b/src/dhcpd-pools.c @@ -189,9 +189,7 @@ int main(int argc, char **argv) /* Do the job */ prepare_memory(); - parse_config(true, config.dhcpdconf_file, shared_net_names, - shared_net_names + strlen(shared_net_names) + 1, - shared_networks); + parse_config(true, config.dhcpdconf_file, shared_networks); parse_leases(); prepare_data(); @@ -217,13 +215,12 @@ int prepare_memory() num_ranges = num_shared_networks = 0; shared_networks = safe_malloc(sizeof(struct shared_network_t) * SHARED_NETWORKS); - shared_net_names = - 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"); + shared_networks->name = safe_strdup("All networks"); + return 0; } diff --git a/src/dhcpd-pools.h b/src/dhcpd-pools.h index e3835ad..fcf75b2 100644 --- a/src/dhcpd-pools.h +++ b/src/dhcpd-pools.h @@ -107,7 +107,6 @@ static int const output_limit_bit_3 = 4; unsigned int fullhtml; struct shared_network_t *shared_networks; -char *shared_net_names; unsigned int num_shared_networks; struct range_t *ranges; @@ -127,8 +126,8 @@ struct macaddr_t *macaddr; /* Function prototypes */ int prepare_memory(void); int parse_leases(void); -char *parse_config(int, char *, char *, char *, struct shared_network_t *) - __attribute__ ((nonnull(2, 3, 4))); +void parse_config(int, char *, struct shared_network_t *) + __attribute__ ((nonnull(2, 3))); int nth_field(int n, char *dest, const char *src) __attribute__ ((nonnull(2, 3))) #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) diff --git a/src/getdata.c b/src/getdata.c index 1334855..5456b65 100644 --- a/src/getdata.c +++ b/src/getdata.c @@ -212,10 +212,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 = @@ -225,14 +223,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 */ @@ -319,8 +314,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; @@ -410,30 +403,14 @@ 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 - * away by reallocationg - * more space. */ - errx(EXIT_FAILURE, - "parse_config: increase default.h SHARED_NETWORKS_NAMES and recompile"); - } if (SHARED_NETWORKS < num_shared_networks + 2) { /* FIXME: make this @@ -448,11 +425,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: @@ -467,5 +440,5 @@ char *parse_config(int is_include, char *config_file, } free(word); fclose(dhcpd_config); - return next_free_shared_name; + return; } diff --git a/src/other.c b/src/other.c index 21a763a..4a9730b 100644 --- a/src/other.c +++ b/src/other.c @@ -85,25 +85,22 @@ void flip_ranges(struct range_t *ranges, struct range_t *tmp_ranges) /* Free memory, flush buffers etc */ void clean_up(void) { - int ret; + unsigned int i; /* Just in case there something in buffers */ - ret = fflush(stdout); - if (errno || ret) { - warn("clean_up: stdout"); + if (fflush(NULL)) { + warn("clean_up: fflush"); } - ret = fflush(stderr); - if (errno || ret) { - warn("clean_up: stderr"); + num_shared_networks++; + for (i = 0; i < num_shared_networks; i++) { + free((shared_networks + i)->name); } - free(config.dhcpdconf_file); free(config.dhcpdlease_file); free(config.output_file); free(ranges); free(leases); free(touches); - free(shared_net_names); free(shared_networks); }