]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - src/misc-progs/rebuildhosts.c
Einige Dateien hatten perm:755...
[people/pmueller/ipfire-2.x.git] / src / misc-progs / rebuildhosts.c
CommitLineData
cd1a2927
MT
1/* IPCop helper program - rebuildhosts\r
2 *\r
3 * This program is distributed under the terms of the GNU General Public\r
4 * Licence. See the file COPYING for details.\r
5 *\r
6 * (c) Alan Hourihane, 2003\r
7 * \r
8 *\r
9 * $Id: rebuildhosts.c,v 1.3.2.6 2005/07/11 10:56:47 franck78 Exp $\r
10 *\r
11 */\r
12\r
13#include "libsmooth.h"\r
14#include <stdio.h>\r
15#include <stdlib.h>\r
16#include <unistd.h>\r
17#include <fcntl.h>\r
18#include <string.h>\r
19#include <sys/types.h>\r
20#include <sys/stat.h>\r
21#include <signal.h>\r
22#include "setuid.h"\r
23\r
24FILE *fd = NULL;\r
25FILE *hosts = NULL;\r
26struct keyvalue *kv = NULL;\r
27\r
28void exithandler(void)\r
29{\r
30 if (kv)\r
31 freekeyvalues(kv);\r
32 if (fd)\r
33 fclose(fd);\r
34 if (hosts)\r
35 fclose(hosts);\r
36}\r
37\r
38int main(int argc, char *argv[])\r
39{\r
40 int fdpid; \r
41 char hostname[STRING_SIZE];\r
42 char domainname[STRING_SIZE] = "";\r
43 char buffer[STRING_SIZE];\r
44 char address[STRING_SIZE];\r
45 char *active, *ip, *host, *domain;\r
46 int pid;\r
47\r
48 if (!(initsetuid()))\r
49 exit(1);\r
50\r
51 atexit(exithandler);\r
52\r
53 memset(buffer, 0, STRING_SIZE);\r
54\r
55 kv = initkeyvalues();\r
56 if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))\r
57 {\r
58 fprintf(stderr, "Couldn't read ethernet settings\n");\r
59 exit(1);\r
60 }\r
61 findkey(kv, "GREEN_ADDRESS", address);\r
62 freekeyvalues(kv);\r
63\r
64 kv = initkeyvalues();\r
65 if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings")))\r
66 {\r
67 fprintf(stderr, "Couldn't read main settings\n");\r
68 exit(1);\r
69 }\r
70 strcpy(hostname, SNAME ); \r
71 findkey(kv, "HOSTNAME", hostname);\r
72 findkey(kv, "DOMAINNAME", domainname);\r
73 freekeyvalues(kv);\r
74 kv = NULL;\r
75\r
76 if (!(fd = fopen(CONFIG_ROOT "/main/hosts", "r")))\r
77 {\r
78 fprintf(stderr, "Couldn't open main hosts file\n");\r
79 exit(1);\r
80 }\r
81 if (!(hosts = fopen("/etc/hosts", "w")))\r
82 {\r
83 fprintf(stderr, "Couldn't open /etc/hosts file\n");\r
84 fclose(fd);\r
85 fd = NULL;\r
86 exit(1);\r
87 }\r
88 fprintf(hosts, "127.0.0.1\tlocalhost\n");\r
89 if (strlen(domainname))\r
90 fprintf(hosts, "%s\t%s.%s\t%s\n",address,hostname,domainname,hostname);\r
91 else\r
92 fprintf(hosts, "%s\t%s\n",address,hostname);\r
93 while (fgets(buffer, STRING_SIZE, fd))\r
94 {\r
95 buffer[strlen(buffer) - 1] = 0;\r
96 if (buffer[0]==',') continue; /* disabled if empty field */\r
97 active = strtok(buffer, ",");\r
98 if (strcmp(active, "off")==0) continue; /* or 'off' */\r
99 \r
100 ip = strtok(NULL, ",");\r
101 host = strtok(NULL, ",");\r
102 domain = strtok(NULL, ",");\r
103\r
104 if (!(ip && host))\r
105 continue; // bad line ? skip\r
106\r
107 if (!VALID_IP(ip))\r
108 {\r
109 fprintf(stderr, "Bad IP: %s\n", ip);\r
110 continue; /* bad ip, skip */\r
111 }\r
112\r
113 if (strspn(host, LETTERS_NUMBERS "-") != strlen(host))\r
114 {\r
115 fprintf(stderr, "Bad Host: %s\n", host);\r
116 continue; /* bad name, skip */\r
117 }\r
118\r
119 if (domain)\r
120 fprintf(hosts, "%s\t%s.%s\t%s\n",ip,host,domain,host);\r
121 else\r
122 fprintf(hosts, "%s\t%s\n",ip,host);\r
123 }\r
124 fclose(fd);\r
125 fd = NULL;\r
126 fclose(hosts);\r
127 hosts = NULL;\r
128\r
129 if ((fdpid = open("/var/run/dnsmasq.pid", O_RDONLY)) == -1)\r
130 {\r
131 fprintf(stderr, "Couldn't open pid file\n");\r
132 exit(1);\r
133 }\r
134 if (read(fdpid, buffer, STRING_SIZE - 1) == -1)\r
135 {\r
136 fprintf(stderr, "Couldn't read from pid file\n");\r
137 close(fdpid);\r
138 exit(1);\r
139 }\r
140 close(fdpid);\r
141 pid = atoi(buffer);\r
142 if (pid <= 1)\r
143 {\r
144 fprintf(stderr, "Bad pid value\n");\r
145 exit(1);\r
146 }\r
147 if (kill(pid, SIGHUP) == -1)\r
148 {\r
149 fprintf(stderr, "Unable to send SIGHUP\n");\r
150 exit(1);\r
151 }\r
152\r
153 return 0;\r
154}\r