Revision | 50 (tree) |
---|---|
Zeit | 2021-12-10 07:01:24 |
Autor | mateuszviste |
a serverlist submission file may contain multiple entries now so it is easier to peform batch insertion of lists of gopher servers
@@ -2,6 +2,7 @@ | ||
2 | 2 | * gopherjoker, part of the Observable Gopherspace Universe Project |
3 | 3 | * Copyright (C) 2019-2021 Mateusz Viste |
4 | 4 | * |
5 | + * 2021-12-09: a /tmp/ogup/... submission file may contain many entries | |
5 | 6 | * 2021-12-07: write last good IP address to database for every host |
6 | 7 | * 2021-12-06: scheduler for probing servers + internal cache of recent checks |
7 | 8 | * 2021-12-04: added --saveperiod and --waitperiod cmdline parameters |
@@ -163,59 +164,66 @@ | ||
163 | 164 | |
164 | 165 | |
165 | 166 | /* open fname and read a server name from it, write it to *s. returns |
166 | - * port number on success, neg value on error */ | |
167 | -static int get_server_from_file(char *s, size_t ssz, const char *fname) { | |
167 | + * port number on success, neg value on error | |
168 | + * TODO support for IPv6 addresses like [2a60:1234::1]:71 | |
169 | + */ | |
170 | +static void process_serverlist_file(struct gopherlist **glist, const char *fname) { | |
168 | 171 | FILE *f; |
169 | - int port = 70; | |
172 | + int port; | |
170 | 173 | int i; |
174 | + char s[128]; | |
171 | 175 | |
172 | 176 | /* open file */ |
173 | 177 | f = fopen(fname, "rb"); |
174 | 178 | if (f == NULL) { |
175 | 179 | printf("ERROR: failed to open file %s (%s)\r\n", fname, strerror(errno)); |
176 | - return(-1); | |
180 | + return; | |
177 | 181 | } |
178 | 182 | |
179 | - /* read server string */ | |
180 | - if (fgets(s, (int)ssz, f) == NULL) { | |
181 | - printf("read failure from %s: %s\n", fname, strerror(errno)); | |
182 | - fclose(f); | |
183 | - return(-1); | |
184 | - } | |
185 | - fclose(f); | |
183 | + for (;;) { | |
184 | + /* read server string */ | |
185 | + if (fgets(s, sizeof(s), f) == NULL) break; | |
186 | 186 | |
187 | - /* parse (look for a ':') */ | |
188 | - for (i = 0; s[i] != 0; s++) { | |
189 | - if ((s[i] == '\r') || (s[i] == '\n')) { | |
190 | - s[i] = 0; | |
191 | - break; | |
187 | + /* parse (look for a port after ':' and trim \r and \n) */ | |
188 | + port = 70; | |
189 | + for (i = 0; s[i] != 0; i++) { | |
190 | + if ((s[i] == '\r') || (s[i] == '\n')) { | |
191 | + s[i] = 0; | |
192 | + break; | |
193 | + } | |
194 | + if (s[i] == ':') { | |
195 | + s[i++] = 0; | |
196 | + port = atoi(s + i); | |
197 | + break; | |
198 | + } | |
192 | 199 | } |
193 | - if (s[i] == ':') { | |
194 | - s[i++] = 0; | |
195 | - port = atoi(s + i); | |
196 | - break; | |
200 | + | |
201 | + if ((port < 1) || (port > 65535)) { | |
202 | + printf("invalid port: host=%s port=%d\n", s, port); | |
203 | + continue; | |
197 | 204 | } |
198 | - } | |
199 | 205 | |
200 | - if ((port < 1) || (port > 65535)) { | |
201 | - printf("invalid port: host=%s port=%d\n", s, port); | |
202 | - return(-1); | |
206 | + /* add server to database */ | |
207 | + if (glist_addnewhostport(glist, s, (unsigned short)port, 1) != NULL) { | |
208 | + printf("added host: %s:%d\r\n", s, port); | |
209 | + } else { | |
210 | + puts("glist_addnewhostport() call failed"); | |
211 | + } | |
212 | + | |
203 | 213 | } |
204 | 214 | |
205 | - return(port); | |
215 | + fclose(f); | |
206 | 216 | } |
207 | 217 | |
208 | 218 | |
209 | 219 | /* insert any newly-subnmitted servers to memory database (and remove the new host file) */ |
210 | -static struct gopherlist *loadextrahosts(struct gopherlist *glist, const char *dir) { | |
220 | +static void loadextrahosts(struct gopherlist **glist, const char *dir) { | |
211 | 221 | char fname[128]; |
212 | - char buff[128]; | |
213 | 222 | DIR *d; |
214 | 223 | struct dirent *dptr; |
215 | - int port; | |
216 | 224 | |
217 | 225 | d = opendir(dir); |
218 | - if (d == NULL) return(glist); | |
226 | + if (d == NULL) return; | |
219 | 227 | |
220 | 228 | while ((dptr = readdir(d)) != NULL) { |
221 | 229 | if (dptr->d_type != DT_REG) continue; /* skip anything that's not a regular file (includes symlinks) */ |
@@ -222,21 +230,12 @@ | ||
222 | 230 | strcpy(fname, dir); |
223 | 231 | strcat(fname, "/"); |
224 | 232 | strcat(fname, dptr->d_name); |
225 | - printf("loading new host file: %s\n", buff); | |
226 | - port = get_server_from_file(buff, sizeof(buff), fname); | |
227 | - if (port > 0) { | |
228 | - if (glist_addnewhostport(&glist, buff, (unsigned short)port, 1) != NULL) { | |
229 | - printf("added host: %s:%d\r\n", buff, port); | |
230 | - } else { | |
231 | - puts("glist_addnewhostport() call failed"); | |
232 | - } | |
233 | - } | |
233 | + printf("loading new host file: %s\n", fname); | |
234 | + process_serverlist_file(glist, fname); | |
234 | 235 | /* remove file and go to next one */ |
235 | 236 | unlink(fname); |
236 | 237 | } |
237 | 238 | closedir(d); |
238 | - | |
239 | - return(glist); | |
240 | 239 | } |
241 | 240 | |
242 | 241 |
@@ -474,14 +473,17 @@ | ||
474 | 473 | |
475 | 474 | for (;;) { |
476 | 475 | |
477 | - printf("\n\n\n--- [%s] ---\n", epoch2human(time(NULL))); | |
476 | + /* make sure that my pending logs are output to stdout (avoids lags when redirecting to file) */ | |
477 | + fflush(stdout); | |
478 | 478 | |
479 | 479 | /* do not browse too fast */ |
480 | 480 | while (time(NULL) < nextaction) sleep(1); |
481 | 481 | nextaction = time(NULL) + WAITPERIOD; |
482 | 482 | |
483 | + printf("\n\n\n--- [%s] ---\n", epoch2human(time(NULL))); | |
484 | + | |
483 | 485 | /* if extra manual hosts required to be added, do it now */ |
484 | - glist = loadextrahosts(glist, NEWHOSTSDIR); | |
486 | + loadextrahosts(&glist, NEWHOSTSDIR); | |
485 | 487 | |
486 | 488 | /* save the db once every hour */ |
487 | 489 | if (time(NULL) > nextdbsave) { |