diff --git a/mercurial/cext/osutil.c b/mercurial/cext/osutil.c
index 7b068abe4aa2d1848cf91c2c203b68aa59feaaf7_bWVyY3VyaWFsL2NleHQvb3N1dGlsLmM=..499733de460faf0d8cee6ea5e22bd05cec2fc93c_bWVyY3VyaWFsL2NleHQvb3N1dGlsLmM= 100644
--- a/mercurial/cext/osutil.c
+++ b/mercurial/cext/osutil.c
@@ -1176,4 +1176,5 @@
 	char fpmode[4];
 	int fppos = 0;
 	int plus;
+#ifndef IS_PY3K
 	FILE *fp;
@@ -1179,4 +1180,5 @@
 	FILE *fp;
+#endif
 
 	if (!PyArg_ParseTupleAndKeywords(args, kwds, "et|yi:posixfile",
 					 kwlist,
@@ -1248,6 +1250,7 @@
 		PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
 		goto bail;
 	}
+#ifndef IS_PY3K
 	fp = _fdopen(fd, fpmode);
 	if (fp == NULL) {
 		_close(fd);
@@ -1262,6 +1265,11 @@
 	}
 
 	PyFile_SetBufSize(file_obj, bufsize);
+#else
+	file_obj = PyFile_FromFd(fd, name, mode, bufsize, NULL, NULL, NULL, 1);
+	if (file_obj == NULL)
+		goto bail;
+#endif
 bail:
 	PyMem_Free(name);
 	return file_obj;