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