From cd5cfb4c2dbbf5615c78d1e439f0cbfb08437b43 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sun, 15 Feb 2015 16:42:05 +0100 Subject: [PATCH] Simplify and rename mmap_full_file(). There is only one caller which maps the file privately into read-only memory. Moreover, this caller does not care about the file descriptor from which the mapping was created. This commit removes the argument from mmap_full_file() which control the type of the map and the result pointer for the file descriptor, thereby simplifying the function slightly. Rename it to mmap_file_ro() to indicate that read-only private mappings are implied. --- fd.c | 32 +++++++++----------------------- fd.h | 3 +-- user.c | 2 +- 3 files changed, 11 insertions(+), 26 deletions(-) diff --git a/fd.c b/fd.c index 7984356..9fe8867 100644 --- a/fd.c +++ b/fd.c @@ -199,36 +199,25 @@ int adu_fchdir(int fd) } /** - * Open a file and map it into memory. + * Open a file read-only and map it into memory. * * \param path Name of the regular file to map. - * \param open_mode Either \p O_RDONLY or \p O_RDWR. * \param map On success, the mapping is returned here. - * \param size size of the mapping. - * \param fd_ptr The file descriptor of the mapping. + * \param size Result parameter: size of the mapping in bytes. * - * If \a fd_ptr is \p NULL, the file descriptor resulting from the underlying - * open call is closed after mmap(). Otherwise the file is kept open and the - * file descriptor is returned in \a fd_ptr. + * The file will be mapped privately with memory protection PROT_READ. The file + * descriptor resulting from the underlying open call is closed after mmap(). * * \return Standard. * * \sa mmap(2). */ -int mmap_full_file(const char *path, int open_mode, void **map, - size_t *size, int *fd_ptr) +int mmap_file_ro(const char *path, void **map, size_t *size) { - int fd, ret, mmap_prot, mmap_flags; + int fd, ret; struct stat file_status; - if (open_mode == O_RDONLY) { - mmap_prot = PROT_READ; - mmap_flags = MAP_PRIVATE; - } else { - mmap_prot = PROT_READ | PROT_WRITE; - mmap_flags = MAP_SHARED; - } - ret = __open(path, open_mode, 0); + ret = __open(path, O_RDONLY, 0); if (ret < 0) return ret; fd = ret; @@ -241,7 +230,7 @@ int mmap_full_file(const char *path, int open_mode, void **map, DEBUG_LOG("%s: size %zu\n", path, *size); if (!*size) goto out; - *map = mmap(NULL, *size, mmap_prot, mmap_flags, fd, 0); + *map = mmap(NULL, *size, PROT_READ, MAP_PRIVATE, fd, 0); if (*map == MAP_FAILED) { *map = NULL; ret = -E_MMAP; @@ -249,10 +238,7 @@ int mmap_full_file(const char *path, int open_mode, void **map, } ret = 1; out: - if (ret < 0 || !fd_ptr) - close(fd); - else - *fd_ptr = fd; + close(fd); return ret; } diff --git a/fd.h b/fd.h index 1089932..a3d1d9d 100644 --- a/fd.h +++ b/fd.h @@ -8,8 +8,7 @@ int adu_opendir(const char *dirname, DIR **dir, int *cwd); int adu_fchdir(int fd); -int mmap_full_file(const char *filename, int open_mode, void **map, - size_t *size, int *fd_ptr); +int mmap_file_ro(const char *filename, void **map, size_t *size); int adu_munmap(void *start, size_t length); int adu_write_file(const char *filename, const void *buf, size_t size); int mkpath(const char *p, mode_t mode); diff --git a/user.c b/user.c index a1513a4..ed16463 100644 --- a/user.c +++ b/user.c @@ -511,7 +511,7 @@ int read_uid_file(void) size_t size; uint32_t n; char *filename = get_uid_list_name(), *map; - int ret = mmap_full_file(filename, O_RDONLY, (void **)&map, &size, NULL); + int ret = mmap_file_ro(filename, (void **)&map, &size); unsigned bits; if (ret < 0) { -- 2.39.5