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
xgets(ptr,len,fp)28 char *xgets(ptr, len, fp)
29 char *ptr;
30 int len;
31 FILE *fp;
32 {
33 int got;
34 char *start = ptr;
35
36 while (fgets(ptr, len, fp)) {
37 got = strlen(ptr);
38 if (got >= 1 && ptr[got - 1] == '\n') {
39 tcpd_context.line++;
40 if (got >= 2 && ptr[got - 2] == '\\') {
41 got -= 2;
42 } else {
43 return (start);
44 }
45 }
46 ptr += got;
47 len -= got;
48 ptr[0] = 0;
49 }
50 return (ptr > start ? start : 0);
51 }
52
53 /* split_at - break string at delimiter or return NULL */
54
split_at(string,delimiter)55 char *split_at(string, delimiter)
56 char *string;
57 int delimiter;
58 {
59 char *cp;
60
61 #ifdef INET6
62 int bracket = 0;
63
64 for (cp = string; cp && *cp; cp++) {
65 switch (*cp) {
66 case '[':
67 bracket++;
68 break;
69 case ']':
70 bracket--;
71 break;
72 default:
73 if (bracket == 0 && *cp == delimiter) {
74 *cp++ = 0;
75 return cp;
76 }
77 break;
78 }
79 }
80 return (NULL);
81 #else
82 if ((cp = strchr(string, delimiter)) != 0)
83 *cp++ = 0;
84 return (cp);
85 #endif
86 }
87
88 /* dot_quad_addr - convert dotted quad to internal form */
89
dot_quad_addr(str)90 unsigned long dot_quad_addr(str)
91 char *str;
92 {
93 int in_run = 0;
94 int runs = 0;
95 char *cp = str;
96
97 /* Count the number of runs of non-dot characters. */
98
99 while (*cp) {
100 if (*cp == '.') {
101 in_run = 0;
102 } else if (in_run == 0) {
103 in_run = 1;
104 runs++;
105 }
106 cp++;
107 }
108 return (runs == 4 ? inet_addr(str) : INADDR_NONE);
109 }
110