A small followup with additional comments.
Justin Pryzby wrote:
[]
It seems that your request can be easily satisfied by using the
reentrant versions of these functions, like getpwnam_r. I'm including
a test file I've been playing with, which indicates that a patch, if
necessary, would be unintrusive.
I said it's a PITA to get getpwnam_r() usage right. Here's why:
------------------------------------------------------------------------
#include <unistd.h>
#include <pwd.h>
#include <sys/types.h>
int main()
{
struct passwd p,q;
char *buf,*buf2;
int buflen=sysconf(_SC_GETPW_R_SIZE_MAX);
buf=(char *)malloc(buflen);
buf2=(char *)malloc(buflen);
struct passwd *v=malloc(sizeof (void *));
//struct passwd *p=getpwnam("pryzbyj");
getpwnam_r("pryzbyj", &p, buf, buflen, (struct passwd **)&v);
Here, we have to deal with errno = ERANGE.
I re-read linux getpwnam_r() manpage - it changed since I last looked there.
Now it says:
The maximum needed size for buf can be found using sysconf(3) with the
_SC_GETPW_R_SIZE_MAX parameter.
(exactly the thing you did here). Previously, preferred way
to call getpwnam_r was a loop like this (error checking omitted):
int bufsize = _GETPWNAM_PREFERRED_BUFSIZE;
char *buf = malloc(bufsize);
while((err = getpwnam_r(name, pwent, buf, bufsize, &pwent)) == ERANGE) {
bufsize *= 2;
buf = realloc(buf, bufsize);
}
(again, I don't remember how the constant "GETPWNAM_PREFERRED_BUFSIZE" was
named, it's a "suggested initial bufsize").
Here's what glibc.info says about getpwuid_r():
If a user with ID UID is found, the pointer returned in RESULT
points to the record which contains the wanted data (i.e., RESULT
contains the value RESULT_BUF). If no user is found or if an
error occurred, the pointer returned in RESULT is a null pointer.
The function returns zero or an error code. If the buffer BUFFER
is too small to contain all the needed information, the error code
`ERANGE' is returned and ERRNO is set to `ERANGE'.
(no mention of that POSIX sysconf stuff).
Obviously, this "loop-way" is.. difficult and ugly.
And BTW, not all systems are using /etc/passwd. For other database
implementations, things may be different.
/mjt
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]