# HG changeset patch # User Mychaela Falconia # Date 1724936336 0 # Node ID e5527fc2050b820028dcc4c7065b103bcf76a9b8 # Parent 06c795d4781d80a86a25a4540edfa770af8467ef libutil: copy from ice1-trau-tester diff -r 06c795d4781d -r e5527fc2050b libutil/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libutil/Makefile Thu Aug 29 12:58:56 2024 +0000 @@ -0,0 +1,15 @@ +OBJS= open_ts.o stdin_handler.o +LIB= libutil.a + +include ../config.defs + +CPPFLAGS=${OSMO_INCLUDE} + +all: ${LIB} + +${LIB}: ${OBJS} + ar rcu $@ ${OBJS} + ranlib $@ + +clean: + rm -f *.[oa] errs diff -r 06c795d4781d -r e5527fc2050b libutil/open_ts.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libutil/open_ts.c Thu Aug 29 12:58:56 2024 +0000 @@ -0,0 +1,60 @@ +/* + * The function in this common module is responsible for parsing the + * user-supplied E1 timeslot specification and then opening that ts + * in osmo-e1d. + * + * This code is based on osmo-e1d-pipe, + * (C) 2020-2022 by Harald Welte , + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include +#include + +#include + +#include "open_ts.h" + +static int parse_component(const char *str, const char **outp, uint8_t *var) +{ + if (!isdigit(*str)) + return -1; + *var = atoi(str); + while (isdigit(*str)) + str++; + *outp = str; + return 0; +} + +int open_e1d_ts(struct osmo_e1dp_client *e1_client, const char *ts_spec) +{ + uint8_t intf_nr, line_nr, ts_nr; + const char *cp; + int fd; + + if (parse_component(ts_spec, &cp, &intf_nr) < 0) { +inv_syntax: fprintf(stderr, "error: invalid timeslot spec \"%s\"\n", + ts_spec); + exit(1); + } + if (*cp++ != ':') + goto inv_syntax; + if (parse_component(cp, &cp, &line_nr) < 0) + goto inv_syntax; + if (*cp++ != ':') + goto inv_syntax; + if (parse_component(cp, &cp, &ts_nr) < 0) + goto inv_syntax; + if (*cp) + goto inv_syntax; + fd = osmo_e1dp_client_ts_open(e1_client, intf_nr, line_nr, ts_nr, + E1DP_TSMODE_RAW, 160); + if (fd < 0) { + fprintf(stderr, "error: failed to open E1 ts %s\n", ts_spec); + exit(1); + } + return fd; +} diff -r 06c795d4781d -r e5527fc2050b libutil/open_ts.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libutil/open_ts.h Thu Aug 29 12:58:56 2024 +0000 @@ -0,0 +1,3 @@ +#pragma once + +int open_e1d_ts(struct osmo_e1dp_client *e1_client, const char *ts_spec); diff -r 06c795d4781d -r e5527fc2050b libutil/stdin_handler.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libutil/stdin_handler.c Thu Aug 29 12:58:56 2024 +0000 @@ -0,0 +1,49 @@ +/* + * Stdin handler function: gets called from Osmocom select loop for stdin, + * does line read and initial parsing into arguments, then calls + * program-supplied handler. + */ + +#include +#include +#include +#include +#include +#include + +#include + +#include "stdin_handler.h" + +#define MAX_ARGS 16 + +int stdin_select_cb(struct osmo_fd *ofd, unsigned int what) +{ + stdin_dispatch_t dispatch_func = ofd->data; + char buf[256], *argv[MAX_ARGS+1], *cp; + int argc; + + fgets(buf, sizeof buf, stdin); + argc = 0; + for (cp = buf; ; ) { + while (isspace(*cp)) + cp++; + if (*cp == '\0' || *cp == '#') + break; + if (argc >= MAX_ARGS) { + printf("error: input command exceeds MAX_ARGS\n"); + return 0; + } + argv[argc] = cp; + while (*cp && !isspace(*cp)) + cp++; + if (*cp) + *cp++ = '\0'; + argc++; + } + if (!argc) + return 0; + argv[argc] = NULL; + dispatch_func(argc, argv); + return 0; +} diff -r 06c795d4781d -r e5527fc2050b libutil/stdin_handler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libutil/stdin_handler.h Thu Aug 29 12:58:56 2024 +0000 @@ -0,0 +1,11 @@ +/* + * This header file defines the interface to the stdin handler module: + * gets called from Osmocom select loop for stdin, does line read and + * initial parsing into arguments, then calls program-supplied handler. + */ + +#pragma once + +typedef void (*stdin_dispatch_t)(int argc, char **argv); + +int stdin_select_cb(struct osmo_fd *ofd, unsigned int what);