diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 043624451af..bd8480c4167 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -417,6 +417,19 @@ by file descriptors. Availability: Macintosh, Unix, Windows. +.. function:: fchmod(fd, mode) + + Change the mode of the file given by *fd* to the numeric *mode*. See the docs + for :func:`chmod` for possible values of *mode*. Availability: Unix. + + +.. function:: fchown(fd, uid, gid) + + Change the owner and group id of the file given by *fd* to the numeric *uid* + and *gid*. To leave one of the ids unchanged, set it to -1. + Availability: Unix. + + .. function:: fdatasync(fd) Force write of file with filedescriptor *fd* to disk. Does not force update of @@ -475,6 +488,13 @@ by file descriptors. tty(-like) device, else ``False``. Availability: Macintosh, Unix. +.. function:: lchmod(path, mode) + + Change the mode of *path* to the numeric *mode*. If path is a symlink, this + affects the symlink rather than the target. See the docs for :func:`chmod` + for possible values of *mode*. Availability: Unix. + + .. function:: lseek(fd, pos, how) Set the current position of file descriptor *fd* to position *pos*, modified by diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py index 7244e1be141..652a5237167 100644 --- a/Lib/test/test_bigmem.py +++ b/Lib/test/test_bigmem.py @@ -64,13 +64,15 @@ class StrTest(unittest.TestCase): self.assertEquals(s.count('i'), 1) self.assertEquals(s.count('j'), 0) - @bigmemtest(minsize=0, memuse=1) + @bigmemtest(minsize=_2G + 2, memuse=3) def test_decode(self, size): - pass + s = '.' * size + self.assertEquals(len(s.decode('utf-8')), size) - @bigmemtest(minsize=0, memuse=1) + @bigmemtest(minsize=_2G + 2, memuse=3) def test_encode(self, size): - pass + s = u'.' * size + self.assertEquals(len(s.encode('utf-8')), size) @bigmemtest(minsize=_2G, memuse=2) def test_endswith(self, size): diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 018d68ceb2d..f183d868327 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -186,6 +186,12 @@ extern int chmod(const char *, int); #else extern int chmod(const char *, mode_t); #endif +/*#ifdef HAVE_FCHMOD +extern int fchmod(int, mode_t); +#endif*/ +/*#ifdef HAVE_LCHMOD +extern int lchmod(const char *, mode_t); +#endif*/ extern int chown(const char *, uid_t, gid_t); extern char *getcwd(char *, int); extern char *strerror(int); @@ -1747,6 +1753,52 @@ posix_chmod(PyObject *self, PyObject *args) #endif } +#ifdef HAVE_FCHMOD +PyDoc_STRVAR(posix_fchmod__doc__, +"fchmod(fd, mode)\n\n\ +Change the access permissions of the file given by file\n\ +descriptor fd."); + +static PyObject * +posix_fchmod(PyObject *self, PyObject *args) +{ + int fd, mode, res; + if (!PyArg_ParseTuple(args, "ii:fchmod", &fd, &mode)) + return NULL; + Py_BEGIN_ALLOW_THREADS + res = fchmod(fd, mode); + Py_END_ALLOW_THREADS + if (res < 0) + return posix_error(); + Py_RETURN_NONE; +} +#endif /* HAVE_FCHMOD */ + +#ifdef HAVE_LCHMOD +PyDoc_STRVAR(posix_lchmod__doc__, +"lchmod(path, mode)\n\n\ +Change the access permissions of a file. If path is a symlink, this\n\ +affects the link itself rather than the target."); + +static PyObject * +posix_lchmod(PyObject *self, PyObject *args) +{ + char *path = NULL; + int i; + int res; + if (!PyArg_ParseTuple(args, "eti:lchmod", Py_FileSystemDefaultEncoding, + &path, &i)) + return NULL; + Py_BEGIN_ALLOW_THREADS + res = lchmod(path, i); + Py_END_ALLOW_THREADS + if (res < 0) + return posix_error_with_allocated_filename(path); + PyMem_Free(path); + Py_RETURN_NONE; +} +#endif /* HAVE_LCHMOD */ + #ifdef HAVE_CHFLAGS PyDoc_STRVAR(posix_chflags__doc__, @@ -1868,6 +1920,28 @@ posix_chown(PyObject *self, PyObject *args) } #endif /* HAVE_CHOWN */ +#ifdef HAVE_FCHOWN +PyDoc_STRVAR(posix_fchown__doc__, +"fchown(fd, uid, gid)\n\n\ +Change the owner and group id of the file given by file descriptor\n\ +fd to the numeric uid and gid."); + +static PyObject * +posix_fchown(PyObject *self, PyObject *args) +{ + int fd, uid, gid; + int res; + if (!PyArg_ParseTuple(args, "iii:chown", &fd, &uid, &gid)) + return NULL; + Py_BEGIN_ALLOW_THREADS + res = fchown(fd, (uid_t) uid, (gid_t) gid); + Py_END_ALLOW_THREADS + if (res < 0) + return posix_error(); + Py_RETURN_NONE; +} +#endif /* HAVE_FCHOWN */ + #ifdef HAVE_LCHOWN PyDoc_STRVAR(posix_lchown__doc__, "lchown(path, uid, gid)\n\n\ @@ -6664,9 +6738,18 @@ static PyMethodDef posix_methods[] = { {"chflags", posix_chflags, METH_VARARGS, posix_chflags__doc__}, #endif /* HAVE_CHFLAGS */ {"chmod", posix_chmod, METH_VARARGS, posix_chmod__doc__}, +#ifdef HAVE_FCHMOD + {"fchmod", posix_fchmod, METH_VARARGS, posix_fchmod__doc__}, +#endif /* HAVE_FCHMOD */ #ifdef HAVE_CHOWN {"chown", posix_chown, METH_VARARGS, posix_chown__doc__}, #endif /* HAVE_CHOWN */ +#ifdef HAVE_LCHMOD + {"lchmod", posix_lchmod, METH_VARARGS, posix_lchmod__doc__}, +#endif /* HAVE_LCHMOD */ +#ifdef HAVE_FCHOWN + {"fchown", posix_fchown, METH_VARARGS, posix_fchown__doc__}, +#endif /* HAVE_FCHOWN */ #ifdef HAVE_LCHFLAGS {"lchflags", posix_lchflags, METH_VARARGS, posix_lchflags__doc__}, #endif /* HAVE_LCHFLAGS */ diff --git a/Python/getargs.c b/Python/getargs.c index 584805e25e6..f6cdd7c0f4a 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -1182,7 +1182,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'w': { /* memory buffer, read-write access */ void **p = va_arg(*p_va, void **); PyBufferProcs *pb = arg->ob_type->tp_as_buffer; - int count; + Py_ssize_t count; int temp=-1; Py_buffer view; @@ -1216,7 +1216,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 't': { /* 8-bit character buffer, read-only access */ char **p = va_arg(*p_va, char **); PyBufferProcs *pb = arg->ob_type->tp_as_buffer; - int count; + Py_ssize_t count; Py_buffer view; if (*format++ != '#') diff --git a/configure b/configure index 53c1ec56cac..c5b22a4cec6 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 58054 . +# From configure.in Revision: 58817 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for python 3.0. # @@ -15436,15 +15436,18 @@ echo "${ECHO_T}MACHDEP_OBJS" >&6; } + + + for ac_func in alarm bind_textdomain_codeset chflags chown clock confstr \ - ctermid execv fork fpathconf ftime ftruncate \ + ctermid execv fchmod fchown fork fpathconf ftime ftruncate \ gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \ getpriority getpwent getspnam getspent getsid getwd \ - kill killpg lchflags lchown lstat mkfifo mknod mktime \ + kill killpg lchflags lchmod lchown lstat mkfifo mknod mktime \ mremap nice pathconf pause plock poll pthread_init \ putenv readlink realpath \ select setegid seteuid setgid \ diff --git a/configure.in b/configure.in index 059d184749e..608d6ae43c1 100644 --- a/configure.in +++ b/configure.in @@ -2275,10 +2275,10 @@ AC_MSG_RESULT(MACHDEP_OBJS) # checks for library functions AC_CHECK_FUNCS(alarm bind_textdomain_codeset chflags chown clock confstr \ - ctermid execv fork fpathconf ftime ftruncate \ + ctermid execv fchmod fchown fork fpathconf ftime ftruncate \ gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \ getpriority getpwent getspnam getspent getsid getwd \ - kill killpg lchflags lchown lstat mkfifo mknod mktime \ + kill killpg lchflags lchmod lchown lstat mkfifo mknod mktime \ mremap nice pathconf pause plock poll pthread_init \ putenv readlink realpath \ select setegid seteuid setgid \ diff --git a/pyconfig.h.in b/pyconfig.h.in index 11ea4a0d24a..4f45cb96aa9 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -141,6 +141,12 @@ /* Define if you have the 'fchdir' function. */ #undef HAVE_FCHDIR +/* Define to 1 if you have the `fchmod' function. */ +#undef HAVE_FCHMOD + +/* Define to 1 if you have the `fchown' function. */ +#undef HAVE_FCHOWN + /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H @@ -297,6 +303,9 @@ /* Define to 1 if you have the `lchflags' function. */ #undef HAVE_LCHFLAGS +/* Define to 1 if you have the `lchmod' function. */ +#undef HAVE_LCHMOD + /* Define to 1 if you have the `lchown' function. */ #undef HAVE_LCHOWN