changeset 4:2ce0ed560a34

libutil: implement stdin handler
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 23 Jun 2024 17:58:32 +0000
parents 90e78243d367
children 7233c10af3ad
files libutil/Makefile libutil/stdin_handler.c libutil/stdin_handler.h
diffstat 3 files changed, 61 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/libutil/Makefile	Sun Jun 23 17:17:18 2024 +0000
+++ b/libutil/Makefile	Sun Jun 23 17:58:32 2024 +0000
@@ -1,4 +1,4 @@
-OBJS=	open_ts.o
+OBJS=	open_ts.o stdin_handler.o
 LIB=	libutil.a
 
 include ../config.defs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libutil/stdin_handler.c	Sun Jun 23 17:58:32 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 <ctype.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <osmocom/core/select.h>
+
+#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;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libutil/stdin_handler.h	Sun Jun 23 17:58:32 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);