Commit b2def1c8 authored by Rusty Russell's avatar Rusty Russell

Add fclose_noerr()

parent d4aa9aa3
...@@ -15,6 +15,19 @@ int close_noerr(int fd) ...@@ -15,6 +15,19 @@ int close_noerr(int fd)
return ret; return ret;
} }
int fclose_noerr(FILE *fp)
{
int saved_errno = errno, ret;
if (fclose(fp) != 0)
ret = errno;
else
ret = 0;
errno = saved_errno;
return ret;
}
int unlink_noerr(const char *pathname) int unlink_noerr(const char *pathname)
{ {
int saved_errno = errno, ret; int saved_errno = errno, ret;
......
#ifndef NOERR_H #ifndef NOERR_H
#define NOERR_H #define NOERR_H
#include <stdio.h>
/** /**
* close_noerr - close without stomping errno. * close_noerr - close without stomping errno.
...@@ -10,6 +11,15 @@ ...@@ -10,6 +11,15 @@
*/ */
int close_noerr(int fd); int close_noerr(int fd);
/**
* fclose_noerr - close without stomping errno.
* @fp: the FILE pointer.
*
* errno is saved and restored across the call to fclose: if an error occurs,
* the resulting (non-zero) errno is returned.
*/
int fclose_noerr(FILE *fp);
/** /**
* unlink_noerr - unlink a file without stomping errno. * unlink_noerr - unlink a file without stomping errno.
* @pathname: the path to unlink. * @pathname: the path to unlink.
......
...@@ -12,8 +12,9 @@ int main(int argc, char *argv[]) ...@@ -12,8 +12,9 @@ int main(int argc, char *argv[])
/* tempnam(3) is generally a bad idea, but OK here. */ /* tempnam(3) is generally a bad idea, but OK here. */
char *name = tempnam(NULL, "noerr"); char *name = tempnam(NULL, "noerr");
int fd; int fd;
FILE *fp;
plan_tests(12); plan_tests(15);
/* Should fail to unlink. */ /* Should fail to unlink. */
ok1(unlink(name) != 0); ok1(unlink(name) != 0);
ok1(errno == ENOENT); ok1(errno == ENOENT);
...@@ -44,5 +45,19 @@ int main(int argc, char *argv[]) ...@@ -44,5 +45,19 @@ int main(int argc, char *argv[])
ok1(unlink_noerr(name) == 0); ok1(unlink_noerr(name) == 0);
ok1(errno == 100); ok1(errno == 100);
/* Test failing fclose */
fp = fopen(name, "wb");
assert(fp);
close(fileno(fp));
ok1(fclose_noerr(fp) == EBADF);
/* Test successful fclose */
fp = fopen(name, "wb");
assert(fp);
errno = 100;
ok1(fclose_noerr(fp) == 0);
ok1(errno == 100);
return exit_status(); return exit_status();
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment