static bool on_stdin(void *data, int fd, uint32_t flags) { if (flags & (SOL_FD_FLAGS_ERR | SOL_FD_FLAGS_HUP)) { fprintf(stderr, "ERROR: Something wrong happened with file descriptor: %d\n", fd); goto err; } if (flags & SOL_FD_FLAGS_IN) { int err; value.used = 0; /* this will loop trying to read as much data as possible to buffer. */ err = sol_util_load_file_fd_buffer(fd, &value); if (err < 0) { fprintf(stderr, "ERROR: failed to read from stdin: %s\n", sol_util_strerrora(-err)); goto err; } if (value.used == 0) { /* no data usually means ^D on the terminal, quit the application */ puts("no data on stdin, quitting."); sol_quit(); } else { printf("Now serving %zd bytes:\n--BEGIN--\n%.*s\n--END--\n", value.used, SOL_STR_SLICE_PRINT(sol_buffer_get_slice(&value))); } } return true; err: sol_quit_with_code(EXIT_FAILURE); return false; }
static bool on_stdin(void *data, int fd, uint32_t flags) { uint16_t i; struct sol_http_progressive_response *sse; struct sol_buffer value = SOL_BUFFER_INIT_EMPTY; if (flags & (SOL_FD_FLAGS_ERR | SOL_FD_FLAGS_HUP)) { fprintf(stderr, "ERROR: Something wrong happened with file descriptor: %d\n", fd); goto err; } if (flags & SOL_FD_FLAGS_IN) { int err; struct sol_blob *blob; /* this will loop trying to read as much data as possible to buffer. */ err = sol_util_load_file_fd_buffer(fd, &value); if (err < 0) { fprintf(stderr, "ERROR: failed to read from stdin: %s\n", sol_util_strerrora(-err)); goto err; } if (value.used == 0) { /* no data usually means ^D on the terminal, quit the application */ printf("no data on stdin, quitting.\n"); should_quit = true; SOL_PTR_VECTOR_FOREACH_IDX (&responses, sse, i) sol_http_progressive_response_del(sse, true); goto end; } blob = sol_buffer_to_blob(&value); if (!blob) { fprintf(stderr, "Could not alloc the blob data\n"); goto err; } SOL_PTR_VECTOR_FOREACH_IDX (&responses, sse, i) sol_http_progressive_response_sse_feed(sse, blob); sol_blob_unref(blob); } sol_buffer_fini(&value); return true; err: sol_quit_with_code(EXIT_FAILURE); end: stdin_watch = NULL; sol_buffer_fini(&value); return false; }
SOL_API int sol_util_load_file_buffer(const char *filename, struct sol_buffer *buf) { int fd, r; SOL_NULL_CHECK(filename, -EINVAL); SOL_NULL_CHECK(buf, -EINVAL); fd = open(filename, O_RDONLY | O_CLOEXEC); r = -errno; SOL_INT_CHECK(fd, < 0, r); r = sol_util_load_file_fd_buffer(fd, buf); if (close(fd) < 0 && !r) r = -errno; return r; }
SOL_API struct sol_buffer * sol_util_load_file_fd_raw(int fd) { struct sol_buffer *buf; int r; buf = sol_buffer_new(); SOL_NULL_CHECK(buf, NULL); buf->flags |= SOL_BUFFER_FLAGS_NO_NUL_BYTE; r = sol_util_load_file_fd_buffer(fd, buf); SOL_INT_CHECK_GOTO(r, < 0, err_exit); return buf; err_exit: sol_buffer_free(buf); return NULL; }
SOL_API char * sol_util_load_file_fd_string(int fd, size_t *size) { int r; size_t size_read; char *data = NULL; struct sol_buffer buf = SOL_BUFFER_INIT_EMPTY; r = sol_util_load_file_fd_buffer(fd, &buf); SOL_INT_CHECK_GOTO(r, < 0, err); r = sol_buffer_trim(&buf); SOL_INT_CHECK_GOTO(r, < 0, err); data = sol_buffer_steal(&buf, &size_read); SOL_NULL_CHECK_GOTO(data, err); if (size) *size = size_read; return data; err: if (size) *size = 0; return NULL; }