This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
dexter gerrit-no-reply at lists.osmocom.org
Review at https://gerrit.osmocom.org/5239
abisip-find: add getopts and option to prevent endless loop
The utility abisip-find runs into an endless loop and detects the
BTS over and over again. This makes it hard to use the program
from scripts (autodetection and auto-configuration of a single
bts in a lab setup)
Add proper getops options, usage and help
Add option to exit after the first response of from a BTS
(one shot)
Change-Id: I819b9616282dd6efd36c9557c7d6a50b6b00cdc2
---
M src/ipaccess/abisip-find.c
1 file changed, 73 insertions(+), 7 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/39/5239/1
diff --git a/src/ipaccess/abisip-find.c b/src/ipaccess/abisip-find.c
index c459161..8dfbcf4 100644
--- a/src/ipaccess/abisip-find.c
+++ b/src/ipaccess/abisip-find.c
@@ -25,12 +25,22 @@
#include <netinet/in.h>
#include <arpa/inet.h>
+#include <libgen.h>
+#include <getopt.h>
+#include <errno.h>
#include <osmocom/core/select.h>
#include <osmocom/core/timer.h>
#include <osmocom/gsm/protocol/ipaccess.h>
#include <osmocom/gsm/ipa.h>
#include <osmocom/bsc/gsm_data.h>
+
+char program_name[255];
+
+struct bfd_data {
+ bool oneshot;
+ bool exit;
+};
static int udp_sock(const char *ifname)
{
@@ -140,18 +150,25 @@
/* 2 bytes length, 1 byte protocol */
if (buf[2] != IPAC_PROTO_IPACCESS)
- return 0;
+ return -EINVAL;
if (buf[4] != IPAC_MSGT_ID_RESP)
- return 0;
+ return -EINVAL;
return parse_response(buf+6, len-6);
}
static int bfd_cb(struct osmo_fd *bfd, unsigned int flags)
{
- if (flags & BSC_FD_READ)
- return read_response(bfd->fd);
+ struct bfd_data *bfd_data = bfd->data;
+ int rc;
+
+ if (flags & BSC_FD_READ) {
+ rc = read_response(bfd->fd);
+ if (bfd_data->oneshot && rc == 0)
+ bfd_data->exit = true;
+ return rc;
+ }
if (flags & BSC_FD_WRITE) {
bfd->when &= ~BSC_FD_WRITE;
return bcast_find(bfd->fd);
@@ -170,25 +187,72 @@
osmo_timer_schedule(&timer, 5, 0);
}
+static void print_usage()
+{
+ printf("Usage: %s\n", program_name);
+}
+
+static void print_help()
+{
+ printf(" Some useful help...\n");
+ printf(" -h --help this text\n");
+ printf(" -i --ifname. Specify outgoing interface\n");
+ printf(" -1 --one-shot. no endless loop, only one turn \n");
+}
+
int main(int argc, char **argv)
{
struct osmo_fd bfd;
char *ifname = NULL;
int rc;
+ struct bfd_data bfd_data;
+ strncpy(program_name, basename(argv[0]), sizeof(program_name));
+ memset(&bfd_data, 0, sizeof(bfd_data));
+
printf("abisip-find (C) 2009 by Harald Welte\n");
printf("This is FREE SOFTWARE with ABSOLUTELY NO WARRANTY\n\n");
- if (argc < 2) {
+ while (1) {
+ int option_index = 0, c;
+ static struct option long_options[] = {
+ {"help", 0, 0, 'h'},
+ {"ifname", 1, 0, 'i'},
+ {"one-shot", 0, 0, '1'},
+ {0, 0, 0, 0}
+ };
+
+ c = getopt_long(argc, argv, "hi:1",
+ long_options, &option_index);
+ if (c == -1)
+ break;
+
+ switch (c) {
+ case 'h':
+ print_usage();
+ print_help();
+ exit(0);
+ case 'i':
+ ifname = optarg;
+ break;
+ case '1':
+ bfd_data.oneshot = true;
+ break;
+ default:
+ /* ignore */
+ break;
+ }
+ }
+
+ if (ifname == NULL) {
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.data = &bfd_data;
if (bfd.fd < 0) {
perror("Cannot create local socket for broadcast udp");
exit(1);
@@ -209,6 +273,8 @@
rc = osmo_select_main(0);
if (rc < 0)
exit(3);
+ if (bfd_data.exit)
+ break;
}
exit(0);
--
To view, visit https://gerrit.osmocom.org/5239
To unsubscribe, visit https://gerrit.osmocom.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I819b9616282dd6efd36c9557c7d6a50b6b00cdc2
Gerrit-PatchSet: 1
Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Owner: dexter <pmaier at sysmocom.de>