aboutsummaryrefslogtreecommitdiffstats
path: root/src/ipaccess
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2017-12-25 18:43:40 +0100
committerNeels Hofmeyr <neels@hofmeyr.de>2017-12-25 19:22:37 +0100
commit2a9ac1986334807c507df79d2b70b2e1655cc754 (patch)
treefda248204149e5dd58ef68ec69c7c85e25ec5674 /src/ipaccess
parent148ee361b35cd942327049f7abf37aaad818fb70 (diff)
abisip-find: add getopt option parsing in preparation for a new option
Subsequent patch I4201876431029b303dbd10e46492228379c9782a will add the -l cmdline option. Add getopt in a separate step here to keep the patch lean. Change-Id: Idba1a89753510fe6d409277b20c2db86c1b8f7f8
Diffstat (limited to 'src/ipaccess')
-rw-r--r--src/ipaccess/abisip-find.c62
1 files changed, 55 insertions, 7 deletions
diff --git a/src/ipaccess/abisip-find.c b/src/ipaccess/abisip-find.c
index c459161c0..46205dd20 100644
--- a/src/ipaccess/abisip-find.c
+++ b/src/ipaccess/abisip-find.c
@@ -24,7 +24,7 @@
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
-
+#include <getopt.h>
#include <osmocom/core/select.h>
#include <osmocom/core/timer.h>
@@ -32,6 +32,56 @@
#include <osmocom/gsm/ipa.h>
#include <osmocom/bsc/gsm_data.h>
+static struct {
+ const char *ifname;
+} cmdline_opts = {
+ .ifname = NULL,
+};
+
+static void print_help()
+{
+ printf("\n");
+ printf("Usage: abisip-find [-l] [<interface-name>]\n");
+ printf(" <interface-name> Specify the outgoing network interface,\n"
+ " e.g. 'eth0'\n");
+}
+
+static void handle_options(int argc, char **argv)
+{
+ while (1) {
+ int option_index = 0, c;
+ static struct option long_options[] = {
+ {"help", 0, 0, 'h'},
+ {0, 0, 0, 0}
+ };
+
+ c = getopt_long(argc, argv, "h",
+ long_options, &option_index);
+ if (c == -1)
+ break;
+
+ switch (c) {
+ case 'h':
+ print_help();
+ exit(EXIT_SUCCESS);
+ default:
+ /* catch unknown options *as well as* missing arguments. */
+ fprintf(stderr, "Error in command line options. Exiting. Try --help.\n");
+ exit(EXIT_FAILURE);
+ break;
+ }
+ }
+
+ if (argc - optind > 0)
+ cmdline_opts.ifname = argv[optind++];
+
+ if (argc - optind > 0) {
+ fprintf(stderr, "Error: too many arguments\n");
+ print_help();
+ exit(EXIT_FAILURE);
+ }
+}
+
static int udp_sock(const char *ifname)
{
int fd, rc, bc = 1;
@@ -173,22 +223,20 @@ static void timer_cb(void *_data)
int main(int argc, char **argv)
{
struct osmo_fd bfd;
- char *ifname = NULL;
int rc;
printf("abisip-find (C) 2009 by Harald Welte\n");
printf("This is FREE SOFTWARE with ABSOLUTELY NO WARRANTY\n\n");
- if (argc < 2) {
+ handle_options(argc, argv);
+
+ if (!cmdline_opts.ifname)
fprintf(stdout, "you might need to specify the outgoing\n"
" network interface, e.g. ``%s eth0''\n", argv[0]);
- } else {
- ifname = argv[1];
- }
bfd.cb = bfd_cb;
bfd.when = BSC_FD_READ | BSC_FD_WRITE;
- bfd.fd = udp_sock(ifname);
+ bfd.fd = udp_sock(cmdline_opts.ifname);
if (bfd.fd < 0) {
perror("Cannot create local socket for broadcast udp");
exit(1);