summaryrefslogtreecommitdiff
path: root/src/libgsmd/libgsmd.c
diff options
context:
space:
mode:
authorlaforge <laforge@99fdad57-331a-0410-800a-d7fa5415bdb3>2006-10-22 14:05:53 +0000
committerlaforge <laforge@99fdad57-331a-0410-800a-d7fa5415bdb3>2006-10-22 14:05:53 +0000
commitbf9b037645a5943e3ba0220be55f7f875445bd5a (patch)
tree56083023e677d9ffaedbaac1d847c742db9dff39 /src/libgsmd/libgsmd.c
parent8045fdfb09c2e3b466f371b2ab64ff01f9f7aec1 (diff)
some further gsmd/libgsmd work
git-svn-id: http://svn.openmoko.org/trunk/src/target/gsm@96 99fdad57-331a-0410-800a-d7fa5415bdb3
Diffstat (limited to 'src/libgsmd/libgsmd.c')
-rw-r--r--src/libgsmd/libgsmd.c45
1 files changed, 43 insertions, 2 deletions
diff --git a/src/libgsmd/libgsmd.c b/src/libgsmd/libgsmd.c
index 77b8499..104a8b3 100644
--- a/src/libgsmd/libgsmd.c
+++ b/src/libgsmd/libgsmd.c
@@ -36,7 +36,6 @@ static int lgsm_get_packet(struct lgsm_handle *lh)
return 0;
}
-
static int lgsm_open_backend(struct lgsm_handle *lh, const char *device)
{
int rc;
@@ -52,7 +51,6 @@ static int lgsm_open_backend(struct lgsm_handle *lh, const char *device)
memset(&sun, 0, sizeof(sun));
sun.sun_family = AF_UNIX;
memcpy(sun.sun_path, GSMD_UNIX_SOCKET, sizeof(GSMD_UNIX_SOCKET));
- printf("sizeof(GSMD_UNIX_SOCKET) = %u\n", sizeof(GSMD_UNIX_SOCKET));
rc = connect(lh->fd, (struct sockaddr *)&sun, sizeof(sun));
if (rc < 0) {
@@ -66,6 +64,49 @@ static int lgsm_open_backend(struct lgsm_handle *lh, const char *device)
return 0;
}
+/* handle a packet that was received on the gsmd socket */
+int lgsm_handle_packet(struct lgsm_handle *lh, char *buf, int len)
+{
+ struct gsmd_msg_hdr *gmh = (struct gsmd_msg_hdr *)buf;
+ if (len < sizeof(*gmh))
+ return -EINVAL;
+
+ if (len - sizeof(*gmh) < gmh->len)
+ return -EINVAL;
+
+ if (gmh->msg_type >= __NUM_GSMD_MSGS)
+ return -EINVAL;
+
+ return lh->handler[gmh->msg_type](lh, gmh);
+}
+
+/* blocking read and processing of packets until packet matching 'id' is found */
+int lgsm_blocking_wait_packet(struct lgsm_handle *lh, u_int16_t id,
+ struct gsmd_msg_hdr *gmh, int rlen)
+{
+ int rc;
+ fd_set readset;
+
+ FD_ZERO(&readset);
+
+ while (1) {
+ FD_SET(lh->fd, &readset);
+ rc = select(lh->fd+1, &readset, NULL, NULL, NULL);
+ if (rc <= 0)
+ return rc;
+
+ rc = read(lh->fd, (char *)gmh, rlen);
+ if (rc <= 0)
+ return rc;
+
+ if (gmh->id == id) {
+ /* we've found the matching packet, return to calling function */
+ return rc;
+ } else
+ rc = lgsm_handle_packet(lh, (char *)gmh, rc);
+ }
+}
+
int lgsm_fd(struct lgsm_handle *lh)
{
return lh->fd;
personal git repositories of Harald Welte. Your mileage may vary