diff --git a/include/cutils/native_handle.h b/include/cutils/native_handle.h index 31695cb48..813dadc7c 100644 --- a/include/cutils/native_handle.h +++ b/include/cutils/native_handle.h @@ -56,6 +56,15 @@ int native_handle_close(const native_handle_t* h); */ native_handle_t* native_handle_create(int numFds, int numInts); +/* + * native_handle_clone + * + * creates a native_handle_t and initializes it from another native_handle_t. + * Must be destroyed with native_handle_delete(). + * + */ +native_handle_t* native_handle_clone(const native_handle_t* handle); + /* * native_handle_delete * diff --git a/libcutils/native_handle.c b/libcutils/native_handle.c index 7f3479d3a..cae146d45 100644 --- a/libcutils/native_handle.c +++ b/libcutils/native_handle.c @@ -44,6 +44,27 @@ native_handle_t* native_handle_create(int numFds, int numInts) return h; } +native_handle_t* native_handle_clone(const native_handle_t* handle) +{ + native_handle_t* clone = native_handle_create(handle->numFds, handle->numInts); + int i; + + for (i = 0; i < handle->numFds; i++) { + clone->data[i] = dup(handle->data[i]); + if (clone->data[i] < 0) { + clone->numFds = i; + native_handle_close(clone); + native_handle_delete(clone); + return NULL; + } + } + + memcpy(&clone->data[handle->numFds], &handle->data[handle->numFds], + sizeof(int) * handle->numInts); + + return clone; +} + int native_handle_delete(native_handle_t* h) { if (h) {