]> git.proxmox.com Git - mirror_frr.git/blob - tests/helpers/c/main.c
doc: Add `show ipv6 rpf X:X::X:X` command to docs
[mirror_frr.git] / tests / helpers / c / main.c
1 /*
2 * This file is part of Quagga.
3 *
4 * Quagga is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2, or (at your option) any
7 * later version.
8 *
9 * Quagga is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program; see the file COPYING; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 #include <zebra.h>
20
21 #include <lib/version.h>
22 #include "getopt.h"
23 #include "thread.h"
24 #include "vty.h"
25 #include "command.h"
26 #include "memory.h"
27 #include "lib_vty.h"
28
29 extern void test_init(void);
30
31 struct thread_master *master;
32
33 struct option longopts[] = {{"daemon", no_argument, NULL, 'd'},
34 {"config_file", required_argument, NULL, 'f'},
35 {"help", no_argument, NULL, 'h'},
36 {"vty_addr", required_argument, NULL, 'A'},
37 {"vty_port", required_argument, NULL, 'P'},
38 {"version", no_argument, NULL, 'v'},
39 {0}};
40
41 DEFUN (daemon_exit,
42 daemon_exit_cmd,
43 "daemon-exit",
44 "Make the daemon exit\n")
45 {
46 exit(0);
47 }
48
49 static int timer_count;
50 static void test_timer(struct thread *thread)
51 {
52 int *count = THREAD_ARG(thread);
53
54 printf("run %d of timer\n", (*count)++);
55 thread_add_timer(master, test_timer, count, 5, NULL);
56 }
57
58 static void test_timer_init(void)
59 {
60 thread_add_timer(master, test_timer, &timer_count, 10, NULL);
61 }
62
63 static void test_vty_init(void)
64 {
65 install_element(VIEW_NODE, &daemon_exit_cmd);
66 }
67
68 /* Help information display. */
69 static void usage(char *progname, int status)
70 {
71 if (status != 0)
72 fprintf(stderr, "Try `%s --help' for more information.\n",
73 progname);
74 else {
75 printf("Usage : %s [OPTION...]\n\
76 Daemon which does 'slow' things.\n\n\
77 -d, --daemon Runs in daemon mode\n\
78 -f, --config_file Set configuration file name\n\
79 -A, --vty_addr Set vty's bind address\n\
80 -P, --vty_port Set vty's port number\n\
81 -v, --version Print program version\n\
82 -h, --help Display this help and exit\n\
83 \n\
84 Report bugs to %s\n",
85 progname, FRR_BUG_ADDRESS);
86 }
87 exit(status);
88 }
89
90
91 /* main routine. */
92 int main(int argc, char **argv)
93 {
94 char *p;
95 char *vty_addr = NULL;
96 int vty_port = 4000;
97 int daemon_mode = 0;
98 char *progname;
99 struct thread thread;
100 char *config_file = NULL;
101
102 /* Set umask before anything for security */
103 umask(0027);
104
105 /* get program name */
106 progname = ((p = strrchr(argv[0], '/')) ? ++p : argv[0]);
107
108 /* master init. */
109 master = thread_master_create(NULL);
110
111 while (1) {
112 int opt;
113
114 opt = getopt_long(argc, argv, "dhf:A:P:v", longopts, 0);
115
116 if (opt == EOF)
117 break;
118
119 switch (opt) {
120 case 0:
121 break;
122 case 'f':
123 config_file = optarg;
124 break;
125 case 'd':
126 daemon_mode = 1;
127 break;
128 case 'A':
129 vty_addr = optarg;
130 break;
131 case 'P':
132 /* Deal with atoi() returning 0 on failure */
133 if (strcmp(optarg, "0") == 0) {
134 vty_port = 0;
135 break;
136 }
137 vty_port = atoi(optarg);
138 vty_port = (vty_port ? vty_port : 4000);
139 break;
140 case 'v':
141 print_version(progname);
142 exit(0);
143 break;
144 case 'h':
145 usage(progname, 0);
146 break;
147 default:
148 usage(progname, 1);
149 break;
150 }
151 }
152
153 /* Library inits. */
154 cmd_init(1);
155 vty_init(master, false);
156 lib_cmd_init();
157 nb_init(master, NULL, 0, false);
158
159 /* OSPF vty inits. */
160 test_vty_init();
161
162 /* Change to the daemon program. */
163 if (daemon_mode && daemon(0, 0) < 0) {
164 fprintf(stderr, "daemon failed: %s", strerror(errno));
165 exit(1);
166 }
167
168 /* Create VTY socket */
169 vty_serv_sock(vty_addr, vty_port, "/tmp/.heavy.sock");
170
171 /* Configuration file read*/
172 if (!config_file)
173 usage(progname, 1);
174 vty_read_config(NULL, config_file, NULL);
175
176 test_timer_init();
177
178 test_init();
179
180 /* Fetch next active thread. */
181 while (thread_fetch(master, &thread))
182 thread_call(&thread);
183
184 /* Not reached. */
185 exit(0);
186 }