xref: /freebsd/contrib/tcp_wrappers/misc.c (revision 2a58b312)
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
10 static 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 
28 char   *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 
52 char   *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 
85 unsigned 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