All the other (similar) API calls behaves this way, aka passing NULL returns
the count.
This patch both provides consistency to calling conventions and
also may make binding's life little easier cause we need to call those function
two times.
First to get the length and then get the data itself. This is required because
we cannot
pass our native data types directly to C world, at least Go can't for now.
Right now a function that returns size only has to do something like that to
free returned array;
int i;
struct lxc_snapshot *s;
int n = c->snapshot_list(c, &s);
if (n < 1)
return 0;
for (i = 0; i < n; i++) {
s[i].free(&s[i]);
}
free(s);
return n;
whereas following should be enough.
return c->snapshot_list(c, NULL);
---
src/lxc/lxccontainer.c | 37 ++++++++++++++++++++-----------------
src/lxc/lxccontainer.h | 4 ++--
2 files changed, 22 insertions(+), 19 deletions(-)
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 6f97879..391e4cd 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -2516,23 +2516,25 @@ static int lxcapi_snapshot_list(struct lxc_container
*c, struct lxc_snapshot **r
}
if (!file_exists(path2))
continue;
- nsnaps = realloc(snaps, (count + 1)*sizeof(*snaps));
- if (!nsnaps) {
- SYSERROR("Out of memory");
- goto out_free;
- }
- snaps = nsnaps;
- snaps[count].free = lxcsnap_free;
- snaps[count].name = strdup(direntp->d_name);
- if (!snaps[count].name)
- goto out_free;
- snaps[count].lxcpath = strdup(snappath);
- if (!snaps[count].lxcpath) {
- free(snaps[count].name);
- goto out_free;
+ if(ret_snaps != NULL) {
+ nsnaps = realloc(snaps, (count + 1)*sizeof(*snaps));
+ if (!nsnaps) {
+ SYSERROR("Out of memory");
+ goto out_free;
+ }
+ snaps = nsnaps;
+ snaps[count].free = lxcsnap_free;
+ snaps[count].name = strdup(direntp->d_name);
+ if (!snaps[count].name)
+ goto out_free;
+ snaps[count].lxcpath = strdup(snappath);
+ if (!snaps[count].lxcpath) {
+ free(snaps[count].name);
+ goto out_free;
+ }
+ snaps[count].comment_pathname =
get_snapcomment_path(snappath, direntp->d_name);
+ snaps[count].timestamp = get_timestamp(snappath,
direntp->d_name);
}
- snaps[count].comment_pathname = get_snapcomment_path(snappath,
direntp->d_name);
- snaps[count].timestamp = get_timestamp(snappath,
direntp->d_name);
count++;
}
@@ -2541,7 +2543,8 @@ static int lxcapi_snapshot_list(struct lxc_container *c,
struct lxc_snapshot **r
WARN("failed to close directory");
process_unlock();
- *ret_snaps = snaps;
+ if (ret_snaps != NULL)
+ *ret_snaps = snaps;
return count;
out_free:
diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h
index 5901066..bb77126 100644
--- a/src/lxc/lxccontainer.h
+++ b/src/lxc/lxccontainer.h
@@ -197,12 +197,12 @@ struct lxc_container {
/*
* snapshot_list() will return a description of all snapshots of c in
- * a simple array. See src/tests/snapshot.c for the proper way to
+ * a simple array, if ret_snaps is not null. See src/tests/snapshot.c
for the proper way to
* free the allocated results.
*
* Returns the number of snapshots.
*/
- int (*snapshot_list)(struct lxc_container *, struct lxc_snapshot **);
+ int (*snapshot_list)(struct lxc_container *c, struct lxc_snapshot
**ret_snaps);
/*
* snapshot_restore() will create a new container based on a snapshot.
--
1.8.1.2
------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60135031&iu=/4140/ostg.clktrk
_______________________________________________
Lxc-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/lxc-devel