Author: Armin Rigo <[email protected]>
Branch:
Changeset: r67895:d1bb8acdd365
Date: 2013-11-09 15:42 +0100
http://bitbucket.org/pypy/pypy/changeset/d1bb8acdd365/
Log: os.tcgetpgrp(), os.tcsetpgrp()
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
@@ -156,7 +156,7 @@
'seteuid', 'setgid', 'setegid', 'getgroups', 'getpgrp',
'setpgrp', 'getppid', 'getpgid', 'setpgid', 'setreuid',
'setregid', 'getsid', 'setsid', 'fstatvfs', 'statvfs',
- 'setgroups', 'initgroups']:
+ 'setgroups', 'initgroups', 'tcgetpgrp', 'tcsetpgrp']:
if hasattr(os, name):
interpleveldefs[name] = 'interp_posix.%s' % (name,)
# not visible via os, inconsistency in nt:
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
@@ -1121,6 +1121,29 @@
raise wrap_oserror(space, e)
return space.w_None
+@unwrap_spec(fd=c_int)
+def tcgetpgrp(space, fd):
+ """ tcgetpgrp(fd) -> pgid
+
+ Return the process group associated with the terminal given by a fd.
+ """
+ try:
+ pgid = os.tcgetpgrp(fd)
+ except OSError, e:
+ raise wrap_oserror(space, e)
+ return space.wrap(pgid)
+
+@unwrap_spec(fd=c_int, pgid=c_gid_t)
+def tcsetpgrp(space, fd, pgid):
+ """ tcsetpgrp(fd, pgid)
+
+ Set the process group associated with the terminal given by a fd.
+ """
+ try:
+ os.tcsetpgrp(fd, pgid)
+ except OSError, e:
+ raise wrap_oserror(space, e)
+
def declare_new_w_star(name):
if name in RegisterOs.w_star_returning_int:
@unwrap_spec(status=c_int)
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
@@ -630,6 +630,16 @@
os = self.posix
raises(OSError, os.initgroups, "crW2hTQC", 100)
+ if hasattr(os, 'tcgetpgrp'):
+ def test_os_tcgetpgrp(self):
+ os = self.posix
+ raises(OSError, os.tcgetpgrp, 9999)
+
+ if hasattr(os, 'tcsetpgrp'):
+ def test_os_tcsetpgrp(self):
+ os = self.posix
+ raises(OSError, os.tcsetpgrp, 9999, 1)
+
if hasattr(os, 'getpgid'):
def test_os_getpgid(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
@@ -129,10 +129,6 @@
('tms_cutime', rffi.INT),
('tms_cstime', rffi.INT)])
- GID_T = platform.SimpleType('gid_t', rffi.INT)
- #TODO right now is used only in getgroups, may need to update other
- #functions like setgid
-
# For now we require off_t to be the same size as LONGLONG, which is the
# interface required by callers of functions that thake an argument of type
# off_t
@@ -693,7 +689,7 @@
@registering_if(os, 'getgroups')
def register_os_getgroups(self):
- GP = rffi.CArrayPtr(self.GID_T)
+ GP = rffi.CArrayPtr(rffi.PID_T)
c_getgroups = self.llexternal('getgroups', [rffi.INT, GP], rffi.INT)
def getgroups_llimpl():
@@ -715,7 +711,7 @@
@registering_if(os, 'setgroups')
def register_os_setgroups(self):
- GP = rffi.CArrayPtr(self.GID_T)
+ GP = rffi.CArrayPtr(rffi.PID_T)
c_setgroups = self.llexternal('setgroups', [rffi.SIZE_T, GP], rffi.INT)
def setgroups_llimpl(list):
@@ -723,7 +719,7 @@
groups = lltype.malloc(GP.TO, n, flavor='raw')
try:
for i in range(n):
- groups[i] = rffi.cast(self.GID_T, list[i])
+ groups[i] = rffi.cast(rffi.PID_T, list[i])
n = c_setgroups(rffi.cast(rffi.SIZE_T, n), groups)
finally:
lltype.free(groups, flavor='raw')
@@ -736,10 +732,10 @@
@registering_if(os, 'initgroups')
def register_os_initgroups(self):
c_initgroups = self.llexternal('initgroups',
- [rffi.CCHARP, self.GID_T], rffi.INT)
+ [rffi.CCHARP, rffi.PID_T], rffi.INT)
def initgroups_llimpl(user, group):
- n = c_initgroups(user, rffi.cast(self.GID_T, group))
+ n = c_initgroups(user, rffi.cast(rffi.PID_T, group))
if n != 0:
raise OSError(rposix.get_errno(), "os_initgroups failed")
@@ -781,6 +777,35 @@
else:
return self.extdef_for_os_function_accepting_0int(name)
+ @registering_if(os, 'tcgetpgrp')
+ def register_os_tcgetpgrp(self):
+ c_tcgetpgrp = self.llexternal('tcgetpgrp', [rffi.INT], rffi.PID_T)
+
+ def c_tcgetpgrp_llimpl(fd):
+ res = c_tcgetpgrp(rffi.cast(rffi.INT, fd))
+ res = rffi.cast(lltype.Signed, res)
+ if res == -1:
+ raise OSError(rposix.get_errno(), "tcgetpgrp failed")
+ return res
+
+ return extdef([int], int, llimpl=c_tcgetpgrp_llimpl,
+ export_name='ll_os.ll_os_tcgetpgrp')
+
+ @registering_if(os, 'tcsetpgrp')
+ def register_os_tcsetpgrp(self):
+ c_tcsetpgrp = self.llexternal('tcsetpgrp', [rffi.INT, rffi.PID_T],
+ rffi.INT)
+
+ def c_tcsetpgrp_llimpl(fd, pgrp):
+ res = c_tcsetpgrp(rffi.cast(rffi.INT, fd),
+ rffi.cast(rffi.PID_T, pgrp))
+ res = rffi.cast(lltype.Signed, res)
+ if res == -1:
+ raise OSError(rposix.get_errno(), "tcsetpgrp failed")
+
+ return extdef([int, int], None, llimpl=c_tcsetpgrp_llimpl,
+ export_name='ll_os.ll_os_tcsetpgrp')
+
@registering_if(os, 'getppid')
def register_os_getppid(self):
return self.extdef_for_os_function_returning_int('getppid')
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
@@ -225,3 +225,24 @@
return 0
res = self.interpret(f, [])
assert res == 1
+
+ if hasattr(os, 'tcgetpgrp'):
+ def test_tcgetpgrp(self):
+ def f(fd):
+ try:
+ return os.tcgetpgrp(fd)
+ except OSError:
+ return 42
+ res = self.interpret(f, [9999])
+ assert res == 42
+
+ if hasattr(os, 'tcsetpgrp'):
+ def test_tcsetpgrp(self):
+ def f(fd, pgrp):
+ try:
+ os.tcsetpgrp(fd, pgrp)
+ except OSError:
+ return 1
+ return 0
+ res = self.interpret(f, [9999, 1])
+ assert res == 1
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit