1 1.1 mrg /* 2 1.1 mrg * Misc routines that are used by tcpd and by tcpdchk. 3 1.1 mrg * 4 1.1 mrg * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands. 5 1.1 mrg */ 6 1.1 mrg 7 1.1 mrg #ifndef lint 8 1.1 mrg static char sccsic[] = "@(#) misc.c 1.2 96/02/11 17:01:29"; 9 1.1 mrg #endif 10 1.1 mrg 11 1.1 mrg #include <sys/types.h> 12 1.1 mrg #include <sys/param.h> 13 1.1 mrg #include <netinet/in.h> 14 1.1 mrg #include <arpa/inet.h> 15 1.1 mrg #include <stdio.h> 16 1.1 mrg #include <string.h> 17 1.1 mrg 18 1.1 mrg #include "tcpd.h" 19 1.1 mrg 20 1.1 mrg extern char *fgets(); 21 1.1 mrg 22 1.1 mrg #ifndef INADDR_NONE 23 1.1 mrg #define INADDR_NONE (-1) /* XXX should be 0xffffffff */ 24 1.1 mrg #endif 25 1.1 mrg 26 1.1 mrg /* xgets - fgets() with backslash-newline stripping */ 27 1.1 mrg 28 1.1 mrg char *xgets(ptr, len, fp) 29 1.1 mrg char *ptr; 30 1.1 mrg int len; 31 1.1 mrg FILE *fp; 32 1.1 mrg { 33 1.1 mrg int got; 34 1.1 mrg char *start = ptr; 35 1.1 mrg 36 1.1 mrg while (fgets(ptr, len, fp)) { 37 1.1 mrg got = strlen(ptr); 38 1.1 mrg if (got >= 1 && ptr[got - 1] == '\n') { 39 1.1 mrg tcpd_context.line++; 40 1.1 mrg if (got >= 2 && ptr[got - 2] == '\\') { 41 1.1 mrg got -= 2; 42 1.1 mrg } else { 43 1.1 mrg return (start); 44 1.1 mrg } 45 1.1 mrg } 46 1.1 mrg ptr += got; 47 1.1 mrg len -= got; 48 1.1 mrg ptr[0] = 0; 49 1.1 mrg } 50 1.1 mrg return (ptr > start ? start : 0); 51 1.1 mrg } 52 1.1 mrg 53 1.1 mrg /* split_at - break string at delimiter or return NULL */ 54 1.1 mrg 55 1.1 mrg char *split_at(string, delimiter) 56 1.1 mrg char *string; 57 1.1 mrg int delimiter; 58 1.1 mrg { 59 1.1 mrg char *cp; 60 1.1 mrg 61 1.1 mrg if ((cp = strchr(string, delimiter)) != 0) 62 1.1 mrg *cp++ = 0; 63 1.1 mrg return (cp); 64 1.1 mrg } 65 1.1 mrg 66 1.1 mrg /* dot_quad_addr - convert dotted quad to internal form */ 67 1.1 mrg 68 1.1 mrg unsigned long dot_quad_addr(str) 69 1.1 mrg char *str; 70 1.1 mrg { 71 1.1 mrg int in_run = 0; 72 1.1 mrg int runs = 0; 73 1.1 mrg char *cp = str; 74 1.1 mrg 75 1.1 mrg /* Count the number of runs of non-dot characters. */ 76 1.1 mrg 77 1.1 mrg while (*cp) { 78 1.1 mrg if (*cp == '.') { 79 1.1 mrg in_run = 0; 80 1.1 mrg } else if (in_run == 0) { 81 1.1 mrg in_run = 1; 82 1.1 mrg runs++; 83 1.1 mrg } 84 1.1 mrg cp++; 85 1.1 mrg } 86 1.1 mrg return (runs == 4 ? inet_addr(str) : INADDR_NONE); 87 1.1 mrg } 88