]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/misc-progs/rebuildhosts.c
git-svn-id: http://svn.ipfire.org/svn/ipfire/IPFire/source@16 ea5c0bd1-69bd-2848...
[people/pmueller/ipfire-2.x.git] / src / misc-progs / rebuildhosts.c
diff --git a/src/misc-progs/rebuildhosts.c b/src/misc-progs/rebuildhosts.c
new file mode 100644 (file)
index 0000000..115cdba
--- /dev/null
@@ -0,0 +1,154 @@
+/* IPCop helper program - rebuildhosts\r
+ *\r
+ * This program is distributed under the terms of the GNU General Public\r
+ * Licence.  See the file COPYING for details.\r
+ *\r
+ * (c) Alan Hourihane, 2003\r
+ * \r
+ *\r
+ * $Id: rebuildhosts.c,v 1.3.2.6 2005/07/11 10:56:47 franck78 Exp $\r
+ *\r
+ */\r
+\r
+#include "libsmooth.h"\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <unistd.h>\r
+#include <fcntl.h>\r
+#include <string.h>\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+#include <signal.h>\r
+#include "setuid.h"\r
+\r
+FILE *fd = NULL;\r
+FILE *hosts = NULL;\r
+struct keyvalue *kv = NULL;\r
+\r
+void exithandler(void)\r
+{\r
+       if (kv)\r
+               freekeyvalues(kv);\r
+       if (fd)\r
+               fclose(fd);\r
+       if (hosts)\r
+               fclose(hosts);\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+       int fdpid; \r
+       char hostname[STRING_SIZE];\r
+       char domainname[STRING_SIZE] = "";\r
+       char buffer[STRING_SIZE];\r
+       char address[STRING_SIZE];\r
+       char *active, *ip, *host, *domain;\r
+       int pid;\r
+\r
+       if (!(initsetuid()))\r
+               exit(1);\r
+\r
+       atexit(exithandler);\r
+\r
+       memset(buffer, 0, STRING_SIZE);\r
+\r
+       kv = initkeyvalues();\r
+       if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))\r
+       {\r
+               fprintf(stderr, "Couldn't read ethernet settings\n");\r
+               exit(1);\r
+       }\r
+       findkey(kv, "GREEN_ADDRESS", address);\r
+       freekeyvalues(kv);\r
+\r
+       kv = initkeyvalues();\r
+       if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings")))\r
+       {\r
+               fprintf(stderr, "Couldn't read main settings\n");\r
+               exit(1);\r
+       }\r
+       strcpy(hostname, SNAME ); \r
+       findkey(kv, "HOSTNAME", hostname);\r
+       findkey(kv, "DOMAINNAME", domainname);\r
+       freekeyvalues(kv);\r
+       kv = NULL;\r
+\r
+       if (!(fd = fopen(CONFIG_ROOT "/main/hosts", "r")))\r
+       {\r
+               fprintf(stderr, "Couldn't open main hosts file\n");\r
+               exit(1);\r
+       }\r
+       if (!(hosts = fopen("/etc/hosts", "w")))\r
+       {\r
+               fprintf(stderr, "Couldn't open /etc/hosts file\n");\r
+               fclose(fd);\r
+               fd = NULL;\r
+               exit(1);\r
+       }\r
+       fprintf(hosts, "127.0.0.1\tlocalhost\n");\r
+       if (strlen(domainname))\r
+               fprintf(hosts, "%s\t%s.%s\t%s\n",address,hostname,domainname,hostname);\r
+       else\r
+               fprintf(hosts, "%s\t%s\n",address,hostname);\r
+       while (fgets(buffer, STRING_SIZE, fd))\r
+       {\r
+               buffer[strlen(buffer) - 1] = 0;\r
+               if (buffer[0]==',') continue;           /* disabled if empty field      */\r
+               active = strtok(buffer, ",");\r
+               if (strcmp(active, "off")==0) continue; /* or 'off'                     */\r
+               \r
+               ip = strtok(NULL, ",");\r
+               host = strtok(NULL, ",");\r
+               domain = strtok(NULL, ",");\r
+\r
+               if (!(ip && host))\r
+                       continue;       // bad line ? skip\r
+\r
+               if (!VALID_IP(ip))\r
+               {\r
+                       fprintf(stderr, "Bad IP: %s\n", ip);\r
+                       continue;       /*  bad ip, skip */\r
+               }\r
+\r
+               if (strspn(host, LETTERS_NUMBERS "-") != strlen(host))\r
+               {\r
+                       fprintf(stderr, "Bad Host: %s\n", host);\r
+                       continue;       /*  bad name, skip */\r
+               }\r
+\r
+               if (domain)\r
+                       fprintf(hosts, "%s\t%s.%s\t%s\n",ip,host,domain,host);\r
+               else\r
+                       fprintf(hosts, "%s\t%s\n",ip,host);\r
+       }\r
+       fclose(fd);\r
+       fd = NULL;\r
+       fclose(hosts);\r
+       hosts = NULL;\r
+\r
+       if ((fdpid = open("/var/run/dnsmasq.pid", O_RDONLY)) == -1)\r
+       {\r
+               fprintf(stderr, "Couldn't open pid file\n");\r
+               exit(1);\r
+       }\r
+       if (read(fdpid, buffer, STRING_SIZE - 1) == -1)\r
+       {\r
+               fprintf(stderr, "Couldn't read from pid file\n");\r
+               close(fdpid);\r
+               exit(1);\r
+       }\r
+       close(fdpid);\r
+       pid = atoi(buffer);\r
+       if (pid <= 1)\r
+       {\r
+               fprintf(stderr, "Bad pid value\n");\r
+               exit(1);\r
+       }\r
+       if (kill(pid, SIGHUP) == -1)\r
+       {\r
+               fprintf(stderr, "Unable to send SIGHUP\n");\r
+               exit(1);\r
+       }\r
+\r
+       return 0;\r
+}\r