SF bug #887946, segfault if redirecting directory
Also provide a warning if a directory is passed on the command line.
Add minimal command line test.

Will backport.
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
new file mode 100644
index 0000000..fc0c2d2
--- /dev/null
+++ b/Lib/test/test_cmd_line.py
@@ -0,0 +1,50 @@
+
+import test.test_support, unittest
+import sys
+import popen2
+
+class CmdLineTest(unittest.TestCase):
+    def start_python(self, cmd_line):
+        outfp, infp = popen2.popen4('%s %s' % (sys.executable, cmd_line))
+        infp.close()
+        data = outfp.read()
+        outfp.close()
+        return data
+
+    def test_directories(self):
+        self.assertTrue('is a directory' in self.start_python('.'))
+        self.assertTrue('is a directory' in self.start_python('< .'))
+
+    def verify_valid_flag(self, cmd_line):
+        data = self.start_python(cmd_line)
+        self.assertTrue(data.endswith('\n'))
+        self.assertTrue('Traceback' not in data)
+
+    def test_environment(self):
+        self.verify_valid_flag('-E')
+
+    def test_optimize(self):
+        self.verify_valid_flag('-O')
+        self.verify_valid_flag('-OO')
+
+    def test_q(self):
+        self.verify_valid_flag('-Qold')
+        self.verify_valid_flag('-Qnew')
+        self.verify_valid_flag('-Qwarn')
+        self.verify_valid_flag('-Qwarnall')
+
+    def test_site_flag(self):
+        self.verify_valid_flag('-S')
+
+    def test_usage(self):
+        self.assertTrue('usage' in self.start_python('-h'))
+
+    def test_version(self):
+        version = 'Python %d.%d' % sys.version_info[:2]
+        self.assertTrue(self.start_python('-V').startswith(version))
+
+def test_main():
+    test.test_support.run_unittest(CmdLineTest)
+
+if __name__ == "__main__":
+    test_main()
diff --git a/Misc/NEWS b/Misc/NEWS
index bf40e9d..0826013 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@
 Core and builtins
 -----------------
 
+- SF Bug #887946: fix segfault when redirecting stdin from a directory.
+  Provide a warning when a directory is passed on the command line.
+
 - Fix segfault with invalid coding.
 
 - SF bug #772896: unknown encoding results in MemoryError.
diff --git a/Modules/main.c b/Modules/main.c
index 1005b94..d511e59 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -359,6 +359,14 @@
 					}
 				}
 			}
+			{
+				/* XXX: does this work on Win/Win64? (see posix_fstat) */
+				struct stat sb;
+				if (fstat(fileno(fp), &sb) == 0 &&
+				    S_ISDIR(sb.st_mode)) {
+					fprintf(stderr, "%s: warning '%s' is a directory\n", argv[0], filename);
+				}
+			}
 		}
 	}
 
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 5a8c7af..0775bb8 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -947,6 +947,15 @@
 	m = Py_InitModule3("sys", sys_methods, sys_doc);
 	sysdict = PyModule_GetDict(m);
 
+	{
+		/* XXX: does this work on Win/Win64? (see posix_fstat) */
+		struct stat sb;
+		if (fstat(fileno(stdin), &sb) == 0 &&
+		    S_ISDIR(sb.st_mode)) {
+			Py_FatalError("<stdin> is a directory");
+		}
+	}
+
 	/* Closing the standard FILE* if sys.std* goes aways causes problems
 	 * for embedded Python usages. Closing them when somebody explicitly
 	 * invokes .close() might be possible, but the FAQ promises they get