1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 #pragma ident "%Z%%M% %I% %E% SMI"
23
24 /*
25 * Copyright (c) 1996-2001 by Sun Microsystems, Inc.
26 * All rights reserved.
27 */
28
29 #include <stdio.h>
30 #include <sys/types.h>
31 #include <unistd.h>
32 #include <syslog.h>
33 #include <netinet/in.h>
34 #include <netinet/dhcp.h>
35 #include <dhcp_gen.h>
36 #include <dhcpd.h>
37 #include <per_network.h>
38 #include <dhcp_msgs.h>
39
40 int debug = 1;
41 int verbose = 1;
42
43 /*
44 * smalloc() -- safe malloc()
45 *
46 * Always returns a valid pointer (if it returns at all). The allocated
47 * memory is initialized to all zeros. If malloc() returns an error, a
48 * message is printed using the syslog() function and the program aborts
49 * with a status of 1.
50 */
51 char *
smalloc(uint_t nbytes)52 smalloc(uint_t nbytes)
53 {
54 char *retvalue;
55
56 if ((retvalue = (char *)malloc(nbytes)) == (char *)NULL) {
57 dhcp_error(LOG_ERR, DHCP_MSGS(DCMSG_NO_MEMORY));
58 (void) exit(1);
59 }
60 memset(retvalue, 0, nbytes);
61 return (retvalue);
62 }
63
64 int
main(void)65 main(void)
66 {
67 struct in_addr five_net = {109, 108, 5, 0};
68 struct in_addr five_mask = {109, 108, 5, 255};
69 struct in_addr serverid = {109, 108, 5, 138};
70 struct in_addr scratch;
71 PER_NET_DB pndb;
72 PN_REC pn;
73 uchar_t buf[MAX_CID_LEN] = {0x1, 0x0, 0x0, 0xc0, 0xee, 0xe, 0x4c };
74 char tbuf[MAX_CID_LEN];
75 int recs;
76 unsigned int len;
77 register int i, err = 0;
78
79
80 /*
81 * Test 0. Open the per network database, and locate a *single*
82 * record by cid.
83 */
84 printf("Test 0: START ******************************************\n");
85 memset(&pndb, 0, sizeof (pndb));
86
87 if (open_per_net(&pndb, &five_net, &five_mask) != 0) {
88 printf("didn't work.\n");
89 return (1);
90 }
91
92 /*
93 * Should only be one.
94 */
95 memset(&pn, 0, sizeof (pn));
96 recs = lookup_per_net(&pndb, PN_CID, (void *)buf, 7, &serverid, &pn);
97 if (recs < 0)
98 printf("lookup didn't work.\n");
99 else {
100 if (recs > 0) {
101 len = MAX_CID_LEN;
102 octet_to_hexascii(buf, 7, tbuf, &len);
103 printf("Client id: %s\n", tbuf);
104 printf("flags: 0x%x\n", pn.flags);
105 printf("IP address is: %s\n", inet_ntoa(pn.clientip));
106 printf("server IP address is: %s\n",
107 inet_ntoa(pn.serverip));
108
109 len = MAX_CID_LEN;
110 octet_to_hexascii(&pn.lease, 4, tbuf, &len);
111 printf("lease is %s, 0x%x\n", tbuf, pn.lease);
112 printf("macro is %s\n", pn.macro);
113 printf("Number of records: %d\n", recs);
114 }
115 }
116 close_per_net(&pndb);
117
118 printf("Test 0: END ******************************************\n");
119 /* END TEST 0 ********************************************* */
120
121 /*
122 * Test 1. Open the per net database, locate all records with
123 * cid of 0.
124 */
125 printf("Test 1: START ******************************************\n");
126 if (open_per_net(&pndb, &five_net, &five_mask) != 0) {
127 printf("didn't work.\n");
128 return (1);
129 } else {
130 printf("name: %s\n", pndb.name);
131 }
132
133 memset(buf, 0, MAX_CID_LEN);
134 recs = lookup_per_net(&pndb, PN_CID, (void *)buf, 1, &serverid, &pn);
135 if (recs < 0)
136 printf("lookup didn't work.\n");
137 else {
138 printf("datatype: %d\n", pndb.datatype);
139 printf("row: %d\n", pndb.row);
140 if (recs > 0) {
141 len = MAX_CID_LEN;
142 octet_to_hexascii(buf, 7, tbuf, &len);
143 printf("Client id: %s\n", tbuf);
144 printf("flags: 0x%x\n", pn.flags);
145 printf("IP address is: %s\n", inet_ntoa(pn.clientip));
146 printf("server IP address is: %s\n",
147 inet_ntoa(pn.serverip));
148
149 len = MAX_CID_LEN;
150 octet_to_hexascii(&pn.lease, 4, tbuf, &len);
151 printf("lease is %s, 0x%x\n", tbuf, pn.lease);
152 printf("macro is %s\n", pn.macro);
153 printf("Number of records: %d\n", recs);
154 for (i = 0; i < recs; i++) {
155 if (get_per_net(&pndb, PN_CID, &pn) != 0) {
156 printf("didn't work 2: \n");
157 break;
158 }
159 len = MAX_CID_LEN;
160 octet_to_hexascii(buf, 7, tbuf, &len);
161 printf("Client id: %s\n", tbuf);
162 printf("flags: 0x%x\n", pn.flags);
163 printf("IP address is: %s\n",
164 inet_ntoa(pn.clientip));
165 printf("server IP address is: %s\n",
166 inet_ntoa(pn.serverip));
167
168 len = MAX_CID_LEN;
169 octet_to_hexascii(&pn.lease, 4, tbuf, &len);
170 printf("lease is %s, 0x%x\n", tbuf, pn.lease);
171 printf("macro is %s\n", pn.macro);
172 }
173 }
174 }
175
176 close_per_net(&pndb);
177 printf("Test 1: END ******************************************\n");
178 printf("Test 2: START ******************************************\n");
179 /*
180 * Locate client ip 109.108.5.221.
181 */
182 scratch.s_addr = 0x6d6c05dd;
183 if (open_per_net(&pndb, &five_net, &five_mask) != 0) {
184 printf("didn't work.\n");
185 return (1);
186 } else {
187 printf("name: %s\n", pndb.name);
188 }
189
190 recs = lookup_per_net(&pndb, PN_CLIENT_IP, (void *)&scratch, 4,
191 &serverid, &pn);
192 if (recs < 0)
193 printf("lookup didn't work.\n");
194 else {
195 printf("datatype: %d\n", pndb.datatype);
196 printf("row: %d\n", pndb.row);
197 if (recs > 0) {
198 len = MAX_CID_LEN;
199 octet_to_hexascii(buf, 7, tbuf, &len);
200 printf("Client id: %s\n", tbuf);
201 printf("flags: 0x%x\n", pn.flags);
202 printf("IP address is: %s\n", inet_ntoa(pn.clientip));
203 printf("server IP address is: %s\n",
204 inet_ntoa(pn.serverip));
205
206 len = MAX_CID_LEN;
207 octet_to_hexascii(&pn.lease, 4, tbuf, &len);
208 printf("lease is %s, 0x%x\n", tbuf, pn.lease);
209 printf("macro is %s\n", pn.macro);
210 printf("Number of records: %d\n", recs);
211 }
212 }
213
214 printf("Test 2: END ******************************************\n");
215 printf("Test 3: START ******************************************\n");
216 if (recs > 0) {
217 /*
218 * Using the record from test 2, change the cid, flags, and
219 * lease, then write the record.
220 */
221 pn.cid_len = 7;
222 for (i = 0; (uchar_t)i < pn.cid_len; i++)
223 pn.cid[i] = i;
224 pn.flags |= F_AUTOMATIC;
225 pn.lease = htonl(time(NULL));
226
227 if ((err = put_per_net(&pndb, &pn, PN_CLIENT_IP)) != 0) {
228 printf("didn't work. error: %d\n", err);
229 } else
230 printf("it worked.\n");
231 }
232 close_per_net(&pndb);
233 printf("Test 3: END ******************************************\n");
234
235 return (0);
236 }
237