diff --git a/lib/libc/gen/confstr.3 b/lib/libc/gen/confstr.3 index 3eac2ab225b3..53100304176a 100644 --- a/lib/libc/gen/confstr.3 +++ b/lib/libc/gen/confstr.3 @@ -1,4 +1,4 @@ -.\" $NetBSD: confstr.3,v 1.15 2003/08/07 16:42:46 agc Exp $ +.\" $NetBSD: confstr.3,v 1.16 2006/12/03 00:39:19 christos Exp $ .\" .\" Copyright (c) 1993 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" @(#)confstr.3 8.1 (Berkeley) 6/4/93 .\" -.Dd June 4, 1993 +.Dd December 2, 2006 .Dt CONFSTR 3 .Os .Sh NAME @@ -86,7 +86,7 @@ environment variable that finds all the standard utilities. .Sh RETURN VALUES If the call to .Nm confstr -is not successful, ((size_t)-1) is returned and +is not successful, is returned and .Va errno is set appropriately. Otherwise, if the variable does not have a configuration defined value, @@ -124,6 +124,9 @@ The .Nm confstr function conforms to .St -p1003.2-92 . +.Sh BUGS +The standards require us to return 0 both on errors, and when the value +is not set. .Sh HISTORY The .Nm confstr diff --git a/lib/libc/gen/confstr.c b/lib/libc/gen/confstr.c index 1cbbc0e46a9e..4641e94635c4 100644 --- a/lib/libc/gen/confstr.c +++ b/lib/libc/gen/confstr.c @@ -1,4 +1,4 @@ -/* $NetBSD: confstr.c,v 1.11 2003/08/07 16:42:46 agc Exp $ */ +/* $NetBSD: confstr.c,v 1.12 2006/12/03 00:39:19 christos Exp $ */ /*- * Copyright (c) 1993 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)confstr.c 8.1 (Berkeley) 6/4/93"; #else -__RCSID("$NetBSD: confstr.c,v 1.11 2003/08/07 16:42:46 agc Exp $"); +__RCSID("$NetBSD: confstr.c,v 1.12 2006/12/03 00:39:19 christos Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -62,33 +62,37 @@ confstr(name, buf, len) int mib[2], sverrno; char *p; + /* + * POSIX 1003.2 requires errors to return 0 -- + * that is *really* useful. + */ switch (name) { case _CS_PATH: mib[0] = CTL_USER; mib[1] = USER_CS_PATH; if (sysctl(mib, 2, NULL, &tlen, NULL, 0) == -1) - return (size_t)-1; + return 0; if (len != 0 && buf != NULL) { if ((p = malloc(tlen)) == NULL) - return (size_t)-1; + return 0; if (sysctl(mib, 2, p, &tlen, NULL, 0) == -1) { sverrno = errno; free(p); errno = sverrno; - return (size_t)-1; + return 0; } /* * POSIX 1003.2 requires partial return of - * the string -- that should be *real* useful. + * the string -- that is even more useful. */ (void)strncpy(buf, p, len - 1); buf[len - 1] = '\0'; free(p); } - return (tlen + 1); + return tlen + 1; default: errno = EINVAL; - return (0); + return 0; } /* NOTREACHED */ }