--- /dev/null
+/* 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