1 /* $NetBSD: misc.c,v 1.9 2002/12/02 22:08:44 jdolecek 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.9 2002/12/02 22:08:44 jdolecek 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 /* xgets - fgets() with backslash-newline stripping */ 28 29 char *xgets(ptr, len, fp) 30 char *ptr; 31 int len; 32 FILE *fp; 33 { 34 int got; 35 char *start = ptr; 36 37 while (len > 1 && fgets(ptr, len, fp)) { 38 got = strlen(ptr); 39 if (got >= 1 && ptr[got - 1] == '\n') { 40 tcpd_context.line++; 41 if (got >= 2 && ptr[got - 2] == '\\') { 42 got -= 2; 43 } else { 44 return (start); 45 } 46 } 47 ptr += got; 48 len -= got; 49 ptr[0] = 0; 50 } 51 return (ptr > start ? start : 0); 52 } 53 54 /* split_at - break string at delimiter or return NULL */ 55 56 char *split_at(string, delimiter) 57 char *string; 58 int delimiter; 59 { 60 char *cp; 61 int bracket; 62 63 bracket = 0; 64 for (cp = string; cp && *cp; cp++) { 65 switch (*cp) { 66 case '[': 67 bracket++; 68 break; 69 case ']': 70 bracket--; 71 break; 72 default: 73 if (bracket == 0 && *cp == delimiter) { 74 *cp++ = 0; 75 return cp; 76 } 77 break; 78 } 79 } 80 return NULL; 81 } 82 83 /* dot_quad_addr - convert dotted quad to internal form */ 84 85 int dot_quad_addr(str, addr) 86 char *str; 87 unsigned long *addr; 88 { 89 struct in_addr a; 90 91 if (!inet_aton(str, &a)) 92 return -1; 93 if (addr) 94 *addr = a.s_addr; 95 return 0; 96 } 97