static void trigger_writer ( const char *filename, struct logz_file_def *filedef) { vmbuf_reset(&write_buffer); ssize_t res; char *fn = basename(ribs_strdup(filename)); while(1) { vmbuf_reset(&write_buffer); res = read(filedef->fd, vmbuf_wloc(&write_buffer), (BUFSIZ + 1024) &~ 1024); filedef->size += res; lseek (filedef->fd, filedef->size, SEEK_SET); if (0 > vmbuf_wseek(&write_buffer, res)) { LOGGER_ERROR("%s", "wseek error"); break; } else if (0 > res) { LOGGER_ERROR("%s", "read error"); // EAGAIN is handled by poller break; } else if (0 < res) { // initial sanitizer vmbuf_chrcpy(&write_buffer, '\0'); // kill garbage char *data = ribs_strdup(vmbuf_data(&write_buffer)); //data = strchr(data, '\n') + 1; // skip broken data from initial buffer start. we read from where the file was first observed ssize_t write_depth = res = strlen(data); // line doesn't end here if (data[res - 1] != '\n') { char *datafringe = ribs_strdup((char *)memrchr(data, '\n', res)); if (SSTRISEMPTY(datafringe)) break; write_depth = strlen(data) - strlen(datafringe); *(data + write_depth) = 0; if (filedef->size != 0) { char *rebalanced_data = write_file_fringe(fn, data, filedef->fd); if (NULL != rebalanced_data) { data = rebalanced_data; write_depth = strlen(data); } } thashtable_rec_t *rec = thashtable_lookup(delta_push, &filedef->fd, sizeof(filedef->fd)); struct vmbuf kdelta = *(struct vmbuf *)thashtable_get_val(rec); vmbuf_strcpy(&kdelta, datafringe); vmbuf_chrcpy(&kdelta, '\0'); } vmbuf_reset(&write_buffer); vmbuf_memcpy(&write_buffer, data, write_depth); vmbuf_chrcpy(&write_buffer, '\0'); write_out_stream(fn, ribs_strdup(vmbuf_data(&write_buffer))); } else if (0 == res) { break; } } }
int http_client_pool_post_request_send(struct http_client_context *context, struct vmbuf *post_data) { size_t size = vmbuf_wlocpos(post_data); vmbuf_sprintf(&context->request, "\r\nContent-Length: %zu\r\n\r\n", size); // TODO: use writev instead of copying vmbuf_memcpy(&context->request, vmbuf_data(post_data), size); if (0 > http_client_send_request(context)) { http_client_free(context); return -1; } return 0; }
static int http_client_pool_post_request2( struct http_client_pool *http_client_pool, struct in_addr addr, uint16_t port, const char *hostname, const char *data, size_t size_of_data, const char *format, ...) { struct http_client_context *cctx = http_client_pool_create_client2(http_client_pool, addr, port, hostname, NULL); if (NULL == cctx) return -1; vmbuf_reset(&cctx->request); vmbuf_strcpy(&cctx->request, "POST "); va_list ap; va_start(ap, format); vmbuf_vsprintf(&cctx->request, format, ap); va_end(ap); vmbuf_sprintf(&cctx->request, " HTTP/1.1\r\nHost: %s\r\nContent-Type: application/json\r\nContent-Length: %zu\r\n\r\n", hostname, size_of_data); vmbuf_memcpy(&cctx->request, data, size_of_data); vmbuf_chrcpy(&cctx->request, '\0'); if (0 > http_client_send_request(cctx)) return http_client_free(cctx), -1; return 0; }