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