From 0ea5db4f1f55e55942f6afd0e4e69ceb2163ed25 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 30 Jun 1999 17:16:08 +0000 Subject: Update. 1999-06-28 Andreas Jaeger * inet/rcmd.c (__icheckhost): Test for gethostbyname_r result correctly. 1999-06-25 Andreas Jaeger * manual/arith.texi (System V Number Conversion): Fix the description which confused pointer and value to pointer. Reported by Andries.Brouwer@cwi.nl. 1999-06-28 Andreas Jaeger * pwd/getpw.c (__getpw): Check for NULL result pointer. 1999-06-29 Andreas Jaeger * manual/users.texi (Lookup User): Document POSIX return semantics for getpwuid_r and getgrgid_r. * manual/socket.texi (Host Names): Document that the result pointer is null in case of error or host not found and fix a typo. Give a small example. --- ChangeLog | 24 ++++++++++++++++++++++++ inet/rcmd.c | 2 +- manual/arith.texi | 28 ++++++++++++++-------------- manual/socket.texi | 45 +++++++++++++++++++++++++++++++++++++-------- manual/users.texi | 28 ++++++++++++++++------------ pwd/getpw.c | 3 +++ 6 files changed, 95 insertions(+), 35 deletions(-) diff --git a/ChangeLog b/ChangeLog index 468a2ad81e..4c4ecd8c40 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,27 @@ +1999-06-28 Andreas Jaeger + + * inet/rcmd.c (__icheckhost): Test for gethostbyname_r result + correctly. + +1999-06-25 Andreas Jaeger + + * manual/arith.texi (System V Number Conversion): Fix the + description which confused pointer and value to pointer. + Reported by Andries.Brouwer@cwi.nl. + +1999-06-28 Andreas Jaeger + + * pwd/getpw.c (__getpw): Check for NULL result pointer. + +1999-06-29 Andreas Jaeger + + * manual/users.texi (Lookup User): Document POSIX return + semantics for getpwuid_r and getgrgid_r. + + * manual/socket.texi (Host Names): Document that the result + pointer is null in case of error or host not found and fix a + typo. Give a small example. + 1999-06-30 Ulrich Drepper * pwd/getpw.c: Add warning since no buffer size is given and diff --git a/inet/rcmd.c b/inet/rcmd.c index d8235daf70..923f21fe40 100644 --- a/inet/rcmd.c +++ b/inet/rcmd.c @@ -270,7 +270,7 @@ ruserok(rhost, superuser, ruser, luser) buffer = __alloca (buflen); while (__gethostbyname_r (rhost, &hostbuf, buffer, buflen, &hp, &herr) - < 0) + != 0) if (herr != NETDB_INTERNAL || errno != ERANGE) return -1; else diff --git a/manual/arith.texi b/manual/arith.texi index 7879a77b7c..1a24beb7ca 100644 --- a/manual/arith.texi +++ b/manual/arith.texi @@ -2191,13 +2191,13 @@ All these functions are defined in @file{stdlib.h}. @comment SVID, Unix98 @deftypefun {char *} ecvt (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}) The function @code{ecvt} converts the floating-point number @var{value} -to a string with at most @var{ndigit} decimal digits. -The returned string contains no decimal point or sign. The first -digit of the string is non-zero (unless @var{value} is actually zero) -and the last digit is rounded to nearest. @var{decpt} is set to the +to a string with at most @var{ndigit} decimal digits. The +returned string contains no decimal point or sign. The first digit of +the string is non-zero (unless @var{value} is actually zero) and the +last digit is rounded to nearest. @code{*@var{decpt}} is set to the index in the string of the first digit after the decimal point. -@var{neg} is set to a nonzero value if @var{value} is negative, zero -otherwise. +@code{*@var{neg}} is set to a nonzero value if @var{value} is negative, +zero otherwise. If @var{ndigit} decimal digits would exceed the precision of a @code{double} it is reduced to a system-specific value. @@ -2205,16 +2205,16 @@ If @var{ndigit} decimal digits would exceed the precision of a The returned string is statically allocated and overwritten by each call to @code{ecvt}. -If @var{value} is zero, it's implementation defined whether @var{decpt} is -@code{0} or @code{1}. +If @var{value} is zero, it is implementation defined whether +@code{*@var{decpt}} is @code{0} or @code{1}. -For example: @code{ecvt (12.3, 5, &decpt, &neg)} returns @code{"12300"} -and sets @var{decpt} to @code{2} and @var{neg} to @code{0}. +For example: @code{ecvt (12.3, 5, &d, &n)} returns @code{"12300"} +and sets @var{d} to @code{2} and @var{n} to @code{0}. @end deftypefun @comment stdlib.h @comment SVID, Unix98 -@deftypefun {char *} fcvt (double @var{value}, int @var{ndigit}, int @var{decpt}, int *@var{neg}) +@deftypefun {char *} fcvt (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}) The function @code{fcvt} is like @code{ecvt}, but @var{ndigit} specifies the number of digits after the decimal point. If @var{ndigit} is less than zero, @var{value} is rounded to the @math{@var{ndigit}+1}'th place to the @@ -2254,7 +2254,7 @@ restricted by the precision of a @code{long double}. @comment stdlib.h @comment GNU -@deftypefun {char *} qfcvt (long double @var{value}, int @var{ndigit}, int @var{decpt}, int *@var{neg}) +@deftypefun {char *} qfcvt (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}) This function is equivalent to @code{fcvt} except that it takes a @code{long double} for the first parameter and that @var{ndigit} is restricted by the precision of a @code{long double}. @@ -2292,7 +2292,7 @@ This function is a GNU extension. @comment stdlib.h @comment SVID, Unix98 -@deftypefun {char *} fcvt_r (double @var{value}, int @var{ndigit}, int @var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len}) +@deftypefun {char *} fcvt_r (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len}) The @code{fcvt_r} function is the same as @code{fcvt}, except that it places its result into the user-specified buffer pointed to by @var{buf}, with length @var{len}. @@ -2312,7 +2312,7 @@ This function is a GNU extension. @comment stdlib.h @comment GNU -@deftypefun {char *} qfcvt_r (long double @var{value}, int @var{ndigit}, int @var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len}) +@deftypefun {char *} qfcvt_r (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len}) The @code{qfcvt_r} function is the same as @code{qfcvt}, except that it places its result into the user-specified buffer pointed to by @var{buf}, with length @var{len}. diff --git a/manual/socket.texi b/manual/socket.texi index b9102c62e1..d77e556214 100644 --- a/manual/socket.texi +++ b/manual/socket.texi @@ -1284,13 +1284,42 @@ pointer and the size of the buffer in the @var{buf} and @var{buflen} parameters. A pointer to the buffer, in which the result is stored, is available in -@code{*@var{result}} after the function call successfully returned. -Success is signalled by a zero return value. If the function failed the -return value is an error number. In addition to the errors defined for -@code{gethostbyname} it can also be @code{ERANGE}. In this case the -call should be repeated with a larger buffer. Additional error -information is not stored in the global variable @code{h_errno} but -instead in the object pointed to by @var{h_errnop}. +@code{*@var{result}} after the function call successfully returned. If +an error occurs or if no entry is found, the pointer @code{*var{result} +is a null pointer. Success is signalled by a zero return value. If the +function failed the return value is an error number. In addition to the +errors defined for @code{gethostbyname} it can also be @code{ERANGE}. +In this case the call should be repeated with a larger buffer. +Additional error information is not stored in the global variable +@code{h_errno} but instead in the object pointed to by @var{h_errnop}. + +Here's a small example: +@smallexample +struct hostent * +gethostname (char *host) +@{ + struct hostent hostbuf, *hp; + size_t hstbuflen; + char *tmphstbuf; + int res; + int herr; + + hstbuflen = 1024; + tmphstbuf = malloc (hstbuflen); + + while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf, hstbuflen, + &hp, &herr)) == ERANGE) + @{ + /* Enlarge the buffer. */ + hstbuflen *= 2; + tmphstbuf = realloc (tmphstbuf, hstbuflen); + @} + /* Check for errors. */ + if (res || hp == NULL) + return NULL; + return hp->h_name; +@} +@end smallexample @end deftypefun @comment netdb.h @@ -1314,7 +1343,7 @@ Internet address, use @code{AF_INET6}. Similar to the @code{gethostbyname_r} function, the caller must provide buffers for the result and memory used internally. In case of success -the funciton returns zero. Otherwise the value is an error number where +the function returns zero. Otherwise the value is an error number where @code{ERANGE} has the special meaning that the caller-provided buffer is too small. @end deftypefun diff --git a/manual/users.texi b/manual/users.texi index e1c0430279..7317f5efa2 100644 --- a/manual/users.texi +++ b/manual/users.texi @@ -1479,12 +1479,14 @@ the information instead of using a static buffer. The first are used to contain additional information, normally strings which are pointed to by the elements of the result structure. -If the return value is @code{0} the pointer returned in @var{result} -points to the record which contains the wanted data (i.e., @var{result} -contains the value @var{result_buf}). If it is nonzero, there is no -user in the data base with user ID @var{uid}, or the buffer @var{buffer} -is too small to contain all the needed information. In the latter case, -@var{errno} is set to @code{ERANGE}. +If a user with ID @var{uid} is found, the pointer returned in +@var{result} points to the record which contains the wanted data (i.e., +@var{result} contains the value @var{result_buf}). If no user is found +or if an error occured, the pointer returned in @var{result} is a null +pointer. The function returns zero or an error code. If the buffer +@var{buffer} is too small to contain all the needed information, the +error code @code{ERANGE} is returned and @var{errno} is set to +@code{ERANGE}. @end deftypefun @@ -1690,12 +1692,14 @@ the information instead of using a static buffer. The first are used to contain additional information, normally strings which are pointed to by the elements of the result structure. -If the return value is @code{0} the pointer returned in @var{result} -points to the requested data (i.e., @var{result} contains the value -@var{result_buf}). If it is nonzero, there is no group in the data base -with group ID @var{gid}, or the buffer @var{buffer} is too small to -contain all the needed information. In the latter case, @var{errno} is -set to @code{ERANGE}. +If a group with ID @var{gid} is found, the pointer returned in +@var{result} points to the record which contains the wanted data (i.e., +@var{result} contains the value @var{result_buf}). If no group is found +or if an error occured, the pointer returned in @var{result} is a null +pointer. The function returns zero or an error code. If the buffer +@var{buffer} is too small to contain all the needed information, the +error code @code{ERANGE} is returned and @var{errno} is set to +@code{ERANGE}. @end deftypefun @comment grp.h diff --git a/pwd/getpw.c b/pwd/getpw.c index e291769237..5973ef0eea 100644 --- a/pwd/getpw.c +++ b/pwd/getpw.c @@ -50,6 +50,9 @@ __getpw (uid, buf) if (__getpwuid_r (uid, &resbuf, tmpbuf, buflen, &p) != 0) return -1; + if (p == NULL) + return -1; + if (sprintf (buf, "%s:%s:%lu:%lu:%s:%s:%s", p->pw_name, p->pw_passwd, (unsigned long int) p->pw_uid, (unsigned long int) p->pw_gid, p->pw_gecos, p->pw_dir, p->pw_shell) < 0) -- cgit v1.2.3