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