uint64_t *auxv;
uint32_t auxv_size;
uint32_t exe_fd;
-};
+};
#endif
#ifndef O_PATH
fclose(f);
return n;
}
+
+void *lxc_mmap(void *addr, size_t length, int prot, int flags, int fd,
+ off_t offset)
+{
+ void *tmp = NULL, *overlap = NULL;
+
+ /* We establish an anonymous mapping that is one byte larger than the
+ * underlying file. The pages handed to us are zero filled. */
+ tmp = mmap(addr, length + 1, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (tmp == MAP_FAILED)
+ goto out;
+
+ /* Now we establish a fixed-address mapping starting at the address we
+ * received from our anonymous mapping and replace all bytes excluding
+ * the additional \0-byte with the file. This allows us to use normal
+ * string-handling function. */
+ overlap = mmap(tmp, length, prot, MAP_FIXED | flags, fd, offset);
+ if (overlap == MAP_FAILED)
+ goto out;
+
+out:
+ return overlap;
+}
+
+int lxc_munmap(void *addr, size_t length)
+{
+ return munmap(addr, length + 1);
+}
extern size_t lxc_array_len(void **array);
extern void **lxc_append_null_to_array(void **array, size_t count);
+
+/* mmap() wrapper. lxc_mmap() will take care to \0-terminate files so that
+ * normal string-handling functions can be used on the buffer. */
+extern void *lxc_mmap(void *addr, size_t length, int prot, int flags, int fd,
+ off_t offset);
+/* munmap() wrapper. Use it to free memory mmap()ed with lxc_mmap(). */
+extern int lxc_munmap(void *addr, size_t length);
+
//initialize rand with urandom
extern int randseed(bool);