set errno for fvprintf, fvwrite (wbuf)

ibotty bsd at ibotty.net
Wed Mar 3 09:44:24 PST 2004


jordan k. hubbard pointed out, that somewhen errno was not set, when a FILE
* is not writable. [1]

attached patch fixes this for a few more more libc functions.
i added a comment, that indicates, why this errno and not a more logical one
is chosen. (according to followup of [1])

[1] http://docs.freebsd.org/cgi/getmsg.cgi?fetch=178661+0+current
freebsd-hackers

~ibotty

btw: i removed K&R style methods and register keywords, when i came across.Index: fvwrite.c
===================================================================
RCS file: /home/src/dcvs/src/lib/libc/stdio/fvwrite.c,v
retrieving revision 1.2
diff -u -3 -p -r1.2 fvwrite.c
--- fvwrite.c	17 Jun 2003 04:26:46 -0000	1.2
+++ fvwrite.c	3 Mar 2004 16:48:46 -0000
@@ -41,6 +41,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <errno.h>
 #include "local.h"
 #include "fvwrite.h"
 
@@ -51,22 +52,23 @@
  * to the three different kinds of output buffering is handled here.
  */
 int
-__sfvwrite(fp, uio)
-	register FILE *fp;
-	register struct __suio *uio;
+__sfvwrite(FILE *fp, struct __suio *uio)
 {
-	register size_t len;
-	register char *p;
-	register struct __siov *iov;
-	register int w, s;
+	size_t len;
+	char *p;
+	struct __siov *iov;
+	int w, s;
 	char *nl;
 	int nlknown, nldist;
 
 	if ((len = uio->uio_resid) == 0)
 		return (0);
 	/* make sure we can write */
-	if (cantwrite(fp))
+	if (cantwrite(fp)) {
+		/* use EBADF, not EACCES, because of POSIX */
+		errno = EBADF;
 		return (EOF);
+	}
 
 #define	MIN(a, b) ((a) < (b) ? (a) : (b))
 #define	COPY(n)	  (void)memcpy((void *)fp->_p, (void *)p, (size_t)(n))
Index: vfprintf.c
===================================================================
RCS file: /home/src/dcvs/src/lib/libc/stdio/vfprintf.c,v
retrieving revision 1.3
diff -u -3 -p -r1.3 vfprintf.c
--- vfprintf.c	12 Nov 2003 20:21:25 -0000	1.3
+++ vfprintf.c	3 Mar 2004 16:48:10 -0000
@@ -50,6 +50,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <errno.h>
 
 #if __STDC__
 #include <stdarg.h>
@@ -408,6 +409,8 @@ vfprintf(FILE *fp, const char *fmt0, va_
 	/* sorry, fprintf(read_only_file, "") returns EOF, not 0 */
 	if (cantwrite(fp)) {
 		FUNLOCKFILE(fp);
+		/* EBADF instead of EACCES because of POSIX */
+		errno = EBADF;
 		return (EOF);
 	}
 
Index: wbuf.c
===================================================================
RCS file: /home/src/dcvs/src/lib/libc/stdio/wbuf.c,v
retrieving revision 1.2
diff -u -3 -p -r1.2 wbuf.c
--- wbuf.c	17 Jun 2003 04:26:46 -0000	1.2
+++ wbuf.c	3 Mar 2004 16:55:03 -0000
@@ -47,11 +47,9 @@
  * or if c=='\n' and the file is line buffered.
  */
 int
-__swbuf(c, fp)
-	register int c;
-	register FILE *fp;
+__swbuf(int c, FILE *fp)
 {
-	register int n;
+	int n;
 
 	/*
 	 * In case we cannot write, or longjmp takes us out early,
@@ -61,8 +59,11 @@ __swbuf(c, fp)
 	 * calls might wrap _w from negative to positive.
 	 */
 	fp->_w = fp->_lbfsize;
-	if (cantwrite(fp))
+	if (cantwrite(fp)) {
+		/* EBADF instead of EACCES because of POSIX */
+		errno = EBADF;
 		return (EOF);
+	}
 	c = (unsigned char)c;
 
 	/*




More information about the Submit mailing list