Commit 94f6f72c authored by Guido van Rossum's avatar Guido van Rossum

Changes for long file support by Steve Clift.

Also added access() and ttyname() by Sean Reifschneider.
parent 2e6e7d4b
...@@ -491,22 +491,72 @@ posix_do_stat(self, args, statfunc) ...@@ -491,22 +491,72 @@ posix_do_stat(self, args, statfunc)
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (res != 0) if (res != 0)
return posix_error_with_filename(path); return posix_error_with_filename(path);
#if !defined(HAVE_LARGEFILE_SUPPORT)
return Py_BuildValue("(llllllllll)", return Py_BuildValue("(llllllllll)",
(long)st.st_mode, (long)st.st_mode,
(long)st.st_ino, (long)st.st_ino,
(long)st.st_dev, (long)st.st_dev,
(long)st.st_nlink, (long)st.st_nlink,
(long)st.st_uid, (long)st.st_uid,
(long)st.st_gid, (long)st.st_gid,
(long)st.st_size, (long)st.st_size,
(long)st.st_atime, (long)st.st_atime,
(long)st.st_mtime, (long)st.st_mtime,
(long)st.st_ctime); (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 */ /* 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__[] = static char posix_chdir__doc__[] =
"chdir(path) -> None\n\ "chdir(path) -> None\n\
Change the current working directory to the specified path."; Change the current working directory to the specified path.";
...@@ -2061,8 +2111,9 @@ posix_lseek(self, args) ...@@ -2061,8 +2111,9 @@ posix_lseek(self, args)
PyObject *args; PyObject *args;
{ {
int fd, how; int fd, how;
long pos, res; off_t pos, res;
if (!PyArg_Parse(args, "(ili)", &fd, &pos, &how)) PyObject *posobj;
if (!PyArg_Parse(args, "(iOi)", &fd, &posobj, &how))
return NULL; return NULL;
#ifdef SEEK_SET #ifdef SEEK_SET
/* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */ /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
...@@ -2072,12 +2123,27 @@ posix_lseek(self, args) ...@@ -2072,12 +2123,27 @@ posix_lseek(self, args)
case 2: how = SEEK_END; break; case 2: how = SEEK_END; break;
} }
#endif /* SEEK_END */ #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 Py_BEGIN_ALLOW_THREADS
res = lseek(fd, pos, how); res = lseek(fd, pos, how);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (res < 0) if (res < 0)
return posix_error(); return posix_error();
#if !defined(HAVE_LARGEFILE_SUPPORT)
return PyInt_FromLong(res); return PyInt_FromLong(res);
#else
return PyLong_FromLongLong(res);
#endif
} }
...@@ -2151,6 +2217,7 @@ posix_fstat(self, args) ...@@ -2151,6 +2217,7 @@ posix_fstat(self, args)
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (res != 0) if (res != 0)
return posix_error(); return posix_error();
#if !defined(HAVE_LARGEFILE_SUPPORT)
return Py_BuildValue("(llllllllll)", return Py_BuildValue("(llllllllll)",
(long)st.st_mode, (long)st.st_mode,
(long)st.st_ino, (long)st.st_ino,
...@@ -2162,6 +2229,19 @@ posix_fstat(self, args) ...@@ -2162,6 +2229,19 @@ posix_fstat(self, args)
(long)st.st_atime, (long)st.st_atime,
(long)st.st_mtime, (long)st.st_mtime,
(long)st.st_ctime); (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) ...@@ -2288,10 +2368,20 @@ posix_ftruncate(self, args)
PyObject *args; PyObject *args;
{ {
int fd; int fd;
long length; off_t length;
int res; 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; return NULL;
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
...@@ -2602,7 +2692,116 @@ posix_WSTOPSIG(self, args) ...@@ -2602,7 +2692,116 @@ posix_WSTOPSIG(self, args)
#endif /* HAVE_SYS_WAIT_H */ #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[] = { 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__}, {"chdir", posix_chdir, 0, posix_chdir__doc__},
{"chmod", posix_chmod, 0, posix_chmod__doc__}, {"chmod", posix_chmod, 0, posix_chmod__doc__},
#ifdef HAVE_CHOWN #ifdef HAVE_CHOWN
...@@ -2749,6 +2948,12 @@ static PyMethodDef posix_methods[] = { ...@@ -2749,6 +2948,12 @@ static PyMethodDef posix_methods[] = {
{"WSTOPSIG", posix_WSTOPSIG, 0, posix_WSTOPSIG__doc__}, {"WSTOPSIG", posix_WSTOPSIG, 0, posix_WSTOPSIG__doc__},
#endif /* WSTOPSIG */ #endif /* WSTOPSIG */
#endif /* HAVE_SYS_WAIT_H */ #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 */ {NULL, NULL} /* Sentinel */
}; };
...@@ -2830,6 +3035,18 @@ static int ...@@ -2830,6 +3035,18 @@ static int
all_ins(d) all_ins(d)
PyObject* 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 #ifdef WNOHANG
if (ins(d, "WNOHANG", (long)WNOHANG)) return -1; if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment