[PATCH v7 02/45] wrapper: implement xfopen()
- From
Paul Tan <pyokagan@gmail.com>
- Date
- Aug 4, 2015, 13:51 UTC
- Message-ID
- <1438696326-19590-3-git-send-email-pyokagan@gmail.com>
- In-Reply-To
- <1438696326-19590-1-git-send-email-pyokagan@gmail.com>
A common usage pattern of fopen() is to check if it succeeded, and die() if it failed:
FILE *fp = fopen(path, "w");
if (!fp)
die_errno(_("could not open '%s' for writing"), path);Implement a wrapper function xfopen() for the above, so that we can save a few lines of code and make the die() messages consistent.
Helped-by: Jeff King <peff@peff.net> Helped-by: Johannes Schindelin <johannes.schindelin@gmx.de> Helped-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Paul Tan <pyokagan@gmail.com> --- git-compat-util.h | 1 + wrapper.c | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+)
diff --git a/git-compat-util.h b/git-compat-util.h index e168dfd..392da79 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -722,6 +722,7 @@ extern ssize_t xread(int fd, void *buf, size_t len); extern ssize_t xwrite(int fd, const void *buf, size_t len); extern ssize_t xpread(int fd, void *buf, size_t len, off_t offset); extern int xdup(int fd); +extern FILE *xfopen(const char *path, const char *mode); extern FILE *xfdopen(int fd, const char *mode); extern int xmkstemp(char *template); extern int xmkstemp_mode(char *template, int mode); diff --git a/wrapper.c b/wrapper.c index 0a4502d..e451463 100644 --- a/wrapper.c +++ b/wrapper.c @@ -346,6 +346,27 @@ int xdup(int fd) return ret; } +/** + * xfopen() is the same as fopen(), but it die()s if the fopen() fails. + */ +FILE *xfopen(const char *path, const char *mode) +{ + for (;;) { + FILE *fp = fopen(path, mode); + if (fp) + return fp; + if (errno == EINTR) + continue; + + if (*mode && mode[1] == '+') + die_errno(_("could not open '%s' for reading and writing"), path); + else if (*mode == 'w' || *mode == 'a') + die_errno(_("could not open '%s' for writing"), path); + else + die_errno(_("could not open '%s' for reading"), path); + } +} + FILE *xfdopen(int fd, const char *mode) { FILE *stream = fdopen(fd, mode);
-- 2.5.0.280.gd88bd6e