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