Author: Armin Rigo <[email protected]>
Branch:
Changeset: r67898:d3fc81a3142a
Date: 2013-11-09 16:26 +0100
http://bitbucket.org/pypy/pypy/changeset/d3fc81a3142a/
Log: os.confstr()
diff --git a/pypy/module/posix/__init__.py b/pypy/module/posix/__init__.py
--- a/pypy/module/posix/__init__.py
+++ b/pypy/module/posix/__init__.py
@@ -131,6 +131,9 @@
if hasattr(os, 'fpathconf'):
interpleveldefs['fpathconf'] = 'interp_posix.fpathconf'
interpleveldefs['pathconf_names'] = 'space.wrap(os.pathconf_names)'
+ if hasattr(os, 'confstr'):
+ interpleveldefs['confstr'] = 'interp_posix.confstr'
+ interpleveldefs['confstr_names'] = 'space.wrap(os.confstr_names)'
if hasattr(os, 'ttyname'):
interpleveldefs['ttyname'] = 'interp_posix.ttyname'
if hasattr(os, 'getloadavg'):
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
@@ -1233,15 +1233,28 @@
def sysconf(space, w_name):
num = confname_w(space, w_name, os.sysconf_names)
- return space.wrap(os.sysconf(num))
+ try:
+ res = os.sysconf(num)
+ except OSError, e:
+ raise wrap_oserror(space, e)
+ return space.wrap(res)
@unwrap_spec(fd=c_int)
def fpathconf(space, fd, w_name):
num = confname_w(space, w_name, os.pathconf_names)
try:
- return space.wrap(os.fpathconf(fd, num))
+ res = os.fpathconf(fd, num)
except OSError, e:
raise wrap_oserror(space, e)
+ return space.wrap(res)
+
+def confstr(space, w_name):
+ num = confname_w(space, w_name, os.confstr_names)
+ try:
+ res = os.confstr(num)
+ except OSError, e:
+ raise wrap_oserror(space, e)
+ return space.wrap(res)
@unwrap_spec(path='str0', uid=c_uid_t, gid=c_gid_t)
def chown(space, path, uid, gid):
diff --git a/pypy/module/posix/test/test_posix2.py
b/pypy/module/posix/test/test_posix2.py
--- a/pypy/module/posix/test/test_posix2.py
+++ b/pypy/module/posix/test/test_posix2.py
@@ -78,6 +78,11 @@
cls.w_sysconf_name = space.wrap(sysconf_name)
cls.w_sysconf_value = space.wrap(os.sysconf_names[sysconf_name])
cls.w_sysconf_result = space.wrap(os.sysconf(sysconf_name))
+ if hasattr(os, 'confstr'):
+ confstr_name = os.confstr_names.keys()[0]
+ cls.w_confstr_name = space.wrap(confstr_name)
+ cls.w_confstr_value = space.wrap(os.confstr_names[confstr_name])
+ cls.w_confstr_result = space.wrap(os.confstr(confstr_name))
cls.w_SIGABRT = space.wrap(signal.SIGABRT)
cls.w_python = space.wrap(sys.executable)
if hasattr(os, 'major'):
@@ -700,6 +705,17 @@
raises(OSError, os.fpathconf, -1, "PC_PIPE_BUF")
raises(ValueError, os.fpathconf, 1, "##")
+ if hasattr(os, 'confstr'):
+ def test_os_confstr(self):
+ os = self.posix
+ assert os.confstr(self.confstr_value) == self.confstr_result
+ assert os.confstr(self.confstr_name) == self.confstr_result
+ assert os.confstr_names[self.confstr_name] == self.confstr_value
+
+ def test_os_confstr_error(self):
+ os = self.posix
+ raises(ValueError, os.confstr, "!@#$%!#$!@#")
+
if hasattr(os, 'wait'):
def test_os_wait(self):
os = self.posix
diff --git a/rpython/rtyper/module/ll_os.py b/rpython/rtyper/module/ll_os.py
--- a/rpython/rtyper/module/ll_os.py
+++ b/rpython/rtyper/module/ll_os.py
@@ -651,6 +651,30 @@
return extdef([int, int], int, "ll_os.ll_fpathconf",
llimpl=fpathconf_llimpl)
+ @registering_if(os, 'confstr')
+ def register_os_confstr(self):
+ c_confstr = self.llexternal('confstr', [rffi.INT, rffi.CCHARP,
+ rffi.SIZE_T], rffi.SIZE_T)
+
+ def confstr_llimpl(i):
+ rposix.set_errno(0)
+ n = c_confstr(i, lltype.nullptr(rffi.CCHARP.TO), 0)
+ n = rffi.cast(lltype.Signed, n)
+ if n > 0:
+ buf = lltype.malloc(rffi.CCHARP.TO, n, flavor='raw')
+ try:
+ c_confstr(i, buf, n)
+ return rffi.charp2strn(buf, n)
+ finally:
+ lltype.free(buf, flavor='raw')
+ else:
+ errno = rposix.get_errno()
+ if errno != 0:
+ raise OSError(errno, "confstr failed")
+ return None
+ return extdef([int], SomeString(can_be_None=True),
+ "ll_os.ll_confstr", llimpl=confstr_llimpl)
+
@registering_if(os, 'getuid')
def register_os_getuid(self):
return self.extdef_for_os_function_returning_int('getuid')
diff --git a/rpython/rtyper/module/test/test_posix.py
b/rpython/rtyper/module/test/test_posix.py
--- a/rpython/rtyper/module/test/test_posix.py
+++ b/rpython/rtyper/module/test/test_posix.py
@@ -1,5 +1,6 @@
import py
from rpython.rtyper.test.tool import BaseRtypingTest
+from rpython.rtyper.annlowlevel import hlstr
from rpython.tool.udir import udir
from rpython.rlib.rarithmetic import is_valid_int
@@ -176,6 +177,19 @@
return os.sysconf(i)
assert self.interpret(f, [13]) == f(13)
+ if hasattr(os, 'confstr'):
+ def test_os_confstr(self):
+ def f(i):
+ try:
+ return os.confstr(i)
+ except OSError:
+ return "oooops!!"
+ some_value = os.confstr_names.values()[-1]
+ res = self.interpret(f, [some_value])
+ assert hlstr(res) == f(some_value)
+ res = self.interpret(f, [94781413])
+ assert hlstr(res) == "oooops!!"
+
if hasattr(os, 'chroot'):
def test_os_chroot(self):
def f():
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit