/* * scamper_fd_private * * allocate a private fd for scamper to manage. this fd is not shared amongst * scamper. */ scamper_fd_t *scamper_fd_private(int fd, scamper_fd_cb_t read_cb, void *read_param, scamper_fd_cb_t write_cb, void *write_param) { scamper_fd_t *fdn = NULL; if((fdn = fd_alloc(SCAMPER_FD_TYPE_PRIVATE, fd)) == NULL) { goto err; } if((fdn->fd_list_node = dlist_tail_push(fd_list, fdn)) == NULL) goto err; if(read_cb != NULL) { scamper_fd_read_set(fdn, read_cb, read_param); scamper_fd_read_unpause(fdn); } if(write_cb != NULL) { scamper_fd_write_set(fdn, write_cb, write_param); scamper_fd_write_unpause(fdn); } return fdn; err: if(fdn != NULL) fd_free(fdn); return NULL; }
/* * scamper_writebuf_send * * register an iovec to send when it can be sent without blocking the * rest of scamper. */ int scamper_writebuf_send(scamper_writebuf_t *wb, const void *data, size_t len) { struct iovec *iov = NULL; /* make sure there is data to send */ if(len < 1) return 0; /* * an error occured last time sendmsg(2) was called which makes this * writebuf invalid */ if(wb->error != 0) return -1; /* allocate the iovec and fill it out */ if((iov = malloc_zero(sizeof(struct iovec))) == NULL || (iov->iov_base = memdup(data, len)) == NULL) { goto err; } iov->iov_len = len; /* put the iovec at the tail of iovecs to send */ if(slist_tail_push(wb->iovs, iov) == NULL) goto err; if(wb->fdn != NULL) scamper_fd_write_unpause(wb->fdn); return 0; err: if(iov == NULL) return -1; if(iov->iov_base != NULL) free(iov->iov_base); free(iov); return -1; }