1/*	$OpenBSD: netdb.c,v 1.2 2011/05/01 04:27:07 guenther Exp $	*/
2
3/*
4 * Public domain, 2004, Otto Moerbeek <otto@drijf.net>
5 */
6
7#include <err.h>
8#include <netdb.h>
9#include <stdarg.h>
10#include <string.h>
11
12int ret = 0;
13
14void
15checkp(int n, struct protoent *p, int proto, const char *name, ...)
16{
17	va_list va;
18	char *a;
19	int i;
20
21	if (p == NULL) {
22		warnx("%d proto struct is NULL", n);
23		ret = 1;
24		return;
25	}
26	if (p->p_proto != proto) {
27		warnx("%d proto num mismatch %d %d", n, p->p_proto, proto);
28		ret = 1;
29	}
30	if (strcmp(p->p_name, name) != 0) {
31		warnx("%d proto name mismatch %s %s", n, p->p_name, name);
32		ret = 1;
33	}
34	va_start(va, name);
35	a = va_arg(va, char *);
36	i = 0;
37	while (a != NULL) {
38		if (strcmp(p->p_aliases[i], a) != 0) {
39			warnx("%d proto alias mismatch %s %s", n,
40			    p->p_aliases[i], a);
41			ret = 1;
42		}
43		i++;
44		a = va_arg(va, char *);
45	}
46	if (p->p_aliases[i] != NULL) {
47			warnx("%d proto alias list does not end with NULL", n);
48			ret = 1;
49	}
50	va_end(va);
51}
52
53
54void
55checks(int n, struct servent *s, int port, const char *proto,
56    const char *name, ...)
57{
58	va_list va;
59	char *a;
60	int i;
61
62	if (s == NULL) {
63		warnx("%d serv struct is NULL", n);
64		ret = 1;
65		return;
66	}
67	if (s->s_port != ntohs(port)) {
68		warnx("%d port num mismatch %d %d", n, s->s_port, port);
69		ret = 1;
70	}
71	if (strcmp(s->s_name, name) != 0) {
72		warnx("%d serv name mismatch %s %s", n, s->s_name, name);
73		ret = 1;
74	}
75	if (strcmp(s->s_proto, proto) != 0) {
76		warnx("%d serv proto mismatch %s %s", n, s->s_proto, proto);
77		ret = 1;
78	}
79	va_start(va, name);
80	a = va_arg(va, char *);
81	i = 0;
82	while (a != NULL) {
83		if (strcmp(s->s_aliases[i], a) != 0) {
84			warnx("%d serv alias mismatch %s %s", n,
85			    s->s_aliases[i], a);
86			ret = 1;
87		}
88		i++;
89		a = va_arg(va, char *);
90	}
91	if (s->s_aliases[i] != NULL) {
92			warnx("%d serv alias list does not end with NULL", n);
93			ret = 1;
94	}
95	va_end(va);
96}
97
98int
99main()
100{
101	struct protoent *p;
102	struct protoent protoent;
103	struct protoent_data protoent_data;
104	struct servent *s;
105	struct servent servent;
106	struct servent_data servent_data;
107	int r;
108
109	p = getprotobynumber(35);
110	checkp(1, p, 35, "idpr", "IDPR", (char *)NULL);
111
112	p = getprotobyname("igp");
113	checkp(2, p, 9, "igp", "IGP", (char *) NULL);
114
115	p = getprotobyname("RDP");
116	checkp(3, p, 27, "rdp", "RDP", (char *) NULL);
117
118	p = getprotobyname("vrrp");
119	checkp(4, p, 112, "carp", "CARP", "vrrp", (char *) NULL);
120
121	p = getprotobyname("nonexistent");
122	if (p != NULL)
123		err(1, "nonexistent proto found");
124
125	memset(&protoent_data, 0, sizeof(protoent_data));
126	r = getprotobynumber_r(35, &protoent, &protoent_data);
127	if (r != 0)
128		err(1, "proto not found");
129
130	checkp(5, &protoent, 35, "idpr", "IDPR", (char *)NULL);
131
132	r = getprotobyname_r("vrrp", &protoent, &protoent_data);
133	if (r != 0)
134		err(1, "proto not found");
135	checkp(6, &protoent, 112, "carp", "CARP", "vrrp", (char *) NULL);
136
137	r = getprotobyname_r("nonexistent", &protoent, &protoent_data);
138	if (r != -1)
139		err(1, "nonexistent proto found");
140
141	r = getprotobyname_r("", &protoent, &protoent_data);
142	if (r != -1)
143		err(1, "nonexistent proto found");
144
145
146	r = getprotobynumber_r(256, &protoent, &protoent_data);
147	if (r != -1)
148		err(1, "nonexistent proto found");
149
150	s = getservbyname("zip", NULL);
151	checks(7, s, 6, "ddp", "zip", (char *)NULL);
152
153	s = getservbyname("nicname", "tcp");
154	checks(8, s, 43, "tcp", "whois", "nicname", (char *)NULL);
155
156	s = getservbyport(htons(42), "tcp");
157	checks(9, s, 42, "tcp", "nameserver", "name", (char *)NULL);
158
159	memset(&servent_data, 0, sizeof(servent_data));
160	r = getservbyname_r("zip", "ddp", &servent, &servent_data);
161	if (r != 0)
162		err(1, "servent not found");
163	checks(10, &servent, 6, "ddp", "zip", (char *)NULL);
164
165	r = getservbyport_r(htons(520), NULL, &servent, &servent_data);
166	if (r != 0)
167		err(1, "servent not found");
168	checks(11, &servent, 520, "udp", "route", "router", "routed", (char *)NULL);
169
170	r = getservbyname_r("nonexistent", NULL, &servent, &servent_data);
171	if (r != -1)
172		err(1, "nonexiststent servent found");
173
174	r = getservbyport_r(htons(50000), NULL, &servent, &servent_data);
175	if (r != -1)
176		err(1, "nonexistent servent found");
177
178	r = getservbyport_r(htons(520), "tcp", &servent, &servent_data);
179	if (r != -1)
180		err(1, "nonexistent servent found");
181
182	return ret;
183}
184