int handle_server_data(char *in_buf, char *handle, int in_len, int socket_num) { Header *header = (Header *)in_buf; int code = 0; switch (header->flag) { case 2: code = 3; break; case 3: printf("\nHandle already in use: %s\n", handle); code = 1; break; case 4: handle_incoming_broadcast(in_buf + sizeof(Header)); break; case 5: handle_incoming_message(in_buf + sizeof(Header)); break; case 6: code = 3; break; case 7: handle_send_error(in_buf + sizeof(Header)); break; case 9: code = 2; break; case 11: handle_incoming_list(in_buf + sizeof(Header), in_len, socket_num); break; default: code = 3; break; } return code; }
void Connection::handle_write(const boost::system::error_code & e) { if (!e) { handle_send_success(); }else { handle_send_error(); } }
/** * Send data to the fdholder. * * No direct error result is provided; the fdholder state is updated as needed. */ PUBLIC void r_io_send(struct ccnr_handle *h, struct fdholder *fdholder, const void *data, size_t size, off_t *offsetp) { ssize_t res; off_t offset = -1; if (offsetp != NULL) *offsetp = (off_t)-1; if ((fdholder->flags & CCNR_FACE_NOSEND) != 0) return; if (fdholder->outbuf != NULL) { ccn_charbuf_append(fdholder->outbuf, data, size); return; } if (fdholder == h->face0) { ccnr_meter_bump(h, fdholder->meter[FM_BYTO], size); ccn_dispatch_message(h->internal_client, (void *)data, size); r_dispatch_process_internal_client_buffer(h); return; } if ((fdholder->flags & CCNR_FACE_CCND) != 0) { /* Writes here need to go via the direct client's handle. */ ccnr_meter_bump(h, fdholder->meter[FM_BYTO], size); res = ccn_put(h->direct_client, data, size); if (res < 0 && CCNSHOULDLOG(h, r_io_send, CCNL_WARNING)) ccnr_msg(h, "ccn_put failed"); if (res == 1 && CCNSHOULDLOG(h, r_io_send, CCNL_FINEST)) ccnr_msg(h, "ccn_put deferred output for later send"); return; } if ((fdholder->flags & CCNR_FACE_REPODATA) != 0) { offset = lseek(fdholder->filedesc, 0, SEEK_END); if (offset == (off_t)-1) { ccnr_msg(h, "lseek(%d): %s", fdholder->filedesc, strerror(errno)); return; } if (offsetp != NULL) *offsetp = offset; if (fdholder->filedesc == h->active_out_fd) { if (offset != h->stable && h->stable != 0) ccnr_msg(h, "expected file size %ju, found %ju", (uintmax_t)h->stable, (uintmax_t)offset); h->stable = offset + size; } } if ((fdholder->flags & CCNR_FACE_DGRAM) == 0) res = write(fdholder->filedesc, data, size); else res = sendto(sending_fd(h, fdholder), data, size, 0, (struct sockaddr *)fdholder->name->buf, fdholder->name->length); if (res > 0) ccnr_meter_bump(h, fdholder->meter[FM_BYTO], res); if (res == size) return; if (res == -1) { res = handle_send_error(h, errno, fdholder, data, size); if (res == -1) return; } if ((fdholder->flags & CCNR_FACE_DGRAM) != 0) { ccnr_msg(h, "sendto short"); return; } if ((fdholder->flags & CCNR_FACE_REPODATA) != 0) { // need to truncate back to last known good object then exit. ccnr_msg(h, "Unrecoverable write error writing to repository. Content NOT stored."); ftruncate(fdholder->filedesc, offset); h->running = 0; return; } fdholder->outbufindex = 0; fdholder->outbuf = ccn_charbuf_create(); if (fdholder->outbuf == NULL) { ccnr_msg(h, "do_write: %s", strerror(errno)); return; } ccn_charbuf_append(fdholder->outbuf, ((const unsigned char *)data) + res, size - res); }