diff Python/pythonrun.c @ 16560:e8e636cc1a09 legacy-trunk

Ugly fix for SF bug 131239 (-x flag busted). Bug was introduced by tricks played to make .pyc files executable via cmdline arg. Then again, -x worked via a trick to begin with. If anyone can think of a portable way to test -x, be my guest!
author Tim Peters <tim.peters@gmail.com>
date Sun, 11 Feb 2001 04:35:39 +0000
parents aa844711463a
children a51b9961f3bb
line wrap: on
line diff
--- a/Python/pythonrun.c	Sun Feb 11 01:26:28 2001 +0000
+++ b/Python/pythonrun.c	Sun Feb 11 04:35:39 2001 +0000
@@ -578,10 +578,21 @@
 		   be read as they are on disk. */
 		unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
 		unsigned char buf[2];
-		if (fread(buf, 1, 2, fp) == 2
-		    && ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
-			return 1;
-		fseek(fp, 0, SEEK_SET);
+		/* Mess:  In case of -x, the stream is NOT at its start now,
+		   and ungetc() was used to push back the first newline,
+		   which makes the current stream position formally undefined
+		   until that newline is read back.  So first we getc(), so
+		   that ftell() is well-defined.
+		*/
+		const int maybepushedback = getc(fp);
+		const long currentpos = ftell(fp);
+		int ispyc = 0;
+		rewind(fp);
+		ispyc = fread(buf, 1, 2, fp) == 2 &&
+		        ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic;
+		fseek(fp, currentpos, SEEK_SET);
+		ungetc(maybepushedback, fp);
+		return ispyc;
 	}
 	return 0;
 }