1 /*
2 * dnet.c
3 *
4 * Copyright (c) 2001 Dug Song <dugsong@monkey.org>
5 *
6 * $Id$
7 */
8
9 #include "config.h"
10
11 #include <sys/types.h>
12
13 #include <err.h>
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <string.h>
17 #include <unistd.h>
18
19 #include "dnet.h"
20 #include "mod.h"
21
22 /*
23 * XXX - new modules should be registered here
24 */
25 extern struct mod mod_addr;
26 extern struct mod mod_hex;
27 extern struct mod mod_rand;
28 extern struct mod mod_eth;
29 extern struct mod mod_arp;
30 extern struct mod mod_ip;
31 extern struct mod mod_icmp;
32 extern struct mod mod_tcp;
33 extern struct mod mod_udp;
34 extern struct mod mod_send;
35 extern struct mod mod_fw;
36 extern struct mod mod_intf;
37 extern struct mod mod_route;
38
39 static struct mod *modules[] = {
40 &mod_addr, &mod_hex, &mod_rand, &mod_eth, &mod_arp, &mod_ip, &mod_icmp,
41 &mod_tcp, &mod_udp, &mod_send, &mod_fw, &mod_intf, &mod_route, NULL
42 };
43
44 static void
print_modules(int type,char * string)45 print_modules(int type, char *string)
46 {
47 struct mod **m;
48 int i;
49
50 fprintf(stderr, "%s commands:\n", string);
51 for (i = 1, m = modules; *m != NULL; m++) {
52 if ((m[0]->type & type) != 0) {
53 fprintf(stderr, "%-10s", m[0]->name);
54 if ((i++ % 8) == 0)
55 fprintf(stderr, "\n");
56 }
57 }
58 fprintf(stderr, "\n\n");
59 }
60
61 static void
print_usage(void)62 print_usage(void)
63 {
64 fprintf(stderr, "Usage: dnet <command> <args> ...\n\n");
65
66 print_modules(MOD_TYPE_DATA, "Payload generation");
67 print_modules(MOD_TYPE_ENCAP, "Packet encapsulation");
68 print_modules(MOD_TYPE_XMIT, "Packet transmission");
69 print_modules(MOD_TYPE_KERN, "Kernel interface");
70 }
71
72 static int
do_command(int argc,char * argv[])73 do_command(int argc, char *argv[])
74 {
75 struct mod **m;
76
77 for (m = modules; *m != NULL; m++) {
78 if (strcmp(argv[0], m[0]->name) == 0)
79 return (m[0]->main(argc, argv));
80 }
81 return (-1);
82 }
83
84 int
main(int argc,char * argv[])85 main(int argc, char *argv[])
86 {
87 if (argc < 2) {
88 print_usage();
89 exit(1);
90 }
91 if (do_command(argc - 1, argv + 1) < 0) {
92 print_usage();
93 exit(1);
94 }
95 exit(0);
96 }
97