Changeset View
Changeset View
Standalone View
Standalone View
head/sbin/setkey/setkey.c
Show First 20 Lines • Show All 50 Lines • ▼ Show 20 Lines | |||||
#include <errno.h> | #include <errno.h> | ||||
#include <netdb.h> | #include <netdb.h> | ||||
#include "libpfkey.h" | #include "libpfkey.h" | ||||
void usage(void); | void usage(void); | ||||
int main(int, char **); | int main(int, char **); | ||||
int get_supported(void); | int get_supported(void); | ||||
void sendkeyshort(u_int); | void sendkeyshort(u_int, uint8_t); | ||||
void promisc(void); | void promisc(void); | ||||
int sendkeymsg(char *, size_t); | int sendkeymsg(char *, size_t); | ||||
int postproc(struct sadb_msg *, int); | int postproc(struct sadb_msg *, int); | ||||
const char *numstr(int); | const char *numstr(int); | ||||
void shortdump_hdr(void); | void shortdump_hdr(void); | ||||
void shortdump(struct sadb_msg *); | void shortdump(struct sadb_msg *); | ||||
static void printdate(void); | static void printdate(void); | ||||
static int32_t gmt2local(time_t); | static int32_t gmt2local(time_t); | ||||
#define MODE_SCRIPT 1 | #define MODE_SCRIPT 1 | ||||
#define MODE_CMDDUMP 2 | #define MODE_CMDDUMP 2 | ||||
#define MODE_CMDFLUSH 3 | #define MODE_CMDFLUSH 3 | ||||
#define MODE_PROMISC 4 | #define MODE_PROMISC 4 | ||||
int so; | int so; | ||||
int f_forever = 0; | int f_forever = 0; | ||||
int f_all = 0; | int f_all = 0; | ||||
int f_verbose = 0; | int f_verbose = 0; | ||||
int f_mode = 0; | int f_mode = 0; | ||||
int f_cmddump = 0; | int f_cmddump = 0; | ||||
int f_policy = 0; | int f_policy = 0; | ||||
int f_hexdump = 0; | int f_hexdump = 0; | ||||
int f_tflag = 0; | int f_tflag = 0; | ||||
int f_scope = 0; | |||||
static time_t thiszone; | static time_t thiszone; | ||||
extern int lineno; | extern int lineno; | ||||
extern int parse(FILE **); | extern int parse(FILE **); | ||||
void | void | ||||
usage() | usage() | ||||
{ | { | ||||
printf("usage: setkey [-v] -c\n"); | printf("usage: setkey [-v] -c\n"); | ||||
printf(" setkey [-v] -f filename\n"); | printf(" setkey [-v] -f filename\n"); | ||||
printf(" setkey [-Palv] -D\n"); | printf(" setkey [-Pagltv] -D\n"); | ||||
printf(" setkey [-Pv] -F\n"); | printf(" setkey [-Pv] -F\n"); | ||||
printf(" setkey [-h] -x\n"); | printf(" setkey [-h] -x\n"); | ||||
exit(1); | exit(1); | ||||
} | } | ||||
int | int | ||||
main(ac, av) | main(ac, av) | ||||
int ac; | int ac; | ||||
char **av; | char **av; | ||||
{ | { | ||||
FILE *fp = stdin; | FILE *fp = stdin; | ||||
int c; | int c; | ||||
if (ac == 1) { | if (ac == 1) { | ||||
usage(); | usage(); | ||||
/* NOTREACHED */ | /* NOTREACHED */ | ||||
} | } | ||||
thiszone = gmt2local(0); | thiszone = gmt2local(0); | ||||
while ((c = getopt(ac, av, "acdf:hlvxDFP")) != -1) { | while ((c = getopt(ac, av, "acdf:ghltvxDFP")) != -1) { | ||||
switch (c) { | switch (c) { | ||||
case 'c': | case 'c': | ||||
f_mode = MODE_SCRIPT; | f_mode = MODE_SCRIPT; | ||||
fp = stdin; | fp = stdin; | ||||
break; | break; | ||||
case 'f': | case 'f': | ||||
f_mode = MODE_SCRIPT; | f_mode = MODE_SCRIPT; | ||||
if ((fp = fopen(optarg, "r")) == NULL) { | if ((fp = fopen(optarg, "r")) == NULL) { | ||||
Show All 18 Lines | case 'h': | ||||
break; | break; | ||||
case 'x': | case 'x': | ||||
f_mode = MODE_PROMISC; | f_mode = MODE_PROMISC; | ||||
f_tflag++; | f_tflag++; | ||||
break; | break; | ||||
case 'P': | case 'P': | ||||
f_policy = 1; | f_policy = 1; | ||||
break; | break; | ||||
case 'g': /* global */ | |||||
f_scope |= IPSEC_POLICYSCOPE_GLOBAL; | |||||
break; | |||||
case 't': /* tunnel */ | |||||
f_scope |= IPSEC_POLICYSCOPE_IFNET; | |||||
break; | |||||
case 'v': | case 'v': | ||||
f_verbose = 1; | f_verbose = 1; | ||||
break; | break; | ||||
default: | default: | ||||
usage(); | usage(); | ||||
/*NOTREACHED*/ | /*NOTREACHED*/ | ||||
} | } | ||||
} | } | ||||
so = pfkey_open(); | so = pfkey_open(); | ||||
if (so < 0) { | if (so < 0) { | ||||
perror("pfkey_open"); | perror("pfkey_open"); | ||||
exit(1); | exit(1); | ||||
} | } | ||||
switch (f_mode) { | switch (f_mode) { | ||||
case MODE_CMDDUMP: | case MODE_CMDDUMP: | ||||
sendkeyshort(f_policy ? SADB_X_SPDDUMP: SADB_DUMP); | sendkeyshort(f_policy ? SADB_X_SPDDUMP: SADB_DUMP, | ||||
f_policy ? f_scope: SADB_SATYPE_UNSPEC); | |||||
break; | break; | ||||
case MODE_CMDFLUSH: | case MODE_CMDFLUSH: | ||||
sendkeyshort(f_policy ? SADB_X_SPDFLUSH: SADB_FLUSH); | sendkeyshort(f_policy ? SADB_X_SPDFLUSH: SADB_FLUSH, | ||||
SADB_SATYPE_UNSPEC); | |||||
break; | break; | ||||
case MODE_SCRIPT: | case MODE_SCRIPT: | ||||
if (get_supported() < 0) { | if (get_supported() < 0) { | ||||
errx(-1, "%s", ipsec_strerror()); | errx(-1, "%s", ipsec_strerror()); | ||||
/*NOTREACHED*/ | /*NOTREACHED*/ | ||||
} | } | ||||
if (parse(&fp)) | if (parse(&fp)) | ||||
exit (1); | exit (1); | ||||
Show All 18 Lines | get_supported() | ||||
if (pfkey_recv_register(so) < 0) | if (pfkey_recv_register(so) < 0) | ||||
return -1; | return -1; | ||||
return 0; | return 0; | ||||
} | } | ||||
void | void | ||||
sendkeyshort(type) | sendkeyshort(u_int type, uint8_t satype) | ||||
u_int type; | |||||
{ | { | ||||
struct sadb_msg msg; | struct sadb_msg msg; | ||||
msg.sadb_msg_version = PF_KEY_V2; | msg.sadb_msg_version = PF_KEY_V2; | ||||
msg.sadb_msg_type = type; | msg.sadb_msg_type = type; | ||||
msg.sadb_msg_errno = 0; | msg.sadb_msg_errno = 0; | ||||
msg.sadb_msg_satype = SADB_SATYPE_UNSPEC; | msg.sadb_msg_satype = satype; | ||||
msg.sadb_msg_len = PFKEY_UNIT64(sizeof(msg)); | msg.sadb_msg_len = PFKEY_UNIT64(sizeof(msg)); | ||||
msg.sadb_msg_reserved = 0; | msg.sadb_msg_reserved = 0; | ||||
msg.sadb_msg_seq = 0; | msg.sadb_msg_seq = 0; | ||||
msg.sadb_msg_pid = getpid(); | msg.sadb_msg_pid = getpid(); | ||||
sendkeymsg((char *)&msg, sizeof(msg)); | sendkeymsg((char *)&msg, sizeof(msg)); | ||||
return; | return; | ||||
▲ Show 20 Lines • Show All 409 Lines • Show Last 20 Lines |