Author: Ronan Lamy <[email protected]>
Branch: follow_symlinks
Changeset: r83286:fbc1f8a5b79b
Date: 2016-03-23 02:12 +0000
http://bitbucket.org/pypy/pypy/changeset/fbc1f8a5b79b/
Log: Implement dir_fd argument for many posix.* functions
diff --git a/pypy/module/posix/interp_posix.py
b/pypy/module/posix/interp_posix.py
--- a/pypy/module/posix/interp_posix.py
+++ b/pypy/module/posix/interp_posix.py
@@ -105,7 +105,10 @@
return func(fname1, fname2, *args)
return dispatch
-DEFAULT_DIR_FD = -100
+if hasattr(rposix, 'AT_FDCWD'):
+ DEFAULT_DIR_FD = rposix.AT_FDCWD
+else:
+ DEFAULT_DIR_FD = -100
DIR_FD_AVAILABLE = False
def _unwrap_fd(space, w_value):
@@ -128,8 +131,8 @@
return dir_fd
-@unwrap_spec(flag=c_int, mode=c_int, dir_fd=DirFD)
-def open(space, w_fname, flag, mode=0777, dir_fd=DEFAULT_DIR_FD):
+@unwrap_spec(flags=c_int, mode=c_int, dir_fd=DirFD)
+def open(space, w_path, flags, mode=0777, dir_fd=DEFAULT_DIR_FD):
"""open(path, flags, mode=0o777, *, dir_fd=None)
Open a file for low level IO. Returns a file handle (integer).
@@ -139,10 +142,13 @@
dir_fd may not be implemented on your platform.
If it is unavailable, using it will raise a NotImplementedError."""
try:
- fd = dispatch_filename(rposix.open)(
- space, w_fname, flag, mode)
- except OSError, e:
- raise wrap_oserror2(space, e, w_fname)
+ if dir_fd == DEFAULT_DIR_FD:
+ fd = dispatch_filename(rposix.open)(space, w_path, flags, mode)
+ else:
+ path = space.fsencode_w(w_path)
+ fd = rposix.openat(path, flags, mode, dir_fd)
+ except OSError as e:
+ raise wrap_oserror2(space, e, w_path)
return space.wrap(fd)
@unwrap_spec(fd=c_int, pos=r_longlong, how=c_int)
@@ -504,8 +510,12 @@
dir_fd may not be implemented on your platform.
If it is unavailable, using it will raise a NotImplementedError."""
try:
- dispatch_filename(rposix.unlink)(space, w_path)
- except OSError, e:
+ if dir_fd == DEFAULT_DIR_FD:
+ dispatch_filename(rposix.unlink)(space, w_path)
+ else:
+ path = space.fsencode_w(w_path)
+ rposix.unlinkat(path, dir_fd, removedir=False)
+ except OSError as e:
raise wrap_oserror2(space, e, w_path)
@unwrap_spec(dir_fd=DirFD)
@@ -519,8 +529,12 @@
dir_fd may not be implemented on your platform.
If it is unavailable, using it will raise a NotImplementedError."""
try:
- dispatch_filename(rposix.unlink)(space, w_path)
- except OSError, e:
+ if dir_fd == DEFAULT_DIR_FD:
+ dispatch_filename(rposix.unlink)(space, w_path)
+ else:
+ path = space.fsencode_w(w_path)
+ rposix.unlinkat(path, dir_fd, removedir=False)
+ except OSError as e:
raise wrap_oserror2(space, e, w_path)
def _getfullpathname(space, w_path):
@@ -582,8 +596,12 @@
The mode argument is ignored on Windows."""
try:
- dispatch_filename(rposix.mkdir)(space, w_path, mode)
- except OSError, e:
+ if dir_fd == DEFAULT_DIR_FD:
+ dispatch_filename(rposix.mkdir)(space, w_path, mode)
+ else:
+ path = space.fsencode_w(w_path)
+ rposix.mkdirat(path, mode, dir_fd)
+ except OSError as e:
raise wrap_oserror2(space, e, w_path)
@unwrap_spec(dir_fd=DirFD)
@@ -597,8 +615,12 @@
dir_fd may not be implemented on your platform.
If it is unavailable, using it will raise a NotImplementedError."""
try:
- dispatch_filename(rposix.rmdir)(space, w_path)
- except OSError, e:
+ if dir_fd == DEFAULT_DIR_FD:
+ dispatch_filename(rposix.rmdir)(space, w_path)
+ else:
+ path = space.fsencode_w(w_path)
+ rposix.unlinkat(path, dir_fd, removedir=True)
+ except OSError as e:
raise wrap_oserror2(space, e, w_path)
@unwrap_spec(errno=c_int)
@@ -797,7 +819,7 @@
raise wrap_oserror(space, e)
@unwrap_spec(mode=c_int, dir_fd=DirFD)
-def mkfifo(space, w_filename, mode=0666, dir_fd=DEFAULT_DIR_FD):
+def mkfifo(space, w_path, mode=0666, dir_fd=DEFAULT_DIR_FD):
"""mkfifo(path, mode=0o666, *, dir_fd=None)
Create a FIFO (a POSIX named pipe).
@@ -807,9 +829,13 @@
dir_fd may not be implemented on your platform.
If it is unavailable, using it will raise a NotImplementedError."""
try:
- dispatch_filename(rposix.mkfifo)(space, w_filename, mode)
- except OSError, e:
- raise wrap_oserror2(space, e, w_filename)
+ if dir_fd == DEFAULT_DIR_FD:
+ dispatch_filename(rposix.mkfifo)(space, w_path, mode)
+ else:
+ path = space.fsencode_w(w_path)
+ rposix.mkfifoat(path, mode, dir_fd)
+ except OSError as e:
+ raise wrap_oserror2(space, e, w_path)
@unwrap_spec(mode=c_int, device=c_int, dir_fd=DirFD)
def mknod(space, w_filename, mode=0600, device=0, dir_fd=DEFAULT_DIR_FD):
@@ -827,8 +853,12 @@
dir_fd may not be implemented on your platform.
If it is unavailable, using it will raise a NotImplementedError."""
try:
- dispatch_filename(rposix.mknod)(space, w_filename, mode, device)
- except OSError, e:
+ if dir_fd == DEFAULT_DIR_FD:
+ dispatch_filename(rposix.mknod)(space, w_filename, mode, device)
+ else:
+ fname = space.fsencode_w(w_filename)
+ rposix.mknodat(fname, mode, device, dir_fd)
+ except OSError as e:
raise wrap_oserror2(space, e, w_filename)
@unwrap_spec(mask=c_int)
@@ -911,8 +941,13 @@
dir_fd may not be implemented on your platform.
If it is unavailable, using it will raise a NotImplementedError."""
try:
- dispatch_filename_2(rposix.symlink)(space, w_src, w_dst)
- except OSError, e:
+ if dir_fd == DEFAULT_DIR_FD:
+ dispatch_filename_2(rposix.symlink)(space, w_src, w_dst)
+ else:
+ src = space.fsencode_w(w_src)
+ dst = space.fsencode_w(w_dst)
+ rposix.symlinkat(src, dst, dir_fd)
+ except OSError as e:
raise wrap_oserror(space, e)
@@ -932,7 +967,10 @@
else:
path = space.bytes0_w(w_path)
try:
- result = os.readlink(path)
+ if dir_fd == DEFAULT_DIR_FD:
+ result = rposix.readlink(path)
+ else:
+ result = rposix.readlinkat(path, dir_fd)
except OSError, e:
raise wrap_oserror2(space, e, w_path)
w_result = space.wrapbytes(result)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit