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