X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=fd.c;fp=fd.c;h=9fe88679d2d88855a27a3486d4646bd1632c965f;hb=cd5cfb4c2dbbf5615c78d1e439f0cbfb08437b43;hp=79843561a73e050bd6a362662b5aff70cd096a30;hpb=031d6a8818a348e0b54d955d2c14705ddc479d31;p=adu.git 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; }