Changeset 46

Show
Ignore:
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
  • trunk/libsipc/man/man3/sipc_send_data.3

    r38 r46  
    2727such blocking occurs. 
    2828.SH "RETURN VALUE" 
    29 This function returns 0 on success, \-1 on error. 
     29This function returns 0 on success.  On error, \-1 is returned and 
     30\fIerrno\fR is set appropriately. 
    3031.SH "EXAMPLES" 
    3132.nf 
  • trunk/libsipc/src/mqueue_internal.c

    r41 r46  
    139139        mbuf.mtype = type; 
    140140        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        } 
    143146 
    144147        return 0; 
  • trunk/libsipc/src/sipc.c

    r45 r46  
    148148int sipc_send_data(sipc_t *sipc, int msg_len) 
    149149{ 
    150         if (!sipc) 
     150        if (!sipc) { 
     151                errno = EINVAL; 
    151152                return -1; 
     153        } 
    152154 
    153155        return sipc->funcs->sipc_send_data(sipc, msg_len); 
  • trunk/libsipc/src/sipc_mqueue.c

    r45 r46  
    143143{ 
    144144        int max_packet_sz = SIPC_MQUEUE_MSG_SZ - sizeof(struct msgbuf); 
     145        int error = 0; 
    145146        size_t packet_sz; 
    146147        char *packet = NULL; 
    147148 
    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        } 
    152157 
    153158        struct msgbuf *mbuf = sipc->mbuf; 
     
    155160        memset(mbuf, 0, SIPC_MQUEUE_MSG_SZ); 
    156161        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        } 
    158166 
    159167        sipc->copied = 0;              /* Reset copied data counter */ 
     
    162170 
    163171                if ((packet = split_data(sipc, packet_sz)) == NULL) { 
     172                        error = errno; 
    164173                        sipc_error(sipc, "%s\n", "Unable to fragment message data"); 
    165174                        goto err; 
     
    171180 
    172181                /* 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                        } 
    176188                } 
    177189                free(packet); 
     
    179191 
    180192        /* 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        } 
    182197        sipc->msg_len = SIPC_MSGLEN_NOT_SET; 
    183198        return 0; 
     
    186201        free(packet); 
    187202        sipc->msg_len = SIPC_MSGLEN_NOT_SET; 
     203        errno = error; 
    188204        return -1; 
    189205} 
     
    343359        mbuf.mtype = SIPC_END_XMIT; 
    344360        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                } 
    349370        } 
    350371 
     
    366387{ 
    367388        struct msgbuf *mbuf; 
     389        int error; 
    368390 
    369391        if (len < 0) 
     
    381403        sprintf(mbuf->mtext, "%d", len); 
    382404 
    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                } 
    387413        } 
    388414        free(mbuf); 
  • trunk/libsipc/src/sipc_shm.c

    r45 r46  
    160160int sipc_shm_send_data(sipc_t *sipc, int msg_len) 
    161161{ 
    162         if (!sipc) 
    163                 return -1; 
     162        int error; 
     163        if (!sipc) { 
     164                errno = EINVAL; 
     165                return -1; 
     166        } 
    164167 
    165168        /* Send a DATA_READY marker */ 
    166169        if (mqueue_send_msg_type(sipc->s.msqid, SIPC_DATA_READY, MQ_BLOCK) < 0) { 
     170                error = errno; 
    167171                sipc_error(sipc, "Could not send DATA_READY marker\n"); 
     172                errno = error; 
    168173                return -1; 
    169174        } 
     
    172177           reader calls sipc_recv_data(). */ 
    173178        if (mqueue_send_msg_type(sipc->s.msqid, SIPC_DATA_READING, MQ_BLOCK) < 0) { 
     179                error = errno; 
    174180                sipc_error(sipc, "Could not send DATA_READING marker\n"); 
     181                errno = error; 
    175182                return -1; 
    176183        } 
     
    179186           calls sipc_shm_recv_done(). */ 
    180187        if (mqueue_send_msg_type(sipc->s.msqid, SIPC_DATA_DONE, MQ_BLOCK) < 0) { 
     188                error = errno; 
    181189                sipc_error(sipc, "Could not send DATA_DONE marker\n"); 
     190                errno = error; 
    182191                return -1; 
    183192        }