1*e1a2f47fSmatt /* $NetBSD: misc.c,v 1.10 2012/03/21 10:10:37 matt Exp $ */
2d6ddaab4Schristos
3541be36cSmrg /*
4541be36cSmrg * Misc routines that are used by tcpd and by tcpdchk.
5541be36cSmrg *
6541be36cSmrg * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
7541be36cSmrg */
8541be36cSmrg
9d6ddaab4Schristos #include <sys/cdefs.h>
10541be36cSmrg #ifndef lint
11d6ddaab4Schristos #if 0
12541be36cSmrg static char sccsic[] = "@(#) misc.c 1.2 96/02/11 17:01:29";
13d6ddaab4Schristos #else
14*e1a2f47fSmatt __RCSID("$NetBSD: misc.c,v 1.10 2012/03/21 10:10:37 matt Exp $");
15d6ddaab4Schristos #endif
16541be36cSmrg #endif
17541be36cSmrg
18541be36cSmrg #include <sys/types.h>
19541be36cSmrg #include <sys/param.h>
20541be36cSmrg #include <netinet/in.h>
21541be36cSmrg #include <arpa/inet.h>
22541be36cSmrg #include <stdio.h>
23541be36cSmrg #include <string.h>
24541be36cSmrg
25541be36cSmrg #include "tcpd.h"
26541be36cSmrg
27541be36cSmrg /* xgets - fgets() with backslash-newline stripping */
28541be36cSmrg
29*e1a2f47fSmatt char *
xgets(char * ptr,int len,FILE * fp)30*e1a2f47fSmatt xgets(char *ptr, int len, FILE *fp)
31541be36cSmrg {
32541be36cSmrg int got;
33541be36cSmrg char *start = ptr;
34541be36cSmrg
3566f1feabSjdolecek while (len > 1 && fgets(ptr, len, fp)) {
36541be36cSmrg got = strlen(ptr);
37541be36cSmrg if (got >= 1 && ptr[got - 1] == '\n') {
38541be36cSmrg tcpd_context.line++;
39541be36cSmrg if (got >= 2 && ptr[got - 2] == '\\') {
40541be36cSmrg got -= 2;
41541be36cSmrg } else {
42541be36cSmrg return (start);
43541be36cSmrg }
44541be36cSmrg }
45541be36cSmrg ptr += got;
46541be36cSmrg len -= got;
47541be36cSmrg ptr[0] = 0;
48541be36cSmrg }
49541be36cSmrg return (ptr > start ? start : 0);
50541be36cSmrg }
51541be36cSmrg
52541be36cSmrg /* split_at - break string at delimiter or return NULL */
53541be36cSmrg
54*e1a2f47fSmatt char *
split_at(char * string,int delimiter)55*e1a2f47fSmatt split_at(char *string, int delimiter)
56541be36cSmrg {
571e8c736aSitojun char *cp;
581e8c736aSitojun int bracket;
591e8c736aSitojun
601e8c736aSitojun bracket = 0;
611e8c736aSitojun for (cp = string; cp && *cp; cp++) {
621e8c736aSitojun switch (*cp) {
631e8c736aSitojun case '[':
641e8c736aSitojun bracket++;
651e8c736aSitojun break;
661e8c736aSitojun case ']':
671e8c736aSitojun bracket--;
681e8c736aSitojun break;
691e8c736aSitojun default:
701e8c736aSitojun if (bracket == 0 && *cp == delimiter) {
711e8c736aSitojun *cp++ = 0;
721e8c736aSitojun return cp;
731e8c736aSitojun }
741e8c736aSitojun break;
751e8c736aSitojun }
761e8c736aSitojun }
771e8c736aSitojun return NULL;
78541be36cSmrg }
79541be36cSmrg
80541be36cSmrg /* dot_quad_addr - convert dotted quad to internal form */
81541be36cSmrg
82*e1a2f47fSmatt int
dot_quad_addr(char * str,unsigned long * addr)83*e1a2f47fSmatt dot_quad_addr(char *str, unsigned long *addr)
84541be36cSmrg {
858c92070aSchristos struct in_addr a;
86541be36cSmrg
878c92070aSchristos if (!inet_aton(str, &a))
888c92070aSchristos return -1;
8963c771b7Schristos if (addr)
908c92070aSchristos *addr = a.s_addr;
918c92070aSchristos return 0;
92541be36cSmrg }
93