4
* Copyright (c) 2001 Dug Song <dugsong@monkey.org>
6
* $Id: fw.c,v 1.1 2002/02/08 07:26:58 dugsong Exp $
11
#include <sys/types.h>
25
fprintf(stderr, "Usage: dnet fw show\n"
26
" dnet fw add|delete allow|block in|out "
27
"<device>|any <proto> <src>[:<sport>[-<max>]] "
28
"<dst>[:<dport>[-<max>]] [<type>[/<code>]]\n");
33
print_rule(const struct fw_rule *fr, void *arg)
36
char proto[16], sport[16], dport[16], typecode[16];
38
if ((pr = getprotobynumber(fr->fw_proto)) == NULL)
39
snprintf(proto, sizeof(proto), "%d", fr->fw_proto);
41
strlcpy(proto, pr->p_name, sizeof(proto));
43
sport[0] = dport[0] = typecode[0] = '\0';
45
switch (fr->fw_proto) {
47
if (fr->fw_sport[1] && fr->fw_dport[1])
48
snprintf(typecode, sizeof(typecode), " %d/%d",
49
fr->fw_sport[0], fr->fw_dport[0]);
50
else if (fr->fw_sport[1])
51
snprintf(typecode, sizeof(typecode), " %d",
56
if (fr->fw_sport[0] == fr->fw_sport[1]) {
58
snprintf(sport, sizeof(sport), ":%d",
61
snprintf(sport, sizeof(sport), ":%d-%d",
62
fr->fw_sport[0], fr->fw_sport[1]);
64
if (fr->fw_dport[0] == fr->fw_dport[1]) {
66
snprintf(dport, sizeof(dport), ":%d",
69
snprintf(dport, sizeof(dport), ":%d-%d",
70
fr->fw_dport[0], fr->fw_dport[1]);
73
printf("%s %s %s %s %s%s %s%s%s\n",
74
fr->fw_op == FW_OP_ALLOW ? "allow" : "block",
75
fr->fw_dir == FW_DIR_IN ? "in" : "out",
76
*fr->fw_device ? fr->fw_device : "any", proto,
77
addr_ntoa(&fr->fw_src), sport, addr_ntoa(&fr->fw_dst),
84
arg_to_fr(int argc, char *argv[], struct fw_rule *fr)
93
memset(fr, 0, sizeof(*fr));
95
fr->fw_op = strcmp(argv[0], "allow") ? FW_OP_BLOCK : FW_OP_ALLOW;
97
fr->fw_dir = strcmp(argv[1], "in") ? FW_DIR_OUT : FW_DIR_IN;
99
if (strcmp(argv[2], "any") != 0)
100
strlcpy(fr->fw_device, argv[2], sizeof(fr->fw_device));
102
if ((pr = getprotobyname(argv[3])) != NULL)
103
fr->fw_proto = pr->p_proto;
105
fr->fw_proto = atoi(argv[3]);
107
p = strtok(argv[4], ":");
109
if (addr_aton(p, &fr->fw_src) < 0)
112
if ((p = strtok(NULL, ":")) != NULL) {
113
fr->fw_sport[0] = (uint16_t)strtol(p, &p, 10);
115
fr->fw_sport[1] = (uint16_t)strtol(p + 1, NULL, 10);
117
fr->fw_sport[1] = fr->fw_sport[0];
119
p = strtok(argv[5], ":");
121
if (addr_aton(p, &fr->fw_dst) < 0)
124
if ((p = strtok(NULL, ":")) != NULL) {
125
fr->fw_dport[0] = (uint16_t)strtol(p, &p, 10);
127
fr->fw_dport[1] = (uint16_t)strtol(p + 1, NULL, 10);
129
fr->fw_dport[1] = fr->fw_dport[0];
132
if (fr->fw_proto != IP_PROTO_ICMP &&
133
fr->fw_proto != IP_PROTO_IGMP) {
137
fr->fw_sport[0] = (uint16_t)strtol(argv[6], &p, 10);
138
fr->fw_sport[1] = 0xff;
140
fr->fw_dport[0] = (uint16_t)strtol(p + 1, NULL, 10);
141
fr->fw_dport[1] = 0xff;
148
fw_main(int argc, char *argv[])
153
if (argc < 2 || *(argv[1]) == '-')
156
if ((fw = fw_open()) == NULL)
159
if (argc == 2 && strcmp(argv[1], "show") == 0) {
160
if (fw_loop(fw, print_rule, NULL) < 0)
162
} else if (argc > 2 && strcmp(argv[1], "add") == 0) {
163
if (arg_to_fr(argc - 2, argv + 2, &fr) < 0)
166
print_rule(&fr, NULL);
167
if (fw_add(fw, &fr) < 0)
169
} else if (argc > 2 && strcmp(argv[1], "delete") == 0) {
170
if (arg_to_fr(argc - 2, argv + 2, &fr) < 0)
173
print_rule(&fr, NULL);
174
if (fw_delete(fw, &fr) < 0)
184
struct mod mod_fw = {