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