Correct implementation and documentation of os.confstr. Add a simple test
case. I've yet to figure out how to provoke a None return I can test.
diff --git a/Doc/lib/libos.tex b/Doc/lib/libos.tex
index ebe3021..9ded3ae 100644
--- a/Doc/lib/libos.tex
+++ b/Doc/lib/libos.tex
@@ -1844,14 +1844,14 @@
string which is the name of a defined system value; these names are
specified in a number of standards (\POSIX, \UNIX{} 95, \UNIX{} 98, and
others). Some platforms define additional names as well. The names
-known to the host operating system are given in the
+known to the host operating system are given as the keys of the
\code{confstr_names} dictionary. For configuration variables not
included in that mapping, passing an integer for \var{name} is also
accepted.
Availability: Macintosh, \UNIX.
-If the configuration value specified by \var{name} isn't defined, the
-empty string is returned.
+If the configuration value specified by \var{name} isn't defined,
+\code{None} is returned.
If \var{name} is a string and is not known, \exception{ValueError} is
raised. If a specific value for \var{name} is not supported by the
diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
index 1ccc62b..f98c723 100644
--- a/Lib/test/test_posix.py
+++ b/Lib/test/test_posix.py
@@ -73,6 +73,11 @@
finally:
fp.close()
+ def test_confstr(self):
+ if hasattr(posix, 'confstr'):
+ self.assertRaises(ValueError, posix.confstr, "CS_garbage")
+ self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
+
def test_dup2(self):
if hasattr(posix, 'dup2'):
fp1 = open(test_support.TESTFN)
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index d91d8b5..4c462a0 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -6817,15 +6817,18 @@
errno = 0;
len = confstr(name, buffer, sizeof(buffer));
- if (len == -1) {
- posix_error();
- }
- else if (len == 0) {
- result = PyString_FromString("");
+ if (len == 0) {
+ if (errno) {
+ posix_error();
+ }
+ else {
+ result = Py_None;
+ Py_INCREF(Py_None);
+ }
}
else {
if ((unsigned int)len >= sizeof(buffer)) {
- result = PyString_FromStringAndSize(NULL, len);
+ result = PyString_FromStringAndSize(NULL, len+1);
if (result != NULL)
confstr(name, PyString_AS_STRING(result), len+1);
}