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 saved_errno = errno, ret;
#ifndef NOERR_H
#define NOERR_H
+#include <stdio.h>
/**
* close_noerr - close without stomping errno.
*/
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.
* @pathname: the path to unlink.
/* tempnam(3) is generally a bad idea, but OK here. */
char *name = tempnam(NULL, "noerr");
int fd;
+ FILE *fp;
- plan_tests(12);
+ plan_tests(15);
/* Should fail to unlink. */
ok1(unlink(name) != 0);
ok1(errno == ENOENT);
ok1(unlink_noerr(name) == 0);
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();
}