summaryrefslogtreecommitdiffstats
path: root/libc
diff options
context:
space:
mode:
Diffstat (limited to 'libc')
-rw-r--r--libc/include/android/dlext.h9
-rw-r--r--libc/private/ScopedFd.h59
2 files changed, 67 insertions, 1 deletions
diff --git a/libc/include/android/dlext.h b/libc/include/android/dlext.h
index 90962fa..616e08e 100644
--- a/libc/include/android/dlext.h
+++ b/libc/include/android/dlext.h
@@ -49,11 +49,17 @@ enum {
*/
ANDROID_DLEXT_USE_RELRO = 0x8,
+ /* Instruct dlopen to use library_fd instead of opening file by name.
+ * The filename parameter is still used to identify the library.
+ */
+ ANDROID_DLEXT_USE_LIBRARY_FD = 0x10,
+
/* Mask of valid bits */
ANDROID_DLEXT_VALID_FLAG_BITS = ANDROID_DLEXT_RESERVED_ADDRESS |
ANDROID_DLEXT_RESERVED_ADDRESS_HINT |
ANDROID_DLEXT_WRITE_RELRO |
- ANDROID_DLEXT_USE_RELRO,
+ ANDROID_DLEXT_USE_RELRO |
+ ANDROID_DLEXT_USE_LIBRARY_FD,
};
typedef struct {
@@ -61,6 +67,7 @@ typedef struct {
void* reserved_addr;
size_t reserved_size;
int relro_fd;
+ int library_fd;
} android_dlextinfo;
extern void* android_dlopen_ext(const char* filename, int flag, const android_dlextinfo* extinfo);
diff --git a/libc/private/ScopedFd.h b/libc/private/ScopedFd.h
new file mode 100644
index 0000000..e56c139
--- /dev/null
+++ b/libc/private/ScopedFd.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SCOPED_FD_H
+#define SCOPED_FD_H
+
+#include <unistd.h>
+#include "bionic_macros.h"
+
+// A smart pointer that closes the given fd on going out of scope.
+// Use this when the fd is incidental to the purpose of your function,
+// but needs to be cleaned up on exit.
+class ScopedFd {
+public:
+ explicit ScopedFd(int fd) : fd(fd) {
+ }
+
+ ~ScopedFd() {
+ reset();
+ }
+
+ int get() const {
+ return fd;
+ }
+
+ int release() __attribute__((warn_unused_result)) {
+ int localFd = fd;
+ fd = -1;
+ return localFd;
+ }
+
+ void reset(int new_fd = -1) {
+ if (fd != -1) {
+ TEMP_FAILURE_RETRY(close(fd));
+ }
+ fd = new_fd;
+ }
+
+private:
+ int fd;
+
+ // Disallow copy and assignment.
+ DISALLOW_COPY_AND_ASSIGN(ScopedFd);
+};
+
+#endif // SCOPED_FD_H