summaryrefslogtreecommitdiffstats
path: root/ippool/libippool.c
diff options
context:
space:
mode:
Diffstat (limited to 'ippool/libippool.c')
-rw-r--r--ippool/libippool.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/ippool/libippool.c b/ippool/libippool.c
new file mode 100644
index 0000000..7f3ac76
--- /dev/null
+++ b/ippool/libippool.c
@@ -0,0 +1,72 @@
+/* support functions for ip_pool modules */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <libippool/ip_pool_support.h>
+
+void ip_pool_init(void)
+{
+}
+
+ip_pool_t ip_pool_get_index(char *name)
+{
+ FILE *fp;
+ char buf[256];
+
+ if (isdigit(*name))
+ return atoi(name);
+ fp = fopen(IPPOOL_CONF, "r");
+ if (!fp) exit_error(PARAMETER_PROBLEM,
+ "cannot open %s - no pool names", IPPOOL_CONF);
+ while (fgets(buf, sizeof(buf), fp)) {
+ char *p = strtok(buf, " \t\n");
+ ip_pool_t index;
+
+ if (!p || *p == '#') continue;
+ index = atoi(p);
+ p = strtok(0, " \t\n");
+ if (p && 0 == strcmp(p, name)) {
+ fclose(fp);
+ return index;
+ }
+ }
+ exit_error(PARAMETER_PROBLEM,
+ "pool '%s' not found in %s\n", name, IPPOOL_CONF);
+}
+
+char *ip_pool_get_name(char *buf, int size, ip_pool_t index, int numeric)
+{
+ FILE *fp;
+ int ok = 0;
+
+ /* make sure we have enough room, at least for a %d */
+ if (size < 16)
+ exit_error(PARAMETER_PROBLEM,
+ "ip_pool_support:get_name buf too small (%d vs. 16)\n",
+ size);
+ if (numeric)
+ goto do_numeric;
+ fp = fopen(IPPOOL_CONF, "r");
+ if (fp) {
+ while (fgets(buf, size, fp)) {
+ char *p = strtok(buf, " \t\n");
+
+ if (!p || *p == '#') continue;
+ if (index != atoi(p)) continue;
+ p = strtok(0, " \t\n");
+ if (!p || *p == '#') continue;
+ memmove(buf, p, strlen(p)+1);
+ ok = 1;
+ break;
+ }
+ fclose(fp);
+ }
+ if (!ok) {
+do_numeric:
+ sprintf(buf, "%d", index);
+ }
+ return buf;
+}