diff options
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.patch | 178 |
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 @@ | |||
1 | Upstream-Status: Inappropriate [not used] | ||
2 | |||
3 | From 421b0fa14fefbd13a455c20380fecddda616b41a Mon Sep 17 00:00:00 2001 | ||
4 | From: Andrzej Zaborowski <balrog@zabor.org> | ||
5 | Date: Wed, 19 Sep 2007 18:30:36 +0200 | ||
6 | Subject: [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 | |||
15 | diff --git a/include/libgsmd/libgsmd.h b/include/libgsmd/libgsmd.h | ||
16 | index 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 | ||
28 | diff --git a/src/gsmd/usock.c b/src/gsmd/usock.c | ||
29 | index 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 | } | ||
78 | diff --git a/src/libgsmd/lgsm_internals.h b/src/libgsmd/lgsm_internals.h | ||
79 | index 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); | ||
91 | diff --git a/src/libgsmd/libgsmd.c b/src/libgsmd/libgsmd.c | ||
92 | index 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 | -- | ||
177 | 1.5.2.1 | ||
178 | |||