Changeset 46
- Timestamp:
- 06/30/08 12:27:58
(4 months ago)
- Author:
- jtang
- Message:
sipc_send_data() now properly handles EINTR, and will propagate other error values to the caller.
Updated man page for sipc_send_data().
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r38 |
r46 |
|
| 27 | 27 | such blocking occurs. |
|---|
| 28 | 28 | .SH "RETURN VALUE" |
|---|
| 29 | | This function returns 0 on success, \-1 on error. |
|---|
| | 29 | This function returns 0 on success. On error, \-1 is returned and |
|---|
| | 30 | \fIerrno\fR is set appropriately. |
|---|
| 30 | 31 | .SH "EXAMPLES" |
|---|
| 31 | 32 | .nf |
|---|
| r41 |
r46 |
|
| 139 | 139 | mbuf.mtype = type; |
|---|
| 140 | 140 | memset(mbuf.mtext, 1, sizeof(mbuf.mtext)); |
|---|
| 141 | | if (msgsnd(msqid, &mbuf, sizeof(mbuf.mtext), flags) < 0) |
|---|
| 142 | | return -1; |
|---|
| | 141 | while (msgsnd(msqid, &mbuf, sizeof(mbuf.mtext), flags) < 0) { |
|---|
| | 142 | if (errno != EINTR) { |
|---|
| | 143 | return -1; |
|---|
| | 144 | } |
|---|
| | 145 | } |
|---|
| 143 | 146 | |
|---|
| 144 | 147 | return 0; |
|---|
| r45 |
r46 |
|
| 148 | 148 | int sipc_send_data(sipc_t *sipc, int msg_len) |
|---|
| 149 | 149 | { |
|---|
| 150 | | if (!sipc) |
|---|
| | 150 | if (!sipc) { |
|---|
| | 151 | errno = EINVAL; |
|---|
| 151 | 152 | return -1; |
|---|
| | 153 | } |
|---|
| 152 | 154 | |
|---|
| 153 | 155 | return sipc->funcs->sipc_send_data(sipc, msg_len); |
|---|
| r45 |
r46 |
|
| 143 | 143 | { |
|---|
| 144 | 144 | int max_packet_sz = SIPC_MQUEUE_MSG_SZ - sizeof(struct msgbuf); |
|---|
| | 145 | int error = 0; |
|---|
| 145 | 146 | size_t packet_sz; |
|---|
| 146 | 147 | char *packet = NULL; |
|---|
| 147 | 148 | |
|---|
| 148 | | if (!sipc) |
|---|
| 149 | | goto err; |
|---|
| 150 | | if (sipc->role != SIPC_SENDER) |
|---|
| 151 | | goto err; |
|---|
| | 149 | if (!sipc) { |
|---|
| | 150 | error = EINVAL; |
|---|
| | 151 | goto err; |
|---|
| | 152 | } |
|---|
| | 153 | if (sipc->role != SIPC_SENDER) { |
|---|
| | 154 | error = EINVAL; |
|---|
| | 155 | goto err; |
|---|
| | 156 | } |
|---|
| 152 | 157 | |
|---|
| 153 | 158 | struct msgbuf *mbuf = sipc->mbuf; |
|---|
| … | … | |
| 155 | 160 | memset(mbuf, 0, SIPC_MQUEUE_MSG_SZ); |
|---|
| 156 | 161 | sipc->msg_len = msg_len; |
|---|
| 157 | | mqueue_send_msg_len(sipc, msg_len); |
|---|
| | 162 | if (mqueue_send_msg_len(sipc, msg_len) < 0) { |
|---|
| | 163 | error = errno; |
|---|
| | 164 | goto err; |
|---|
| | 165 | } |
|---|
| 158 | 166 | |
|---|
| 159 | 167 | sipc->copied = 0; /* Reset copied data counter */ |
|---|
| … | … | |
| 162 | 170 | |
|---|
| 163 | 171 | if ((packet = split_data(sipc, packet_sz)) == NULL) { |
|---|
| | 172 | error = errno; |
|---|
| 164 | 173 | sipc_error(sipc, "%s\n", "Unable to fragment message data"); |
|---|
| 165 | 174 | goto err; |
|---|
| … | … | |
| 171 | 180 | |
|---|
| 172 | 181 | /* Send the message */ |
|---|
| 173 | | if (msgsnd(sipc->msqid, mbuf, packet_sz, 0) < 0) { |
|---|
| 174 | | sipc_error(sipc, "msgsnd: %s\n", strerror(errno)); |
|---|
| 175 | | goto err; |
|---|
| | 182 | while (msgsnd(sipc->msqid, mbuf, packet_sz, 0) < 0) { |
|---|
| | 183 | error = errno; |
|---|
| | 184 | if (error != EINTR) { |
|---|
| | 185 | sipc_error(sipc, "msgsnd: %s\n", strerror(errno)); |
|---|
| | 186 | goto err; |
|---|
| | 187 | } |
|---|
| 176 | 188 | } |
|---|
| 177 | 189 | free(packet); |
|---|
| … | … | |
| 179 | 191 | |
|---|
| 180 | 192 | /* Send end of message marker */ |
|---|
| 181 | | mqueue_send_end_xmit(sipc); |
|---|
| | 193 | if (mqueue_send_end_xmit(sipc) < 0) { |
|---|
| | 194 | error = errno; |
|---|
| | 195 | goto err; |
|---|
| | 196 | } |
|---|
| 182 | 197 | sipc->msg_len = SIPC_MSGLEN_NOT_SET; |
|---|
| 183 | 198 | return 0; |
|---|
| … | … | |
| 186 | 201 | free(packet); |
|---|
| 187 | 202 | sipc->msg_len = SIPC_MSGLEN_NOT_SET; |
|---|
| | 203 | errno = error; |
|---|
| 188 | 204 | return -1; |
|---|
| 189 | 205 | } |
|---|
| … | … | |
| 343 | 359 | mbuf.mtype = SIPC_END_XMIT; |
|---|
| 344 | 360 | memset(mbuf.mtext, 1, sizeof(mbuf.mtext)); |
|---|
| 345 | | |
|---|
| 346 | | if (msgsnd(sipc->msqid, (struct msgbuf *)&mbuf, sizeof(mbuf.mtext), 0) < 0) { |
|---|
| 347 | | sipc_error(sipc, "msgsnd: %s\n", strerror(errno)); |
|---|
| 348 | | return -1; |
|---|
| | 361 | int error; |
|---|
| | 362 | |
|---|
| | 363 | while (msgsnd(sipc->msqid, (struct msgbuf *)&mbuf, sizeof(mbuf.mtext), 0) < 0) { |
|---|
| | 364 | error = errno; |
|---|
| | 365 | if (error != EINTR) { |
|---|
| | 366 | sipc_error(sipc, "msgsnd: %s\n", strerror(errno)); |
|---|
| | 367 | errno = error; |
|---|
| | 368 | return -1; |
|---|
| | 369 | } |
|---|
| 349 | 370 | } |
|---|
| 350 | 371 | |
|---|
| … | … | |
| 366 | 387 | { |
|---|
| 367 | 388 | struct msgbuf *mbuf; |
|---|
| | 389 | int error; |
|---|
| 368 | 390 | |
|---|
| 369 | 391 | if (len < 0) |
|---|
| … | … | |
| 381 | 403 | sprintf(mbuf->mtext, "%d", len); |
|---|
| 382 | 404 | |
|---|
| 383 | | if (msgsnd(sipc->msqid, mbuf, strlen(mbuf->mtext) + 1, 0) < 0) { |
|---|
| 384 | | free(mbuf); |
|---|
| 385 | | sipc_error(sipc, "msgsnd: %s\n", strerror(errno)); |
|---|
| 386 | | return -1; |
|---|
| | 405 | while (msgsnd(sipc->msqid, mbuf, strlen(mbuf->mtext) + 1, 0) < 0) { |
|---|
| | 406 | error = errno; |
|---|
| | 407 | if (error != EINTR) { |
|---|
| | 408 | free(mbuf); |
|---|
| | 409 | sipc_error(sipc, "msgsnd: %s\n", strerror(errno)); |
|---|
| | 410 | errno = error; |
|---|
| | 411 | return -1; |
|---|
| | 412 | } |
|---|
| 387 | 413 | } |
|---|
| 388 | 414 | free(mbuf); |
|---|
| r45 |
r46 |
|
| 160 | 160 | int sipc_shm_send_data(sipc_t *sipc, int msg_len) |
|---|
| 161 | 161 | { |
|---|
| 162 | | if (!sipc) |
|---|
| 163 | | return -1; |
|---|
| | 162 | int error; |
|---|
| | 163 | if (!sipc) { |
|---|
| | 164 | errno = EINVAL; |
|---|
| | 165 | return -1; |
|---|
| | 166 | } |
|---|
| 164 | 167 | |
|---|
| 165 | 168 | /* Send a DATA_READY marker */ |
|---|
| 166 | 169 | if (mqueue_send_msg_type(sipc->s.msqid, SIPC_DATA_READY, MQ_BLOCK) < 0) { |
|---|
| | 170 | error = errno; |
|---|
| 167 | 171 | sipc_error(sipc, "Could not send DATA_READY marker\n"); |
|---|
| | 172 | errno = error; |
|---|
| 168 | 173 | return -1; |
|---|
| 169 | 174 | } |
|---|
| … | … | |
| 172 | 177 | reader calls sipc_recv_data(). */ |
|---|
| 173 | 178 | if (mqueue_send_msg_type(sipc->s.msqid, SIPC_DATA_READING, MQ_BLOCK) < 0) { |
|---|
| | 179 | error = errno; |
|---|
| 174 | 180 | sipc_error(sipc, "Could not send DATA_READING marker\n"); |
|---|
| | 181 | errno = error; |
|---|
| 175 | 182 | return -1; |
|---|
| 176 | 183 | } |
|---|
| … | … | |
| 179 | 186 | calls sipc_shm_recv_done(). */ |
|---|
| 180 | 187 | if (mqueue_send_msg_type(sipc->s.msqid, SIPC_DATA_DONE, MQ_BLOCK) < 0) { |
|---|
| | 188 | error = errno; |
|---|
| 181 | 189 | sipc_error(sipc, "Could not send DATA_DONE marker\n"); |
|---|
| | 190 | errno = error; |
|---|
| 182 | 191 | return -1; |
|---|
| 183 | 192 | } |
|---|
Download in other formats:
* Generating other formats may take time.