summaryrefslogtreecommitdiffstats
path: root/meta/recipes-connectivity/gsm/files/0004-Handle-read-and-write-return-values.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-connectivity/gsm/files/0004-Handle-read-and-write-return-values.patch')
-rw-r--r--meta/recipes-connectivity/gsm/files/0004-Handle-read-and-write-return-values.patch178
1 files changed, 0 insertions, 178 deletions
diff --git a/meta/recipes-connectivity/gsm/files/0004-Handle-read-and-write-return-values.patch b/meta/recipes-connectivity/gsm/files/0004-Handle-read-and-write-return-values.patch
deleted file mode 100644
index 84a4aa12f3..0000000000
--- a/meta/recipes-connectivity/gsm/files/0004-Handle-read-and-write-return-values.patch
+++ /dev/null
@@ -1,178 +0,0 @@
1Upstream-Status: Inappropriate [not used]
2
3From 421b0fa14fefbd13a455c20380fecddda616b41a Mon Sep 17 00:00:00 2001
4From: Andrzej Zaborowski <balrog@zabor.org>
5Date: Wed, 19 Sep 2007 18:30:36 +0200
6Subject: [PATCH] Handle read() and write() return values.
7
8---
9 include/libgsmd/libgsmd.h | 3 +-
10 src/gsmd/usock.c | 38 ++++++++++++++++-----------
11 src/libgsmd/lgsm_internals.h | 2 +
12 src/libgsmd/libgsmd.c | 58 ++++++++++++++++++++++++++---------------
13 4 files changed, 63 insertions(+), 38 deletions(-)
14
15diff --git a/include/libgsmd/libgsmd.h b/include/libgsmd/libgsmd.h
16index fc56890..db15aa9 100644
17--- a/include/libgsmd/libgsmd.h
18+++ b/include/libgsmd/libgsmd.h
19@@ -65,6 +65,7 @@ extern int lgsm_subscriptions(struct lgsm_handle *lh, u_int32_t subscriptions);
20
21 extern struct gsmd_msg_hdr *lgsm_gmh_fill(int type, int subtype, int payload_len);
22 extern int lgsm_send(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh);
23-extern int lgsm_handle_packet(struct lgsm_handle *lh, char *buf, int len);
24+extern int lgsm_handle_packet(struct lgsm_handle *lh,
25+ const char *buf, int len);
26
27 #endif
28diff --git a/src/gsmd/usock.c b/src/gsmd/usock.c
29index bac5f0c..2283600 100644
30--- a/src/gsmd/usock.c
31+++ b/src/gsmd/usock.c
32@@ -1569,23 +1569,29 @@ static int gsmd_usock_user_cb(int fd, unsigned int what, void *data)
33 struct gsmd_ucmd *ucmd, *uctmp;
34 llist_for_each_entry_safe(ucmd, uctmp, &gu->finished_ucmds,
35 list) {
36- int rc;
37-
38- rc = write(fd, &ucmd->hdr, sizeof(ucmd->hdr) + ucmd->hdr.len);
39- if (rc < 0) {
40- DEBUGP("write return %d\n", rc);
41- return rc;
42- }
43- if (rc == 0) {
44- DEBUGP("write returns zero!!\n");
45- break;
46+ const void *pos = &ucmd->hdr;
47+ size_t len = sizeof(ucmd->hdr) + ucmd->hdr.len;
48+
49+ while (len) {
50+ ssize_t rc;
51+
52+ rc = write(fd, pos, len);
53+ if (rc < 0 && errno != EINTR) {
54+ DEBUGP("write returned %s\n",
55+ strerror(errno));
56+ return rc;
57+ }
58+ if (rc == 0 && pos == &ucmd->hdr) {
59+ DEBUGP("write returns zero!!\n");
60+ return 0;
61+ }
62+ if (rc > 0) {
63+ len -= rc;
64+ pos += rc;
65+ }
66 }
67- if (rc != sizeof(ucmd->hdr) + ucmd->hdr.len) {
68- DEBUGP("short write\n");
69- break;
70- }
71-
72- DEBUGP("successfully sent cmd %p to user %p, freeing\n", ucmd, gu);
73+ DEBUGP("successfully sent cmd %p to user %p, "
74+ "freeing\n", ucmd, gu);
75 llist_del(&ucmd->list);
76 talloc_free(ucmd);
77 }
78diff --git a/src/libgsmd/lgsm_internals.h b/src/libgsmd/lgsm_internals.h
79index c826723..f1b1a23 100644
80--- a/src/libgsmd/lgsm_internals.h
81+++ b/src/libgsmd/lgsm_internals.h
82@@ -8,6 +8,8 @@ struct lgsm_handle {
83 int fd;
84 lgsm_msg_handler *handler[__NUM_GSMD_MSGS];
85 enum lgsm_netreg_state netreg_state;
86+ char usock_fifo[1024];
87+ int usock_len;
88 };
89
90 int lgsm_send(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh);
91diff --git a/src/libgsmd/libgsmd.c b/src/libgsmd/libgsmd.c
92index 9906ea8..cc804ed 100644
93--- a/src/libgsmd/libgsmd.c
94+++ b/src/libgsmd/libgsmd.c
95@@ -86,34 +86,37 @@ static int lgsm_open_backend(struct lgsm_handle *lh, const char *device)
96 }
97
98 /* handle a packet that was received on the gsmd socket */
99-int lgsm_handle_packet(struct lgsm_handle *lh, char *buf, int len)
100+int lgsm_handle_packet(struct lgsm_handle *lh, const char *buf, int len)
101 {
102 struct gsmd_msg_hdr *gmh;
103 lgsm_msg_handler *handler;
104 int rc = 0;
105
106- while (len) {
107- if (len < sizeof(*gmh))
108- return -EINVAL;
109- gmh = (struct gsmd_msg_hdr *) buf;
110-
111- if (len - sizeof(*gmh) < gmh->len)
112- return -EINVAL;
113- len -= sizeof(*gmh) + gmh->len;
114- buf += sizeof(*gmh) + gmh->len;
115-
116- if (gmh->msg_type >= __NUM_GSMD_MSGS)
117- return -EINVAL;
118-
119- handler = lh->handler[gmh->msg_type];
120+ if (lh->usock_len + len > sizeof(lh->usock_fifo))
121+ return -ENOMEM;
122
123- if (handler)
124+ memcpy(lh->usock_fifo + lh->usock_len, buf, len);
125+ lh->usock_len += len;
126+ gmh = (struct gsmd_msg_hdr *) lh->usock_fifo;
127+ while (lh->usock_len >= sizeof(*gmh) &&
128+ lh->usock_len >= sizeof(*gmh) + gmh->len) {
129+ if (gmh->msg_type < __NUM_GSMD_MSGS &&
130+ (handler = lh->handler[gmh->msg_type]))
131 rc |= handler(lh, gmh);
132- else
133- fprintf(stderr, "unable to handle packet type=%u\n",
134- gmh->msg_type);
135+ else {
136+ fprintf(stderr, "unable to handle packet "
137+ "type=%u id=%u\n",
138+ gmh->msg_type, gmh->id);
139+ rc |= EINVAL;
140+ }
141+
142+ lh->usock_len -= gmh->len + sizeof(*gmh);
143+ memmove(lh->usock_fifo,
144+ lh->usock_fifo + gmh->len + sizeof(*gmh),
145+ lh->usock_len);
146 }
147- return rc;
148+
149+ return -rc;
150 }
151
152 int lgsm_register_handler(struct lgsm_handle *lh, int type, lgsm_msg_handler *handler)
153@@ -193,8 +196,21 @@ static u_int16_t next_msg_id;
154
155 int lgsm_send(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh)
156 {
157+ ssize_t rc;
158+ size_t len = sizeof(*gmh) + gmh->len;
159+ const void *pos = gmh;
160+
161 gmh->id = next_msg_id++;
162- return send(lh->fd, (char *) gmh, sizeof(*gmh) + gmh->len, 0);
163+ while (len) {
164+ rc = send(lh->fd, pos, len, 0);
165+ if (rc < 0 && errno != EINTR)
166+ return -errno;
167+ if (rc > 0) {
168+ len -= rc;
169+ pos += rc;
170+ }
171+ }
172+ return 0;
173 }
174
175 struct gsmd_msg_hdr *lgsm_gmh_fill(int type, int subtype, int payload_len)
176--
1771.5.2.1
178