And here is Martin's summary of the issue: I think we really should create new issues for any remaining problems. AFAICT, the remaining problems are: - resource.RLIM_INFINITY is -1 on Linux, when it is meant to be a really large value - (as you reported) getrlimit returns -1 to indicate RLIM_INFINITY. I think the core of the problem is that the resource module considers rlim_t to be a signed type (or at least representable in "long long"). Using FromUnsignedLongLong in the appropriate place might solve the issue.
getrlimit still returns -1 as 'max' when limit is unlimited and for RLIM_INFINITY because rlim_t is considered signed. The zshell project decides whether rlim_t is signed/unsigned (and also whether it is long or long long) in the configure step: https://github.com/zsh-users/zsh/blob/8b84419f45298ee564bd6fa2b531c8991b2a1983/configure.ac#L1859 On Linux, rlim_t is unisnged long long so the conversion should be done using PyLong_FromUnsignedLongLong (for RLIM_INFINITY) and using 'KK' instead of 'LL' in 'rlimit2py'. IMHO the best way to fix this is to add configure steps like in zsh and then adding ifdefs to resource.c - in rlimit2py and near PyModule_AddObject of RLIM_INFINITY
I'm submitting a patch for review. I tested this and verified the values on Redhat and Unbuntu (both x86 and x64), Mac OS X (x64) and AIX (32-bit process on ppc64). 'configure' and 'pyconfig.h.in' were auto-generated with autoconf and autoheader, respectively. A test for this patch (along with a fix for a different test failure) is in
Are there platforms where rlim_t is signed? Posix defines it as unsigned: <http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_resource.h.html>. Also there are subtle differences between the PyLong_AsUnsigned[. . .] and the current signed versions. The unsigned version does not call __int__() so you would no longer be able to pass a float(). Also this could cause compatibility problems with code that was written for earlier documentation, which said to use -1 to mean unlimited. Perhaps that is why the code has rlim_* & RLIM_INFINITY masking.