commit 64a7f83a78c40af461bb6c06e442fde33dcd0465
parent 21bea582e5da39d4bba09627381790dd651c8653
Author: Nihal Jere <nihal@nihaljere.xyz>
Date: Tue, 1 Jun 2021 15:25:37 -0500
handle responses from modem
Diffstat:
M | atd.c | | | 55 | ++++++++++++++++++++++++++++++++++++++----------------- |
M | atsim.c | | | 12 | +++++++++++- |
2 files changed, 49 insertions(+), 18 deletions(-)
diff --git a/atd.c b/atd.c
@@ -1,3 +1,5 @@
+#define _GNU_SOURCE // memmem
+
#include <assert.h>
#include <poll.h>
#include <stdbool.h>
@@ -100,16 +102,36 @@ ssize_t cmdadd(struct fdbuf fdbuf) {
size_t
handle_resp(struct fdbuf *fdbuf)
{
- fprintf(stderr, "got here\n");
- char *ptr = strchr(fdbuf->out, '\n');
- size_t len;
- if (ptr) {
- len = ptr - fdbuf->out;
- fprintf(stderr, "response: %*.*s\n", len, len, fdbuf->out);
- return len;
+ fprintf(stderr, "handle_resp start\n");
+ char *start = fdbuf->out, *ptr = memmem(fdbuf->out, fdbuf->outlen, "\r\n", 2);
+
+ for (int i = 0; i < fdbuf->outlen; i++) {
+ fprintf(stderr, "%x ", fdbuf->out[i]);
+ }
+ fprintf(stderr, "\n");
+
+ if (ptr == NULL)
+ return 0;
+
+ // find next line with content
+ while (start == ptr) {
+ ptr += sizeof("\r\n");
+ start = ptr;
+ ptr = memmem(start, BUFSIZE - (ptr - fdbuf->out), "\r\n", 2);
+ }
+
+ if (strncmp(start, "NO CARRIER", sizeof("NO CARRIER") - 1) == 0) {
+ fprintf(stderr, "got NO CARRIER\n");
+ } else if (strncmp(start, "OK", sizeof("OK") - 1) == 0) {
+ fprintf(stderr, "got OK\n");
+ } else if (strncmp(start, "RING", sizeof("RING") - 1) == 0) {
+ fprintf(stderr, "got RING\n");
}
- return 0;
+ ptr += 2;
+
+ fprintf(stderr, "handle_resp: %d\n", ptr - fdbuf->out);
+ return ptr - fdbuf->out;
}
ssize_t
@@ -236,8 +258,7 @@ int main(int argc, char *argv[])
close(fds[i].fd);
fds[i].fd = -1;
} else if (fds[i].revents & POLLIN) {
- ret = fdbuf_read(fds[i].fd, &fdbufs[i]);
- if (ret == -1) {
+ if (fdbuf_read(fds[i].fd, &fdbufs[i]) == -1) {
warn("failed to read from fd %d:", i);
break;
}
@@ -245,17 +266,15 @@ int main(int argc, char *argv[])
// much was left unparsed so we can move it to the beginning of
// the buffer.
ret = cmdadd(fdbufs[i]);
- if (ret == -2) {
- continue;
- } else if (ret == -1) {
- // TODO mark paused
- } else {
- fprintf(stderr, "got here\n");
+ if (ret != -1) {
assert(ret <= BUFSIZE);
fdbufs[i].outlen -= ret;
memmove(fdbufs[i].out, fdbufs[i].out + ret, fdbufs[i].outlen);
assert(fdbufs[i].outlen >= 0);
fdbufs[i].outptr = fdbufs[i].out + fdbufs[i].outlen;
+ } else {
+ warn("failed to parse command\n");
+ break;
}
}
}
@@ -269,7 +288,9 @@ int main(int argc, char *argv[])
}
ret = handle_resp(&fdbufs[BACKEND]);
- memmove(fdbufs[BACKEND].out, fdbufs[BACKEND].out + ret + 1, BUFSIZE - (ret + 1));
+ memmove(fdbufs[BACKEND].out, fdbufs[BACKEND].out + ret, BUFSIZE - ret);
+ fdbufs[BACKEND].outlen -= ret;
+ fdbufs[BACKEND].outptr -= ret;
/* TODO: temporary, only change this if it is a response to the command */
active_command = false;
}
diff --git a/atsim.c b/atsim.c
@@ -96,7 +96,17 @@ int main() {
fprintf(stderr, "failed to read from stdin\n");
break;
}
- tocount = ret;
+
+ if (tosock[ret-1] == '\n') {
+ tosock[ret-1] = '\r';
+ tosock[ret] = '\n';
+ tosock[ret+1] = '\0';
+ tocount = ret + 1;
+ }
+
+ for (int i = 0; i < tocount; i++) {
+ fprintf(stderr, "%x ", tosock[i]);
+ }
tooff = fromsock;
fds[SOCKFD].events |= POLLOUT;
}