xref: /netbsd-src/lib/libwrap/misc.c (revision e1a2f47f1264dd9755e9e747d45ba016dff2334f)
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