xref: /netbsd/lib/libwrap/misc.c (revision c4a72b64)
1 /*	$NetBSD: misc.c,v 1.9 2002/12/02 22:08:44 jdolecek 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.9 2002/12/02 22:08:44 jdolecek 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 /* xgets - fgets() with backslash-newline stripping */
28 
29 char   *xgets(ptr, len, fp)
30 char   *ptr;
31 int     len;
32 FILE   *fp;
33 {
34     int     got;
35     char   *start = ptr;
36 
37     while (len > 1 && fgets(ptr, len, fp)) {
38 	got = strlen(ptr);
39 	if (got >= 1 && ptr[got - 1] == '\n') {
40 	    tcpd_context.line++;
41 	    if (got >= 2 && ptr[got - 2] == '\\') {
42 		got -= 2;
43 	    } else {
44 		return (start);
45 	    }
46 	}
47 	ptr += got;
48 	len -= got;
49 	ptr[0] = 0;
50     }
51     return (ptr > start ? start : 0);
52 }
53 
54 /* split_at - break string at delimiter or return NULL */
55 
56 char   *split_at(string, delimiter)
57 char   *string;
58 int     delimiter;
59 {
60     char *cp;
61     int bracket;
62 
63     bracket = 0;
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 }
82 
83 /* dot_quad_addr - convert dotted quad to internal form */
84 
85 int dot_quad_addr(str, addr)
86 char   *str;
87 unsigned long *addr;
88 {
89     struct in_addr a;
90 
91     if (!inet_aton(str, &a))
92 	return -1;
93     if (addr)
94 	*addr = a.s_addr;
95     return 0;
96 }
97