annotate libutil/stdin_handler.c @ 4:2ce0ed560a34

libutil: implement stdin handler
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 23 Jun 2024 17:58:32 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * Stdin handler function: gets called from Osmocom select loop for stdin,
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * does line read and initial parsing into arguments, then calls
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * program-supplied handler.
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 */
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 #include <ctype.h>
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include <stdint.h>
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <stdbool.h>
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <stdio.h>
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include <stdlib.h>
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 #include <unistd.h>
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 #include <osmocom/core/select.h>
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 #include "stdin_handler.h"
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 #define MAX_ARGS 16
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 int stdin_select_cb(struct osmo_fd *ofd, unsigned int what)
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 {
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 stdin_dispatch_t dispatch_func = ofd->data;
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 char buf[256], *argv[MAX_ARGS+1], *cp;
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 int argc;
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 fgets(buf, sizeof buf, stdin);
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 argc = 0;
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 for (cp = buf; ; ) {
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 while (isspace(*cp))
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 cp++;
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 if (*cp == '\0' || *cp == '#')
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 break;
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 if (argc >= MAX_ARGS) {
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 printf("error: input command exceeds MAX_ARGS\n");
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 return 0;
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 }
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 argv[argc] = cp;
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 while (*cp && !isspace(*cp))
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 cp++;
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 if (*cp)
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 *cp++ = '\0';
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 argc++;
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 }
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 if (!argc)
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 return 0;
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 argv[argc] = NULL;
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 dispatch_func(argc, argv);
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 return 0;
2ce0ed560a34 libutil: implement stdin handler
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 }