static int PR_CALLBACK memio_Send(PRFileDesc *fd, const void *buf, PRInt32 len, PRIntn flags, PRIntervalTime timeout) { struct PRFilePrivate *secret; struct memio_buffer *mb; int rv; secret = fd->secret; mb = &secret->writebuf; PR_ASSERT(mb->bufsize); /* Note that the read error state is not reported, because it cannot be * reported until all buffered data has been read. If there is an error * with the next layer, attempting to call Send again will report the * error appropriately. */ if (mb->last_err) { PR_SetError(mb->last_err, 0); return -1; } rv = memio_buffer_put(mb, buf, len); if (rv == 0) { PR_SetError(PR_WOULD_BLOCK_ERROR, 0); return -1; } return rv; }
int main() { struct memio_buffer mb; char buf[100]; int i; memio_buffer_new(&mb, TEST_BUFLEN); CHECKEQ(memio_buffer_unused_contiguous(&mb), TEST_BUFLEN-1); CHECKEQ(memio_buffer_used_contiguous(&mb), 0); CHECKEQ(memio_buffer_put(&mb, "howdy", 5), 5); CHECKEQ(memio_buffer_unused_contiguous(&mb), TEST_BUFLEN-1-5); CHECKEQ(memio_buffer_used_contiguous(&mb), 5); CHECKEQ(memio_buffer_wrapped_bytes(&mb), 0); CHECKEQ(memio_buffer_put(&mb, "!", 1), 1); CHECKEQ(memio_buffer_unused_contiguous(&mb), 0); CHECKEQ(memio_buffer_used_contiguous(&mb), 6); CHECKEQ(memio_buffer_wrapped_bytes(&mb), 0); CHECKEQ(memio_buffer_get(&mb, buf, 6), 6); CHECKEQ(memcmp(buf, "howdy!", 6), 0); CHECKEQ(memio_buffer_unused_contiguous(&mb), 1); CHECKEQ(memio_buffer_used_contiguous(&mb), 0); CHECKEQ(memio_buffer_put(&mb, "01234", 5), 5); CHECKEQ(memio_buffer_used_contiguous(&mb), 1); CHECKEQ(memio_buffer_wrapped_bytes(&mb), 4); CHECKEQ(memio_buffer_unused_contiguous(&mb), TEST_BUFLEN-1-5); CHECKEQ(memio_buffer_put(&mb, "5", 1), 1); CHECKEQ(memio_buffer_unused_contiguous(&mb), 0); CHECKEQ(memio_buffer_used_contiguous(&mb), 1); /* TODO: add more cases */ printf("Test passed\n"); exit(0); }
static int PR_CALLBACK memio_Send(PRFileDesc *fd, const void *buf, PRInt32 len, PRIntn flags, PRIntervalTime timeout) { struct PRFilePrivate *secret; struct memio_buffer *mb; int rv; secret = fd->secret; mb = &secret->writebuf; PR_ASSERT(mb->bufsize); if (mb->last_err) { PR_SetError(mb->last_err, 0); return -1; } rv = memio_buffer_put(mb, buf, len); if (rv == 0) { PR_SetError(PR_WOULD_BLOCK_ERROR, 0); return -1; } return rv; }