diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index f9f6284..6cc3a2c 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -491,22 +491,72 @@
 	Py_END_ALLOW_THREADS
 	if (res != 0)
 		return posix_error_with_filename(path);
+#if !defined(HAVE_LARGEFILE_SUPPORT)
 	return Py_BuildValue("(llllllllll)",
-		    (long)st.st_mode,
-		    (long)st.st_ino,
-		    (long)st.st_dev,
-		    (long)st.st_nlink,
-		    (long)st.st_uid,
-		    (long)st.st_gid,
-		    (long)st.st_size,
-		    (long)st.st_atime,
-		    (long)st.st_mtime,
-		    (long)st.st_ctime);
+			     (long)st.st_mode,
+			     (long)st.st_ino,
+			     (long)st.st_dev,
+			     (long)st.st_nlink,
+			     (long)st.st_uid,
+			     (long)st.st_gid,
+			     (long)st.st_size,
+			     (long)st.st_atime,
+			     (long)st.st_mtime,
+			     (long)st.st_ctime);
+#else
+	return Py_BuildValue("(lLllllLlll)",
+			     (long)st.st_mode,
+			     (LONG_LONG)st.st_ino,
+			     (long)st.st_dev,
+			     (long)st.st_nlink,
+			     (long)st.st_uid,
+			     (long)st.st_gid,
+			     (LONG_LONG)st.st_size,
+			     (long)st.st_atime,
+			     (long)st.st_mtime,
+			     (long)st.st_ctime);
+#endif
 }
 
 
 /* POSIX methods */
 
+static char posix_access__doc__[] =
+"access(path, mode) -> None\n\
+Test for access to a file.";
+
+static PyObject *
+posix_access(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	return posix_strint(args, access);
+}
+
+static char posix_ttyname__doc__[] =
+"ttyname(fd, mode) -> String\n\
+Return the name of the terminal device connected to 'fd'.";
+
+static PyObject *
+posix_ttyname(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	PyObject *file;
+	int id;
+	char *ret;
+
+
+	if (!PyArg_Parse(args, "i", &id))
+		return NULL;
+
+	/* XXX Use ttyname_r if it exists? */
+	ret = ttyname(id);
+	if (ret == NULL)
+		return(posix_error());
+	return(PyString_FromString(ret));
+}
+
 static char posix_chdir__doc__[] =
 "chdir(path) -> None\n\
 Change the current working directory to the specified path.";
@@ -2061,8 +2111,9 @@
 	PyObject *args;
 {
 	int fd, how;
-	long pos, res;
-	if (!PyArg_Parse(args, "(ili)", &fd, &pos, &how))
+	off_t pos, res;
+	PyObject *posobj;
+	if (!PyArg_Parse(args, "(iOi)", &fd, &posobj, &how))
 		return NULL;
 #ifdef SEEK_SET
 	/* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
@@ -2072,12 +2123,27 @@
 	case 2: how = SEEK_END; break;
 	}
 #endif /* SEEK_END */
+
+#if !defined(HAVE_LARGEFILE_SUPPORT)
+	pos = PyInt_AsLong(posobj);
+#else
+	pos = PyLong_Check(posobj) ?
+		PyLong_AsLongLong(posobj) : PyInt_AsLong(posobj);
+#endif
+	if (PyErr_Occurred())
+		return NULL;
+
 	Py_BEGIN_ALLOW_THREADS
 	res = lseek(fd, pos, how);
 	Py_END_ALLOW_THREADS
 	if (res < 0)
 		return posix_error();
+
+#if !defined(HAVE_LARGEFILE_SUPPORT)
 	return PyInt_FromLong(res);
+#else
+	return PyLong_FromLongLong(res);
+#endif
 }
 
 
@@ -2151,6 +2217,7 @@
 	Py_END_ALLOW_THREADS
 	if (res != 0)
 		return posix_error();
+#if !defined(HAVE_LARGEFILE_SUPPORT)
 	return Py_BuildValue("(llllllllll)",
 			     (long)st.st_mode,
 			     (long)st.st_ino,
@@ -2162,6 +2229,19 @@
 			     (long)st.st_atime,
 			     (long)st.st_mtime,
 			     (long)st.st_ctime);
+#else
+	return Py_BuildValue("(lLllllLlll)",
+			     (long)st.st_mode,
+			     (LONG_LONG)st.st_ino,
+			     (long)st.st_dev,
+			     (long)st.st_nlink,
+			     (long)st.st_uid,
+			     (long)st.st_gid,
+			     (LONG_LONG)st.st_size,
+			     (long)st.st_atime,
+			     (long)st.st_mtime,
+			     (long)st.st_ctime);
+#endif
 }
 
 
@@ -2288,10 +2368,20 @@
 	PyObject *args;
 {
 	int fd;
-	long length;
+	off_t length;
 	int res;
+	PyObject *lenobj;
 
-	if (!PyArg_Parse(args, "(il)", &fd, &length))
+	if (!PyArg_Parse(args, "(iO)", &fd, &lenobj))
+		return NULL;
+
+#if !defined(HAVE_LARGEFILE_SUPPORT)
+	length = PyInt_AsLong(lenobj);
+#else
+	length = PyLong_Check(lenobj) ?
+		PyLong_AsLongLong(lenobj) : PyInt_AsLong(lenobj);
+#endif
+	if (PyErr_Occurred())
 		return NULL;
 
 	Py_BEGIN_ALLOW_THREADS
@@ -2602,7 +2692,116 @@
 #endif /* HAVE_SYS_WAIT_H */
 
 
+#if defined(HAVE_FSTATVFS)
+#include <sys/statvfs.h>
+
+static char posix_fstatvfs__doc__[] =
+"fstatvfs(fd) -> \
+(bsize,frsize,blocks,bfree,bavail,files,ffree,favail,fsid,flag, namemax)\n\
+Perform an fstatvfs system call on the given fd.";
+
+static PyObject *
+posix_fstatvfs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	int fd, res;
+	struct statvfs st;
+	if (!PyArg_ParseTuple(args, "i", &fd))
+		return NULL;
+	Py_BEGIN_ALLOW_THREADS
+	res = fstatvfs(fd, &st);
+	Py_END_ALLOW_THREADS
+	if (res != 0)
+		return posix_error();
+#if !defined(HAVE_LARGEFILE_SUPPORT)
+	return Py_BuildValue("(lllllllllll)",
+		    (long) st.f_bsize,
+		    (long) st.f_frsize,
+		    (long) st.f_blocks,
+		    (long) st.f_bfree,
+		    (long) st.f_bavail,
+		    (long) st.f_files,
+		    (long) st.f_ffree,
+		    (long) st.f_favail,
+		    (long) st.f_fsid,
+		    (long) st.f_flag,
+		    (long) st.f_namemax);
+#else
+	return Py_BuildValue("(llLLLLLLlll)",
+		    (long) st.f_bsize,
+		    (long) st.f_frsize,
+		    (LONG_LONG) st.f_blocks,
+		    (LONG_LONG) st.f_bfree,
+		    (LONG_LONG) st.f_bavail,
+		    (LONG_LONG) st.f_files,
+		    (LONG_LONG) st.f_ffree,
+		    (LONG_LONG) st.f_favail,
+		    (long) st.f_fsid,
+		    (long) st.f_flag,
+		    (long) st.f_namemax);
+#endif
+}
+#endif /* HAVE_FSTATVFS */
+
+
+#if defined(HAVE_STATVFS)
+#include <sys/statvfs.h>
+
+static char posix_statvfs__doc__[] =
+"statvfs(path) -> \
+(bsize,frsize,blocks,bfree,bavail,files,ffree,favail,fsid,flag, namemax)\n\
+Perform a statvfs system call on the given path.";
+
+static PyObject *
+posix_statvfs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	char *path;
+	int res;
+	struct statvfs st;
+	if (!PyArg_ParseTuple(args, "s", &path))
+		return NULL;
+	Py_BEGIN_ALLOW_THREADS
+	res = statvfs(path, &st);
+	Py_END_ALLOW_THREADS
+	if (res != 0)
+		return posix_error_with_filename(path);
+#if !defined(HAVE_LARGEFILE_SUPPORT)
+	return Py_BuildValue("(lllllllllll)",
+		    (long) st.f_bsize,
+		    (long) st.f_frsize,
+		    (long) st.f_blocks,
+		    (long) st.f_bfree,
+		    (long) st.f_bavail,
+		    (long) st.f_files,
+		    (long) st.f_ffree,
+		    (long) st.f_favail,
+		    (long) st.f_fsid,
+		    (long) st.f_flag,
+		    (long) st.f_namemax);
+#else	/* HAVE_LARGEFILE_SUPPORT */
+	return Py_BuildValue("(llLLLLLLlll)",
+		    (long) st.f_bsize,
+		    (long) st.f_frsize,
+		    (LONG_LONG) st.f_blocks,
+		    (LONG_LONG) st.f_bfree,
+		    (LONG_LONG) st.f_bavail,
+		    (LONG_LONG) st.f_files,
+		    (LONG_LONG) st.f_ffree,
+		    (LONG_LONG) st.f_favail,
+		    (long) st.f_fsid,
+		    (long) st.f_flag,
+		    (long) st.f_namemax);
+#endif
+}
+#endif /* HAVE_STATVFS */
+
+
 static PyMethodDef posix_methods[] = {
+	{"access",	posix_access, 0, posix_access__doc__},
+	{"ttyname",	posix_ttyname, 0, posix_ttyname__doc__},
 	{"chdir",	posix_chdir, 0, posix_chdir__doc__},
 	{"chmod",	posix_chmod, 0, posix_chmod__doc__},
 #ifdef HAVE_CHOWN
@@ -2749,6 +2948,12 @@
         {"WSTOPSIG",	posix_WSTOPSIG, 0, posix_WSTOPSIG__doc__},
 #endif /* WSTOPSIG */
 #endif /* HAVE_SYS_WAIT_H */
+#ifdef HAVE_FSTATVFS
+	{"fstatvfs",	posix_fstatvfs, 1, posix_fstatvfs__doc__},
+#endif
+#ifdef HAVE_STATVFS
+	{"statvfs",	posix_statvfs, 1, posix_statvfs__doc__},
+#endif
 	{NULL,		NULL}		 /* Sentinel */
 };
 
@@ -2830,6 +3035,18 @@
 all_ins(d)
         PyObject* d;
 {
+#ifdef F_OK
+        if (ins(d, "F_OK", (long)F_OK)) return -1;
+#endif        
+#ifdef R_OK
+        if (ins(d, "R_OK", (long)R_OK)) return -1;
+#endif        
+#ifdef W_OK
+        if (ins(d, "W_OK", (long)W_OK)) return -1;
+#endif        
+#ifdef X_OK
+        if (ins(d, "X_OK", (long)X_OK)) return -1;
+#endif        
 #ifdef WNOHANG
         if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
 #endif        
