summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1999-01-06 18:42:14 (GMT)
committerGuido van Rossum <guido@python.org>1999-01-06 18:42:14 (GMT)
commit94f6f72c057e4467ced293eebf7c479afa8ab2d3 (patch)
treed78323847b69ddd8748a1a50e9f47f214d301f2a
parent2e6e7d4b7a6e28f20b7b3363d40c2066baceb492 (diff)
downloadcpython-94f6f72c057e4467ced293eebf7c479afa8ab2d3.zip
cpython-94f6f72c057e4467ced293eebf7c479afa8ab2d3.tar.gz
cpython-94f6f72c057e4467ced293eebf7c479afa8ab2d3.tar.bz2
Changes for long file support by Steve Clift.
Also added access() and ttyname() by Sean Reifschneider.
-rw-r--r--Modules/posixmodule.c245
1 files changed, 231 insertions, 14 deletions
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 @@ posix_do_stat(self, args, statfunc)
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 @@ posix_lseek(self, args)
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 @@ posix_lseek(self, args)
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 @@ posix_fstat(self, args)
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 @@ posix_fstat(self, args)
(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 @@ posix_ftruncate(self, args)
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 @@ posix_WSTOPSIG(self, args)
#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 @@ static PyMethodDef posix_methods[] = {
{"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 @@ static int
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