b4c435256956e2f53d5abe0812451eb0be8ca109
2 * Copyright (C) 2007 Martin Willi
3 * Hochschule fuer Technik Rapperswil
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 #include <readline/readline.h>
23 #include <readline/history.h>
28 * global set of UMLs guests
33 * show usage information (program arguments)
38 printf(" --dir|-d <path> set working dir to <path>\n");
39 printf(" --help|-h show this help\n");
45 static char* get_line(char *format
, ...)
51 va_start(args
, format
);
52 vasprintf(&prompt
, format
, args
);
57 line
= readline(prompt
);
80 static guest_t
* get_guest(char *name
)
83 guest_t
*guest
= NULL
;
85 iterator
= dumm
->create_guest_iterator(dumm
);
86 while (iterator
->iterate(iterator
, (void**)&guest
))
88 if (streq(guest
->get_name(guest
), name
))
94 iterator
->destroy(iterator
);
99 * get a bridge by name
101 static bridge_t
* get_bridge(char *name
)
103 iterator_t
*iterator
;
104 bridge_t
*bridge
= NULL
;
106 iterator
= dumm
->create_bridge_iterator(dumm
);
107 while (iterator
->iterate(iterator
, (void**)&bridge
))
109 if (streq(bridge
->get_name(bridge
), name
))
115 iterator
->destroy(iterator
);
120 * get an interface by guest name
122 static iface_t
* get_iface(char *name
, char *ifname
)
124 iterator_t
*guests
, *ifaces
;
128 guests
= dumm
->create_guest_iterator(dumm
);
129 while (guests
->iterate(guests
, (void**)&guest
))
131 if (streq(guest
->get_name(guest
), name
))
134 ifaces
= guest
->create_iface_iterator(guest
);
135 while (ifaces
->iterate(ifaces
, (void**)&iface
))
137 if (streq(iface
->get_guestif(iface
), ifname
))
143 ifaces
->destroy(ifaces
);
150 guests
->destroy(guests
);
154 static void guest_addif_menu(guest_t
*guest
)
158 name
= get_line("interface name: ");
160 if (!guest
->create_iface(guest
, name
))
162 printf("creating interface failed\n");
167 static void guest_delif_menu(guest_t
*guest
)
171 iterator_t
*iterator
;
174 name
= get_line("interface name: ");
176 iterator
= guest
->create_iface_iterator(guest
);
177 while (iterator
->iterate(iterator
, (void**)&iface
))
179 if (streq(iface
->get_guestif(iface
), name
))
181 iterator
->remove(iterator
);
182 iface
->destroy(iface
);
187 iterator
->destroy(iterator
);
191 printf("interface '%s' not found\n");
196 static void guest_console(guest_t
*guest
)
200 for (con
= 1; con
<= 6; con
++)
202 char *pts
= guest
->get_console(guest
, con
);
205 printf("%d: %s\n", con
, pts
);
211 static void guest_menu(guest_t
*guest
)
215 char *line
= get_line("guest/%s# ", guest
->get_name(guest
));
217 if (streq(line
, "back"))
222 else if (streq(line
, "start"))
224 if (guest
->start(guest
))
226 printf("guest '%s' is running\n", guest
->get_name(guest
));
230 printf("failed to start guest '%s'\n", guest
->get_name(guest
));
233 else if (streq(line
, "stop"))
235 printf("stopping guest '%s'...\n", guest
->get_name(guest
));
237 printf("guest '%s' is down\n", guest
->get_name(guest
));
239 else if (streq(line
, "addif"))
241 guest_addif_menu(guest
);
243 else if (streq(line
, "delif"))
245 guest_delif_menu(guest
);
247 else if (streq(line
, "console"))
249 guest_console(guest
);
253 printf("back|start|stop|addif|delif|console\n");
259 static void guest_create_menu()
261 char *name
, *kernel
, *master
, *mem
;
264 name
= get_line("guest name: ");
265 kernel
= get_line("kernel image: ");
266 master
= get_line("master filesystem: ");
267 mem
= get_line("amount of memory in MB: ");
269 guest
= dumm
->create_guest(dumm
, name
, kernel
, master
, atoi(mem
));
272 printf("guest '%s' created\n", guest
->get_name(guest
));
277 printf("failed to create guest '%s'\n", name
);
285 static void guest_list_menu()
289 iterator_t
*iterator
;
291 char *line
= get_line("guest# ");
293 if (streq(line
, "back"))
298 else if (streq(line
, "list"))
300 iterator
= dumm
->create_guest_iterator(dumm
);
301 while (iterator
->iterate(iterator
, (void**)&guest
))
303 printf("%s\n", guest
->get_name(guest
));
305 iterator
->destroy(iterator
);
307 else if (streq(line
, "create"))
313 guest
= get_guest(line
);
320 printf("back|list|create|<guest>\n");
327 static void bridge_addif_menu(bridge_t
*bridge
)
332 name
= get_line("guest name: ");
333 ifname
= get_line("interface name: ");
335 iface
= get_iface(name
, ifname
);
338 printf("guest '%s' has no interface named '%s'\n", name
, ifname
);
340 else if (!bridge
->connect_iface(bridge
, iface
))
342 printf("failed to add interface '%s' to bridge '%s'\n", ifname
,
343 bridge
->get_name(bridge
));
349 static void bridge_delif_menu(bridge_t
*bridge
)
354 name
= get_line("guest name: ");
355 ifname
= get_line("interface name: ");
357 iface
= get_iface(name
, ifname
);
360 printf("guest '%s' has no interface named '%s'\n", name
, ifname
);
362 else if (!bridge
->disconnect_iface(bridge
, iface
))
364 printf("failed to remove interface '%s' from bridge '%s'\n", ifname
,
365 bridge
->get_name(bridge
));
371 static void bridge_menu(bridge_t
*bridge
)
375 char *line
= get_line("bridge/%s# ", bridge
->get_name(bridge
));
377 if (streq(line
, "back"))
382 else if (streq(line
, "list"))
384 iterator_t
*iterator
;
387 iterator
= bridge
->create_iface_iterator(bridge
);
388 while (iterator
->iterate(iterator
, (void**)&iface
))
390 printf("%s (%s)\n", iface
->get_guestif(iface
), iface
->get_hostif(iface
));
392 iterator
->destroy(iterator
);
394 else if (streq(line
, "addif"))
396 bridge_addif_menu(bridge
);
398 else if (streq(line
, "delif"))
400 bridge_delif_menu(bridge
);
404 printf("back|list|addif|delif\n");
410 static void bridge_create_menu()
415 name
= get_line("bridge name: ");
417 bridge
= dumm
->create_bridge(dumm
, name
);
420 printf("bridge '%s' created\n", bridge
->get_name(bridge
));
425 printf("failed to create bridge '%s'\n", name
);
430 static void bridge_list_menu()
434 iterator_t
*iterator
;
436 char *line
= get_line("bridge# ");
438 if (streq(line
, "back"))
443 else if (streq(line
, "list"))
445 iterator
= dumm
->create_bridge_iterator(dumm
);
446 while (iterator
->iterate(iterator
, (void**)&bridge
))
448 printf("%s\n", bridge
->get_name(bridge
));
450 iterator
->destroy(iterator
);
452 else if (streq(line
, "create"))
454 bridge_create_menu();
458 bridge
= get_bridge(line
);
465 printf("back|list|create|<bridge>\n");
472 static void scenario_menu()
476 name
= get_line("scenario name (or 'none'): ");
478 dumm
->load_scenario(dumm
, streq(name
, "none") ? NULL
: name
);
486 void signal_action(int sig
, siginfo_t
*info
, void *ucontext
)
494 * main routine, parses args and reads from console
496 int main(int argc
, char *argv
[])
498 struct sigaction action
;
503 struct option options
[] = {
509 switch (getopt_long(argc
, argv
, "d:h", options
, NULL
))
526 memset(&action
, 0, sizeof(action
));
527 action
.sa_sigaction
= signal_action
;
528 action
.sa_flags
= SA_SIGINFO
;
529 if (sigaction(SIGINT
, &action
, NULL
) != 0 ||
530 sigaction(SIGQUIT
, &action
, NULL
) != 0 ||
531 sigaction(SIGTERM
, &action
, NULL
) != 0)
533 printf("signal handler setup failed: %m.\n");
537 dumm
= dumm_create(dir
);
540 char *line
= get_line("# ");
542 if (streq(line
, "quit"))
547 else if (streq(line
, "guest"))
551 else if (streq(line
, "bridge"))
555 else if (streq(line
, "scenario"))
561 printf("quit|guest|bridge|scenario\n");