diff options
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/Makefile.am | 2 | ||||
-rw-r--r-- | src/util/event.c | 38 | ||||
-rw-r--r-- | src/util/event.h | 2 | ||||
-rw-r--r-- | src/util/libgsmd-tool.c | 13 | ||||
-rw-r--r-- | src/util/pin.c | 39 | ||||
-rw-r--r-- | src/util/pin.h | 2 | ||||
-rw-r--r-- | src/util/shell.c | 56 |
7 files changed, 140 insertions, 12 deletions
diff --git a/src/util/Makefile.am b/src/util/Makefile.am index bec625a..aee83ca 100644 --- a/src/util/Makefile.am +++ b/src/util/Makefile.am @@ -3,7 +3,7 @@ AM_CFLAGS = -std=gnu99 bin_PROGRAMS = libgsmd-tool -libgsmd_tool_SOURCES = libgsmd-tool.c shell.c +libgsmd_tool_SOURCES = libgsmd-tool.c shell.c event.c pin.c libgsmd_tool_LDADD = ../libgsmd/libgsmd.la libgsmd_tool_LDFLAGS = -dynamic diff --git a/src/util/event.c b/src/util/event.c new file mode 100644 index 0000000..601ea9a --- /dev/null +++ b/src/util/event.c @@ -0,0 +1,38 @@ +#include <stdio.h> +#include <string.h> + +#include <libgsmd/libgsmd.h> +#include <libgsmd/event.h> + +static int incall_handler(struct lgsm_handle *lh, int evt, struct gsmd_evt_auxdata *aux) +{ + printf("EVENT: Incoming call type=%u!\n", aux->u.call.type); + + return 0; +} + +static int clip_handler(struct lgsm_handle *lh, int evt, struct gsmd_evt_auxdata *aux) +{ + printf("EVENT: Incoming call clip=`%s'\n", aux->u.clip.addr.number); + + return 0; +} + +static int netreg_handler(struct lgsm_handle *lh, int evt, struct gsmd_evt_auxdata *aux) +{ + printf("EVENT: Netreg\n"); + + return 0; +} + +int event_init(struct lgsm_handle *lh) +{ + int rc; + + rc = lgsm_evt_handler_register(lh, GSMD_EVT_IN_CALL, &incall_handler); + rc |= lgsm_evt_handler_register(lh, GSMD_EVT_IN_CLIP, &clip_handler); + rc |= lgsm_evt_handler_register(lh, GSMD_EVT_NETREG, &netreg_handler); + + return rc; +} + diff --git a/src/util/event.h b/src/util/event.h new file mode 100644 index 0000000..6901a2d --- /dev/null +++ b/src/util/event.h @@ -0,0 +1,2 @@ + +extern int event_init(struct lgsm_handle *lh); diff --git a/src/util/libgsmd-tool.c b/src/util/libgsmd-tool.c index e8590c1..8d4674c 100644 --- a/src/util/libgsmd-tool.c +++ b/src/util/libgsmd-tool.c @@ -8,6 +8,9 @@ #include <libgsmd/libgsmd.h> +#include "pin.h" +#include "event.h" + #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #endif @@ -44,6 +47,7 @@ static struct option opts[] = { { "version", 0, 0, 'V' }, { "verbose", 0, 0, 'v' }, { "mode", 1, 0, 'm' }, + { "pin", 1, 0, 'p' }, { 0, 0, 0, 0 } }; @@ -57,6 +61,7 @@ static void help(void) int main(int argc, char **argv) { + char *pin = NULL; int rc, i, mode; printf("libgsm-tool - (C) 2006 by Harald Welte\n" @@ -64,7 +69,7 @@ int main(int argc, char **argv) while (1) { int c, option_index = 0; - c = getopt_long(argc, argv, "vVhm:", opts, &option_index); + c = getopt_long(argc, argv, "vVhm:p:", opts, &option_index); if (c == -1) break; @@ -86,6 +91,9 @@ int main(int argc, char **argv) exit(2); } break; + case 'p': + pin = optarg; + break; } } @@ -95,6 +103,9 @@ int main(int argc, char **argv) exit(1); } + pin_init(lgsmh, pin); + event_init(lgsmh); + switch (mode) { case MODE_SHELL: shell_main(lgsmh); diff --git a/src/util/pin.c b/src/util/pin.c new file mode 100644 index 0000000..b855e53 --- /dev/null +++ b/src/util/pin.c @@ -0,0 +1,39 @@ +#include <stdio.h> +#include <string.h> + +#include <libgsmd/libgsmd.h> +#include <libgsmd/event.h> + +#define PIN_SIZE 32 + +static char *pin; +static char pinbuf[PIN_SIZE+1]; + +static int pin_handler(struct lgsm_handle *lh, int evt, struct gsmd_evt_auxdata *aux) +{ + int rc; + + printf("EVENT: PIN request (type=%u) ", aux->u.pin.type); + + /* FIXME: read pin from STDIN and send it back via lgsm_pin */ + if (aux->u.pin.type == 1 && pin) { + printf("Auto-responding with pin `%s'\n", pin); + lgsm_pin(lh, pin); + } else { + do { + printf("Please enter PIN: "); + rc = fscanf(stdin, "%32s\n", &pinbuf); + } while (rc < 1); + + return lgsm_pin(lh, pinbuf); + } + + return 0; +} + +int pin_init(struct lgsm_handle *lh, const char *pin_preset) +{ + pin = pin_preset; + return lgsm_evt_handler_register(lh, GSMD_EVT_PIN, &pin_handler); +} + diff --git a/src/util/pin.h b/src/util/pin.h new file mode 100644 index 0000000..534e2b4 --- /dev/null +++ b/src/util/pin.h @@ -0,0 +1,2 @@ + +extern int pin_init(struct lgsm_handle *lh, const char *pin_preset); diff --git a/src/util/shell.c b/src/util/shell.c index 3b13bc9..77f0c57 100644 --- a/src/util/shell.c +++ b/src/util/shell.c @@ -1,30 +1,66 @@ #include <stdio.h> #include <string.h> +#include <stdlib.h> +#include <unistd.h> #include <libgsmd/libgsmd.h> #define STDIN_BUF_SIZE 1024 -int shell_main(struct lgsmd_handle *lgsmh) +/* this is the handler for receiving passthrough responses */ +static int pt_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh) +{ + char *payload = (char *)gmh + sizeof(*gmh); + printf("RSTR=`%s'\n", payload); +} + +int shell_main(struct lgsm_handle *lgsmh) { int rc; char buf[STDIN_BUF_SIZE+1]; char rbuf[STDIN_BUF_SIZE+1]; int rlen = sizeof(rbuf); + fd_set readset; + + lgsm_register_handler(lgsmh, GSMD_MSG_PASSTHROUGH, &pt_msghandler); + + FD_ZERO(&readset); while (1) { - rc = fscanf(stdin, "%s", buf); - if (rc == EOF) { - printf("EOF\n"); - return -1; + fd_set readset; + int gsm_fd = lgsm_fd(lgsmh); + FD_SET(0, &readset); + FD_SET(gsm_fd, &readset); + + rc = select(gsm_fd+1, &readset, NULL, NULL, NULL); + if (rc <= 0) + break; + if (FD_ISSET(gsm_fd, &readset)) { + /* we've received something on the gsmd socket, pass it + * on to the library */ + rc = read(gsm_fd, buf, sizeof(buf)); + if (rc <= 0) { + printf("ERROR reding from gsm_fd\n"); + break; + } + rc = lgsm_handle_packet(lgsmh, buf, rc); } - if (rc <= 0) { - printf("NULL\n"); - continue; + if (FD_ISSET(0, &readset)) { + /* we've received something on stdin. send it as passthrough + * to gsmd */ + rc = fscanf(stdin, "%s", buf); + if (rc == EOF) { + printf("EOF\n"); + return -1; + } + if (rc <= 0) { + printf("NULL\n"); + continue; + } + printf("STR=`%s'\n", buf); } - printf("STR=`%s'\n", buf); + /* this is a synchronous call for a passthrough command */ lgsm_passthrough(lgsmh, buf, rbuf, &rlen); - printf("RSTR=`%s'\n", rbuf); } } |