setkey.c (121155) | setkey.c (122108) |
---|---|
1/* $FreeBSD: head/sbin/setkey/setkey.c 121155 2003-10-17 11:43:44Z ume $ */ 2/* $KAME: setkey.c,v 1.18 2001/05/08 04:36:39 itojun Exp $ */ | 1/* $FreeBSD: head/sbin/setkey/setkey.c 122108 2003-11-05 09:47:54Z ume $ */ 2/* $KAME: setkey.c,v 1.28 2003/06/27 07:15:45 itojun Exp $ */ |
3 4/* 5 * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: --- 42 unchanged lines hidden (view full) --- 53 54#include "libpfkey.h" 55 56void usage __P((void)); 57int main __P((int, char **)); 58int get_supported __P((void)); 59void sendkeyshort __P((u_int)); 60void promisc __P((void)); | 3 4/* 5 * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: --- 42 unchanged lines hidden (view full) --- 53 54#include "libpfkey.h" 55 56void usage __P((void)); 57int main __P((int, char **)); 58int get_supported __P((void)); 59void sendkeyshort __P((u_int)); 60void promisc __P((void)); |
61int sendkeymsg __P((void)); | 61int sendkeymsg __P((char *, size_t)); |
62int postproc __P((struct sadb_msg *, int)); 63const char *numstr __P((int)); 64void shortdump_hdr __P((void)); 65void shortdump __P((struct sadb_msg *)); 66static void printdate __P((void)); 67static int32_t gmt2local __P((time_t)); 68 69#define MODE_SCRIPT 1 70#define MODE_CMDDUMP 2 71#define MODE_CMDFLUSH 3 72#define MODE_PROMISC 4 73 74int so; 75 76int f_forever = 0; 77int f_all = 0; | 62int postproc __P((struct sadb_msg *, int)); 63const char *numstr __P((int)); 64void shortdump_hdr __P((void)); 65void shortdump __P((struct sadb_msg *)); 66static void printdate __P((void)); 67static int32_t gmt2local __P((time_t)); 68 69#define MODE_SCRIPT 1 70#define MODE_CMDDUMP 2 71#define MODE_CMDFLUSH 3 72#define MODE_PROMISC 4 73 74int so; 75 76int f_forever = 0; 77int f_all = 0; |
78int f_debug = 0; | |
79int f_verbose = 0; 80int f_mode = 0; 81int f_cmddump = 0; 82int f_policy = 0; 83int f_hexdump = 0; 84int f_tflag = 0; | 78int f_verbose = 0; 79int f_mode = 0; 80int f_cmddump = 0; 81int f_policy = 0; 82int f_hexdump = 0; 83int f_tflag = 0; |
85char *pname; 86 87u_char m_buf[BUFSIZ]; 88u_int m_len; 89 | |
90static time_t thiszone; 91 92extern int lineno; 93 94extern int parse __P((FILE **)); 95 96void 97usage() 98{ | 84static time_t thiszone; 85 86extern int lineno; 87 88extern int parse __P((FILE **)); 89 90void 91usage() 92{ |
99 printf("usage:\t%s [-dv] -c\n", pname); 100 printf("\t%s [-dv] -f (file)\n", pname); 101 printf("\t%s [-Padlv] -D\n", pname); 102 printf("\t%s [-Pdv] -F\n", pname); 103 printf("\t%s [-h] -x\n", pname); 104 pfkey_close(so); | 93 94 printf("usage: setkey [-v] -c\n"); 95 printf(" setkey [-v] -f filename\n"); 96 printf(" setkey [-Palv] -D\n"); 97 printf(" setkey [-Pv] -F\n"); 98 printf(" setkey [-h] -x\n"); |
105 exit(1); 106} 107 108int 109main(ac, av) 110 int ac; 111 char **av; 112{ 113 FILE *fp = stdin; 114 int c; 115 | 99 exit(1); 100} 101 102int 103main(ac, av) 104 int ac; 105 char **av; 106{ 107 FILE *fp = stdin; 108 int c; 109 |
116 pname = *av; 117 | |
118 if (ac == 1) { 119 usage(); 120 /* NOTREACHED */ 121 } 122 123 thiszone = gmt2local(0); 124 125 while ((c = getopt(ac, av, "acdf:hlvxDFP")) != -1) { --- 26 unchanged lines hidden (view full) --- 152 break; 153 case 'x': 154 f_mode = MODE_PROMISC; 155 f_tflag++; 156 break; 157 case 'P': 158 f_policy = 1; 159 break; | 110 if (ac == 1) { 111 usage(); 112 /* NOTREACHED */ 113 } 114 115 thiszone = gmt2local(0); 116 117 while ((c = getopt(ac, av, "acdf:hlvxDFP")) != -1) { --- 26 unchanged lines hidden (view full) --- 144 break; 145 case 'x': 146 f_mode = MODE_PROMISC; 147 f_tflag++; 148 break; 149 case 'P': 150 f_policy = 1; 151 break; |
160 case 'd': 161 f_debug = 1; 162 break; | |
163 case 'v': 164 f_verbose = 1; 165 break; 166 default: 167 usage(); 168 /*NOTREACHED*/ 169 } 170 } 171 | 152 case 'v': 153 f_verbose = 1; 154 break; 155 default: 156 usage(); 157 /*NOTREACHED*/ 158 } 159 } 160 |
161 so = pfkey_open(); 162 if (so < 0) { 163 perror("pfkey_open"); 164 exit(1); 165 } 166 |
|
172 switch (f_mode) { 173 case MODE_CMDDUMP: 174 sendkeyshort(f_policy ? SADB_X_SPDDUMP: SADB_DUMP); 175 break; 176 case MODE_CMDFLUSH: 177 sendkeyshort(f_policy ? SADB_X_SPDFLUSH: SADB_FLUSH); | 167 switch (f_mode) { 168 case MODE_CMDDUMP: 169 sendkeyshort(f_policy ? SADB_X_SPDDUMP: SADB_DUMP); 170 break; 171 case MODE_CMDFLUSH: 172 sendkeyshort(f_policy ? SADB_X_SPDFLUSH: SADB_FLUSH); |
178 pfkey_close(so); | |
179 break; 180 case MODE_SCRIPT: 181 if (get_supported() < 0) { 182 errx(-1, "%s", ipsec_strerror()); 183 /*NOTREACHED*/ 184 } 185 if (parse(&fp)) 186 exit (1); --- 7 unchanged lines hidden (view full) --- 194 } 195 196 exit(0); 197} 198 199int 200get_supported() 201{ | 173 break; 174 case MODE_SCRIPT: 175 if (get_supported() < 0) { 176 errx(-1, "%s", ipsec_strerror()); 177 /*NOTREACHED*/ 178 } 179 if (parse(&fp)) 180 exit (1); --- 7 unchanged lines hidden (view full) --- 188 } 189 190 exit(0); 191} 192 193int 194get_supported() 195{ |
202 int so; | |
203 | 196 |
204 if ((so = pfkey_open()) < 0) { 205 perror("pfkey_open"); 206 return -1; 207 } 208 209 /* debug mode ? */ 210 if (f_debug) 211 return 0; 212 | |
213 if (pfkey_send_register(so, SADB_SATYPE_UNSPEC) < 0) 214 return -1; 215 216 if (pfkey_recv_register(so) < 0) 217 return -1; 218 219 return 0; 220} 221 222void 223sendkeyshort(type) 224 u_int type; 225{ | 197 if (pfkey_send_register(so, SADB_SATYPE_UNSPEC) < 0) 198 return -1; 199 200 if (pfkey_recv_register(so) < 0) 201 return -1; 202 203 return 0; 204} 205 206void 207sendkeyshort(type) 208 u_int type; 209{ |
226 struct sadb_msg *m_msg = (struct sadb_msg *)m_buf; | 210 struct sadb_msg msg; |
227 | 211 |
228 m_len = sizeof(struct sadb_msg); | 212 msg.sadb_msg_version = PF_KEY_V2; 213 msg.sadb_msg_type = type; 214 msg.sadb_msg_errno = 0; 215 msg.sadb_msg_satype = SADB_SATYPE_UNSPEC; 216 msg.sadb_msg_len = PFKEY_UNIT64(sizeof(msg)); 217 msg.sadb_msg_reserved = 0; 218 msg.sadb_msg_seq = 0; 219 msg.sadb_msg_pid = getpid(); |
229 | 220 |
230 m_msg->sadb_msg_version = PF_KEY_V2; 231 m_msg->sadb_msg_type = type; 232 m_msg->sadb_msg_errno = 0; 233 m_msg->sadb_msg_satype = SADB_SATYPE_UNSPEC; 234 m_msg->sadb_msg_len = PFKEY_UNIT64(m_len); 235 m_msg->sadb_msg_reserved = 0; 236 m_msg->sadb_msg_seq = 0; 237 m_msg->sadb_msg_pid = getpid(); | 221 sendkeymsg((char *)&msg, sizeof(msg)); |
238 | 222 |
239 sendkeymsg(); 240 | |
241 return; 242} 243 244void 245promisc() 246{ | 223 return; 224} 225 226void 227promisc() 228{ |
247 struct sadb_msg *m_msg = (struct sadb_msg *)m_buf; | 229 struct sadb_msg msg; |
248 u_char rbuf[1024 * 32]; /* XXX: Enough ? Should I do MSG_PEEK ? */ | 230 u_char rbuf[1024 * 32]; /* XXX: Enough ? Should I do MSG_PEEK ? */ |
249 int so, l; | 231 ssize_t l; |
250 | 232 |
251 m_len = sizeof(struct sadb_msg); | 233 msg.sadb_msg_version = PF_KEY_V2; 234 msg.sadb_msg_type = SADB_X_PROMISC; 235 msg.sadb_msg_errno = 0; 236 msg.sadb_msg_satype = 1; 237 msg.sadb_msg_len = PFKEY_UNIT64(sizeof(msg)); 238 msg.sadb_msg_reserved = 0; 239 msg.sadb_msg_seq = 0; 240 msg.sadb_msg_pid = getpid(); |
252 | 241 |
253 m_msg->sadb_msg_version = PF_KEY_V2; 254 m_msg->sadb_msg_type = SADB_X_PROMISC; 255 m_msg->sadb_msg_errno = 0; 256 m_msg->sadb_msg_satype = 1; 257 m_msg->sadb_msg_len = PFKEY_UNIT64(m_len); 258 m_msg->sadb_msg_reserved = 0; 259 m_msg->sadb_msg_seq = 0; 260 m_msg->sadb_msg_pid = getpid(); 261 262 if ((so = socket(PF_KEY, SOCK_RAW, PF_KEY_V2)) < 0) { 263 err(1, "socket(PF_KEY)"); 264 /*NOTREACHED*/ 265 } 266 267 if ((l = send(so, m_buf, m_len, 0)) < 0) { | 242 if ((l = send(so, &msg, sizeof(msg), 0)) < 0) { |
268 err(1, "send"); 269 /*NOTREACHED*/ 270 } 271 272 while (1) { 273 struct sadb_msg *base; 274 275 if ((l = recv(so, rbuf, sizeof(*base), MSG_PEEK)) < 0) { --- 20 unchanged lines hidden (view full) --- 296 if (i % 16 == 15) 297 printf("\n"); 298 } 299 if (l % 16) 300 printf("\n"); 301 } 302 /* adjust base pointer for promisc mode */ 303 if (base->sadb_msg_type == SADB_X_PROMISC) { | 243 err(1, "send"); 244 /*NOTREACHED*/ 245 } 246 247 while (1) { 248 struct sadb_msg *base; 249 250 if ((l = recv(so, rbuf, sizeof(*base), MSG_PEEK)) < 0) { --- 20 unchanged lines hidden (view full) --- 271 if (i % 16 == 15) 272 printf("\n"); 273 } 274 if (l % 16) 275 printf("\n"); 276 } 277 /* adjust base pointer for promisc mode */ 278 if (base->sadb_msg_type == SADB_X_PROMISC) { |
304 if (sizeof(*base) < l) | 279 if ((ssize_t)sizeof(*base) < l) |
305 base++; 306 else 307 base = NULL; 308 } 309 if (base) { 310 kdebug_sadb(base); 311 printf("\n"); 312 fflush(stdout); 313 } 314 } 315} 316 317int | 280 base++; 281 else 282 base = NULL; 283 } 284 if (base) { 285 kdebug_sadb(base); 286 printf("\n"); 287 fflush(stdout); 288 } 289 } 290} 291 292int |
318sendkeymsg() | 293sendkeymsg(buf, len) 294 char *buf; 295 size_t len; |
319{ | 296{ |
320 int so; 321 | |
322 u_char rbuf[1024 * 32]; /* XXX: Enough ? Should I do MSG_PEEK ? */ | 297 u_char rbuf[1024 * 32]; /* XXX: Enough ? Should I do MSG_PEEK ? */ |
323 int l; | 298 ssize_t l; |
324 struct sadb_msg *msg; 325 | 299 struct sadb_msg *msg; 300 |
326 if ((so = pfkey_open()) < 0) { 327 perror("pfkey_open"); 328 return -1; 329 } 330 | |
331 { 332 struct timeval tv; 333 tv.tv_sec = 1; 334 tv.tv_usec = 0; 335 if (setsockopt(so, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) { 336 perror("setsockopt"); 337 goto end; 338 } 339 } 340 341 if (f_forever) 342 shortdump_hdr(); 343again: 344 if (f_verbose) { | 301 { 302 struct timeval tv; 303 tv.tv_sec = 1; 304 tv.tv_usec = 0; 305 if (setsockopt(so, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) { 306 perror("setsockopt"); 307 goto end; 308 } 309 } 310 311 if (f_forever) 312 shortdump_hdr(); 313again: 314 if (f_verbose) { |
345 kdebug_sadb((struct sadb_msg *)m_buf); | 315 kdebug_sadb((struct sadb_msg *)buf); |
346 printf("\n"); 347 } | 316 printf("\n"); 317 } |
318 if (f_hexdump) { 319 int i; 320 for (i = 0; i < len; i++) { 321 if (i % 16 == 0) 322 printf("%08x: ", i); 323 printf("%02x ", buf[i] & 0xff); 324 if (i % 16 == 15) 325 printf("\n"); 326 } 327 if (len % 16) 328 printf("\n"); 329 } |
|
348 | 330 |
349 if ((l = send(so, m_buf, m_len, 0)) < 0) { | 331 if ((l = send(so, buf, len, 0)) < 0) { |
350 perror("send"); 351 goto end; 352 } 353 354 msg = (struct sadb_msg *)rbuf; 355 do { 356 if ((l = recv(so, rbuf, sizeof(rbuf), 0)) < 0) { 357 perror("recv"); --- 15 unchanged lines hidden (view full) --- 373 374 if (f_forever) { 375 fflush(stdout); 376 sleep(1); 377 goto again; 378 } 379 380end: | 332 perror("send"); 333 goto end; 334 } 335 336 msg = (struct sadb_msg *)rbuf; 337 do { 338 if ((l = recv(so, rbuf, sizeof(rbuf), 0)) < 0) { 339 perror("recv"); --- 15 unchanged lines hidden (view full) --- 355 356 if (f_forever) { 357 fflush(stdout); 358 sleep(1); 359 goto again; 360 } 361 362end: |
381 pfkey_close(so); | |
382 return(0); 383} 384 385int 386postproc(msg, len) 387 struct sadb_msg *msg; 388 int len; 389{ --- 262 unchanged lines hidden --- | 363 return(0); 364} 365 366int 367postproc(msg, len) 368 struct sadb_msg *msg; 369 int len; 370{ --- 262 unchanged lines hidden --- |