1 /* $NetBSD: misc.c,v 1.7 1999/08/31 13:58:58 itojun Exp $ */ 2 3 /* 4 * Misc routines that are used by tcpd and by tcpdchk. 5 * 6 * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands. 7 */ 8 9 #include <sys/cdefs.h> 10 #ifndef lint 11 #if 0 12 static char sccsic[] = "@(#) misc.c 1.2 96/02/11 17:01:29"; 13 #else 14 __RCSID("$NetBSD: misc.c,v 1.7 1999/08/31 13:58:58 itojun Exp $"); 15 #endif 16 #endif 17 18 #include <sys/types.h> 19 #include <sys/param.h> 20 #include <netinet/in.h> 21 #include <arpa/inet.h> 22 #include <stdio.h> 23 #include <string.h> 24 25 #include "tcpd.h" 26 27 #ifndef INADDR_NONE 28 #define INADDR_NONE (-1) /* XXX should be 0xffffffff */ 29 #endif 30 31 /* xgets - fgets() with backslash-newline stripping */ 32 33 char *xgets(ptr, len, fp) 34 char *ptr; 35 int len; 36 FILE *fp; 37 { 38 int got; 39 char *start = ptr; 40 41 while (fgets(ptr, len, fp)) { 42 got = strlen(ptr); 43 if (got >= 1 && ptr[got - 1] == '\n') { 44 tcpd_context.line++; 45 if (got >= 2 && ptr[got - 2] == '\\') { 46 got -= 2; 47 } else { 48 return (start); 49 } 50 } 51 ptr += got; 52 len -= got; 53 ptr[0] = 0; 54 } 55 return (ptr > start ? start : 0); 56 } 57 58 /* split_at - break string at delimiter or return NULL */ 59 60 char *split_at(string, delimiter) 61 char *string; 62 int delimiter; 63 { 64 #if 0 65 char *cp; 66 67 if ((cp = strchr(string, delimiter)) != 0) 68 *cp++ = 0; 69 return (cp); 70 #else 71 char *cp; 72 int bracket; 73 74 bracket = 0; 75 for (cp = string; cp && *cp; cp++) { 76 switch (*cp) { 77 case '[': 78 bracket++; 79 break; 80 case ']': 81 bracket--; 82 break; 83 default: 84 if (bracket == 0 && *cp == delimiter) { 85 *cp++ = 0; 86 return cp; 87 } 88 break; 89 } 90 } 91 return NULL; 92 #endif 93 } 94 95 /* dot_quad_addr - convert dotted quad to internal form */ 96 97 int dot_quad_addr(str, addr) 98 char *str; 99 unsigned long *addr; 100 { 101 struct in_addr a; 102 103 if (!inet_aton(str, &a)) 104 return -1; 105 if (addr) 106 *addr = a.s_addr; 107 return 0; 108 } 109