static int smack_backend_read(struct smack_backend *s, void *state, struct dnet_cmd *cmd, void *iodata) { struct dnet_io_attr *io = iodata; char *data; struct index idx; int err; dnet_convert_io_attr(io); smack_setup_idx(&idx, io->id); idx.data_size = io->size; err = smack_read(s->smack, &idx, &data); if (err < 0) goto err_out_exit; io->size = idx.data_size; err = dnet_send_read_data(state, cmd, io, data, -1, io->offset, 0); if (err) goto err_out_free; err_out_free: free(data); err_out_exit: return err; }
int ell::honest_command_handler_adaptee::file_read(module_backend_t */*r*/, void *state, dnet_cmd *cmd, void *data) { const std::string key(dnet_cmd2string(cmd->id)); const std::string result = m_uncomplicated_handler->read(key); dnet_io_attr *io = static_cast<dnet_io_attr *>(data); io->size = result.size(); return dnet_send_read_data(state, cmd, io, (void *)result.data(), -1, io->offset, 0); }
static int leveldb_backend_read(struct leveldb_backend *s, void *state, struct dnet_cmd *cmd, void *iodata, int last) { struct dnet_io_attr *io = iodata; struct dnet_ext_list elist; char *data; size_t data_size; int err = -EINVAL; char *error_string = NULL; dnet_ext_list_init(&elist); dnet_convert_io_attr(io); if (io->size || io->offset) { err = -ERANGE; goto err_out_exit; } data = leveldb_get(s->db, s->roptions, (const char *)io->id, DNET_ID_SIZE, &data_size, &error_string); if (error_string || !data) { if (!data) err = -ENOENT; goto err_out_exit; } /* Extract original data and extension list from &data */ err = dnet_ext_list_extract((void *)&data, (uint64_t *)&data_size, &elist, DNET_EXT_FREE_ON_DESTROY); if (err != 0) goto err_out_exit; dnet_ext_list_to_io(&elist, io); io->size = data_size; if (data_size && data && last) cmd->flags &= ~DNET_FLAGS_NEED_ACK; err = dnet_send_read_data(state, cmd, io, data, -1, io->offset, 0); if (err < 0) goto err_out_exit; dnet_backend_log(DNET_LOG_NOTICE, "%s: leveldb: : READ: Ok: size: %llu.\n", dnet_dump_id(&cmd->id), (unsigned long long)io->size); err_out_exit: dnet_ext_list_destroy(&elist); if (err < 0) dnet_backend_log(DNET_LOG_ERROR, "%s: leveldb: READ: error: %s: %d\n", dnet_dump_id(&cmd->id), error_string, err); free(error_string); return err; }