Kaydet (Commit) 94785ef1 authored tarafından Skip Montanaro's avatar Skip Montanaro

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.
üst d0b8e83d
...@@ -1844,14 +1844,14 @@ Return string-valued system configuration values. ...@@ -1844,14 +1844,14 @@ Return string-valued system configuration values.
string which is the name of a defined system value; these names are 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 specified in a number of standards (\POSIX, \UNIX{} 95, \UNIX{} 98, and
others). Some platforms define additional names as well. The names 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 \code{confstr_names} dictionary. For configuration variables not
included in that mapping, passing an integer for \var{name} is also included in that mapping, passing an integer for \var{name} is also
accepted. accepted.
Availability: Macintosh, \UNIX. Availability: Macintosh, \UNIX.
If the configuration value specified by \var{name} isn't defined, the If the configuration value specified by \var{name} isn't defined,
empty string is returned. \code{None} is returned.
If \var{name} is a string and is not known, \exception{ValueError} is 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 raised. If a specific value for \var{name} is not supported by the
......
...@@ -73,6 +73,11 @@ class PosixTester(unittest.TestCase): ...@@ -73,6 +73,11 @@ class PosixTester(unittest.TestCase):
finally: finally:
fp.close() 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): def test_dup2(self):
if hasattr(posix, 'dup2'): if hasattr(posix, 'dup2'):
fp1 = open(test_support.TESTFN) fp1 = open(test_support.TESTFN)
......
...@@ -6817,15 +6817,18 @@ posix_confstr(PyObject *self, PyObject *args) ...@@ -6817,15 +6817,18 @@ posix_confstr(PyObject *self, PyObject *args)
errno = 0; errno = 0;
len = confstr(name, buffer, sizeof(buffer)); len = confstr(name, buffer, sizeof(buffer));
if (len == -1) { if (len == 0) {
posix_error(); if (errno) {
} posix_error();
else if (len == 0) { }
result = PyString_FromString(""); else {
result = Py_None;
Py_INCREF(Py_None);
}
} }
else { else {
if ((unsigned int)len >= sizeof(buffer)) { if ((unsigned int)len >= sizeof(buffer)) {
result = PyString_FromStringAndSize(NULL, len); result = PyString_FromStringAndSize(NULL, len+1);
if (result != NULL) if (result != NULL)
confstr(name, PyString_AS_STRING(result), len+1); confstr(name, PyString_AS_STRING(result), len+1);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment