static bool on_err_read(void *data, int fd, uint32_t active_flags) { struct subprocess_data *mdata = data; struct sol_blob *blob = NULL; bool eof = true; int err = 0; if (active_flags & SOL_FD_FLAGS_ERR) err = -EBADF; else err = child_read(&blob, &eof, mdata->pipes.err[0]); if (eof || err < 0) { mdata->watches.err = NULL; if (err < 0) return false; } sol_flow_send_blob_packet(mdata->node, SOL_FLOW_NODE_TYPE_PROCESS_SUBPROCESS__OUT__STDERR, blob); sol_blob_unref(blob); if (eof) return false; return true; }
static int file_reader_load(struct file_reader_data *mdata) { struct sol_file_reader *reader; struct sol_str_slice slice; if (!mdata->path) return 0; reader = sol_file_reader_open(mdata->path); if (!reader) { sol_flow_send_error_packet(mdata->node, errno, "Could not load \"%s\": %s", mdata->path, sol_util_strerrora(errno)); return -errno; } slice = sol_file_reader_get_all(reader); SOL_DBG("loaded path=\"%s\", data=%p, len=%zd", mdata->path, slice.data, slice.len); mdata->reader_blob = sol_blob_new(&file_reader_blob_type, NULL, reader, sizeof(reader)); SOL_NULL_CHECK_GOTO(mdata->reader_blob, err_reader); mdata->content_blob = sol_blob_new(SOL_BLOB_TYPE_NOFREE, mdata->reader_blob, slice.data, slice.len); SOL_NULL_CHECK_GOTO(mdata->content_blob, err_content); return sol_flow_send_blob_packet(mdata->node, SOL_FLOW_NODE_TYPE_FILE_READER__OUT__OUT, mdata->content_blob); err_content: sol_blob_unref(mdata->reader_blob); err_reader: sol_file_reader_close(reader); return -ENOMEM; }