Kaydet (Commit) 94f6f72c authored tarafından Guido van Rossum's avatar Guido van Rossum

Changes for long file support by Steve Clift.

Also added access() and ttyname() by Sean Reifschneider.
üst 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