[PATCH 1/3] cld: Create cldc_call_opts_get_data API for GET
Create the cldc_call_opts_get_data API. This allows users of the async CLD api
to access the GET buffer returned from CLD without playing with parts of the
cld_call_opts marked 'private, lib-owned.'
Signed-off-by: Colin McCabe <cmccabe@xxxxxxxxxxxxxx>
---
include/cldc.h | 2 ++
lib/cldc.c | 7 +++++++
test/load-file-event.c | 7 +++++--
tools/cldcli.c | 23 ++++++++++++++++-------
4 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/include/cldc.h b/include/cldc.h
index 0f4242e..afcba71 100644
--- a/include/cldc.h
+++ b/include/cldc.h
@@ -209,6 +209,8 @@ extern int cldc_dirent_next(struct cld_dirent_cur *dc);
extern void cldc_dirent_cur_init(struct cld_dirent_cur *dc, const void *buf, size_t buflen);
extern void cldc_dirent_cur_fini(struct cld_dirent_cur *dc);
extern char *cldc_dirent_name(struct cld_dirent_cur *dc);
+extern void cldc_call_opts_get_data(const struct cldc_call_opts *copts,
+ const char **data, size_t *data_len);
/* cldc-udp */
extern void cldc_udp_free(struct cldc_udp *udp);
diff --git a/lib/cldc.c b/lib/cldc.c
index 50f102f..56070e2 100644
--- a/lib/cldc.c
+++ b/lib/cldc.c
@@ -1308,6 +1308,13 @@ char *cldc_dirent_name(struct cld_dirent_cur *dc)
return s;
}
+void cldc_call_opts_get_data(const struct cldc_call_opts *copts,
+ const char **data, size_t *data_len)
+{
+ *data = copts->u.get.buf;
+ *data_len = copts->u.get.size;
+}
+
/*
* For extra safety, call cldc_init after g_thread_init, if present.
* Currently we just call srand(), but since we use GLib, we may need
diff --git a/test/load-file-event.c b/test/load-file-event.c
index 94e0421..477cad8 100644
--- a/test/load-file-event.c
+++ b/test/load-file-event.c
@@ -147,18 +147,21 @@ static int read_1_cb(struct cldc_call_opts *coptarg, enum cle_err_codes errc)
struct run *rp = coptarg->private;
struct cldc_call_opts copts;
int rc;
+ const char *data;
+ size_t data_len;
if (errc != CLE_OK) {
fprintf(stderr, "first-get failed: %d\n", errc);
exit(1);
}
- if (coptarg->u.get.size != TESTLEN) {
+ cldc_call_opts_get_data(coptarg, &data, &data_len);
+ if (data_len != TESTLEN) {
fprintf(stderr, "Bad CLD file length %d\n", coptarg->u.get.size);
exit(1);
}
- if (memcmp(coptarg->u.get.buf, TESTSTR, TESTLEN)) {
+ if (memcmp(data, TESTSTR, TESTLEN)) {
fprintf(stderr, "Bad CLD file content\n");
exit(1);
}
diff --git a/tools/cldcli.c b/tools/cldcli.c
index c4735d0..567a5c5 100644
--- a/tools/cldcli.c
+++ b/tools/cldcli.c
@@ -217,6 +217,8 @@ static int cb_ls_2(struct cldc_call_opts *copts_in, enum cle_err_codes errc)
struct cldc_call_opts copts = { NULL, };
struct cld_dirent_cur dc;
int rc, i;
+ const char *data;
+ size_t data_len;
bool first = true;
if (errc != CLE_OK) {
@@ -224,8 +226,9 @@ static int cb_ls_2(struct cldc_call_opts *copts_in, enum cle_err_codes errc)
write_from_thread(&cresp, sizeof(cresp));
return 0;
}
+ cldc_call_opts_get_data(copts_in, &data, &data_len);
- rc = cldc_dirent_count(copts_in->u.get.buf, copts_in->u.get.size);
+ rc = cldc_dirent_count(data, data_len);
if (rc < 0) {
write_from_thread(&cresp, sizeof(cresp));
return 0;
@@ -236,7 +239,7 @@ static int cb_ls_2(struct cldc_call_opts *copts_in, enum cle_err_codes errc)
write_from_thread(&cresp, sizeof(cresp));
- cldc_dirent_cur_init(&dc, copts_in->u.get.buf, copts_in->u.get.size);
+ cldc_dirent_cur_init(&dc, data, data_len);
for (i = 0; i < rc; i++) {
struct ls_rec lsr;
@@ -294,6 +297,8 @@ static int cb_cat_2(struct cldc_call_opts *copts_in, enum cle_err_codes errc)
{
struct cresp cresp = { .tcode = TC_FAILED, };
struct cldc_call_opts copts = { NULL, };
+ const char *data;
+ size_t data_len;
if (errc != CLE_OK) {
errc_msg(&cresp, errc);
@@ -301,11 +306,13 @@ static int cb_cat_2(struct cldc_call_opts *copts_in, enum cle_err_codes errc)
return 0;
}
+ cldc_call_opts_get_data(copts_in, &data, &data_len);
+
cresp.tcode = TC_OK;
- cresp.u.file_len = copts_in->u.get.size;
+ cresp.u.file_len = data_len;
write_from_thread(&cresp, sizeof(cresp));
- write_from_thread(copts_in->u.get.buf, copts_in->u.get.size);
+ write_from_thread(data, data_len);
/* FIXME: race; should wait until close succeeds/fails before
* returning any data. 'fh' may still be in use, otherwise.
@@ -338,18 +345,20 @@ static int cb_cp_cf_2(struct cldc_call_opts *copts_in, enum cle_err_codes errc)
{
struct cresp cresp = { .tcode = TC_FAILED, };
struct cldc_call_opts copts = { NULL, };
+ const char *data;
+ size_t data_len;
if (errc != CLE_OK) {
errc_msg(&cresp, errc);
write_from_thread(&cresp, sizeof(cresp));
return 0;
}
-
+ cldc_call_opts_get_data(copts_in, &data, &data_len);
cresp.tcode = TC_OK;
- cresp.u.file_len = copts_in->u.get.size;
+ cresp.u.file_len = data_len;
write_from_thread(&cresp, sizeof(cresp));
- write_from_thread(copts_in->u.get.buf, copts_in->u.get.size);
+ write_from_thread(data, data_len);
/* FIXME: race; should wait until close succeeds/fails before
* returning any data. 'fh' may still be in use, otherwise.
--
1.6.2.5
--
To unsubscribe from this list: send the line "unsubscribe hail-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
[Linux USB Devel]
[Video for Linux]
[Linux Audio Users]
[Photo]
[Yosemite News]
[Yosemite Photos]
[Free Online Dating]
[Linux Kernel]
[Linux SCSI]
[XFree86]