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