PERFORCE change 229959 for review

John Baldwin jhb at FreeBSD.org
Wed Jun 19 16:12:39 UTC 2013


http://p4web.freebsd.org/@@229959?ac=10

Change 229959 by jhb at jhb_jhbbsd on 2013/06/19 16:12:00

	Cope with Perl's misbehavior.  The PERL_CORE hack isn't really
	suitable though and I should replace that by adding a fdisown().

Affected files ...

.. //depot/projects/stdio_file/include/stdio.h#3 edit
.. //depot/projects/stdio_file/lib/libc/stdio/Makefile.inc#2 edit
.. //depot/projects/stdio_file/lib/libc/stdio/Symbol.map#3 edit
.. //depot/projects/stdio_file/lib/libc/stdio/fclose.c#3 edit

Differences ...

==== //depot/projects/stdio_file/include/stdio.h#3 (text+ko) ====

@@ -144,7 +144,10 @@
 	int	_fl_count;	/* recursive lock count */
 	int	_orientation;	/* orientation for fwide() */
 	__mbstate_t _mbstate;	/* multibyte conversion state */
+/* XXX: PERL_CORE is a temporary hack. */
+#if defined(STDIO_INTERNALS) || defined(PERL_CORE)
 	int	_file;		/* fileno, if Unix descriptor, else -1 */
+#endif
 };
 #ifndef _STDFILE_DECLARED
 #define _STDFILE_DECLARED

==== //depot/projects/stdio_file/lib/libc/stdio/Makefile.inc#2 (text+ko) ====

@@ -4,6 +4,8 @@
 # stdio sources
 .PATH: ${.CURDIR}/stdio
 
+CFLAGS+= -DSTDIO_INTERNALS
+
 SRCS+=	_flock_stub.c asprintf.c clrerr.c dprintf.c \
 	fclose.c fcloseall.c fdopen.c \
 	feof.c ferror.c fflush.c fgetc.c fgetln.c fgetpos.c fgets.c fgetwc.c \

==== //depot/projects/stdio_file/lib/libc/stdio/Symbol.map#3 (text) ====

@@ -8,7 +8,6 @@
 	funlockfile;
 	asprintf;
 	clearerr;
-	fclose;
 	fcloseall;
 	feof;
 	ferror;
@@ -115,6 +114,7 @@
 };
 
 FBSD_1.3 {
+	fclose;
 	fdopen;
 	fopen;
 	freopen;

==== //depot/projects/stdio_file/lib/libc/stdio/fclose.c#3 (text+ko) ====

@@ -84,3 +84,20 @@
 	FUNLOCKFILE(fp);
 	return (r);
 }
+
+int
+fclose_ofile(FILE *fp)
+{
+
+	/*
+	 * Older versions of Perl used to set _file to -1 directly
+	 * to prevent the underlying fd from being closed.  Detect
+	 * this by looking for a mismatch between _ofile and _file
+	 * and force _file to -1 if _ofile is -1.
+	 */
+	if (fp->_ofile != fp->_file)
+		fp->_file = fp->_ofile;
+	return (fclose(fp));
+}
+
+__sym_compat(fclose, fclose_ofile, FBSD_1.0);


More information about the p4-projects mailing list