X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Fbb_pwd.c;h=2bdb66230efd22bf2273c21f77fef6cac0ab0f5b;hb=d21f596ddb294bdb65623ba1d0e49b17d0829229;hp=1776fa4f6a58b75c51c6b963154b71cdcdad6970;hpb=e1a0d486e4804eae098571f1a6788394c2ee51ae;p=oweals%2Fbusybox.git diff --git a/libbb/bb_pwd.c b/libbb/bb_pwd.c index 1776fa4f6..2bdb66230 100644 --- a/libbb/bb_pwd.c +++ b/libbb/bb_pwd.c @@ -7,126 +7,93 @@ * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. */ -#include -#include -#include #include "libbb.h" - /* Hacked by Tito Ragusa (c) 2004 to make it more - * flexible : - * - * if bufsize is > 0 char *group cannot be set to NULL. - * On success groupname is written on static allocated buffer - * group (and a pointer to it is returned). - * On failure gid as string is written to static allocated - * buffer group and NULL is returned. - * if bufsize is = 0 char *group can be set to NULL. - * On success groupname is returned. - * On failure NULL is returned. - * if bufsize is < 0 char *group can be set to NULL. - * On success groupname is returned. - * On failure an error message is printed and - * the program exits. - */ +#define assert(x) ((void)0) +/* internal function for bb_getpwuid and bb_getgrgid */ +/* Hacked by Tito Ragusa (c) 2004 to make it more + * flexible: + * + * bufsize > 0: If idname is not NULL it is copied to buffer, + * and buffer is returned. Else id as string is written + * to buffer, and NULL is returned. + * + * bufsize == 0: idname is returned. + * + * bufsize < 0: If idname is not NULL it is returned. + * Else an error message is printed and the program exits. + */ +static char* bb_getug(char *buffer, int bufsize, char *idname, long id, char prefix) +{ + if (bufsize > 0) { + assert(buffer != NULL); + if (idname) { + return safe_strncpy(buffer, idname, bufsize); + } + snprintf(buffer, bufsize, "%ld", id); + } else if (bufsize < 0 && !idname) { + bb_error_msg_and_die("unknown %cid %ld", prefix, id); + } + return idname; +} + +/* bb_getpwuid, bb_getgrgid: + * bb_getXXXid(buf, bufsz, id) - copy user/group name or id + * as a string to buf, return user/group name or NULL + * bb_getXXXid(NULL, 0, id) - return user/group name or NULL + * bb_getXXXid(NULL, -1, id) - return user/group name or exit + */ +/* gets a username given a uid */ +char* bb_getpwuid(char *name, int bufsize, long uid) +{ + struct passwd *myuser = getpwuid(uid); + + return bb_getug(name, bufsize, + (myuser ? myuser->pw_name : (char*)myuser), + uid, 'u'); +} /* gets a groupname given a gid */ -char * bb_getgrgid(char *group, long gid, int bufsize) +char* bb_getgrgid(char *group, int bufsize, long gid) { struct group *mygroup = getgrgid(gid); - return bb_getug(group, (mygroup) ? - mygroup->gr_name : (char *)mygroup, gid, bufsize, 'g'); + return bb_getug(group, bufsize, + (mygroup ? mygroup->gr_name : (char*)mygroup), + gid, 'g'); } /* returns a gid given a group name */ -long bb_xgetgrnam(const char *name) +long xgroup2gid(const char *name) { struct group *mygroup; - mygroup = getgrnam(name); - if (mygroup==NULL) + mygroup = getgrnam(name); + if (mygroup == NULL) bb_error_msg_and_die("unknown group name: %s", name); - return (mygroup->gr_gid); + return mygroup->gr_gid; } /* returns a uid given a username */ -long bb_xgetpwnam(const char *name) +long xuname2uid(const char *name) { struct passwd *myuser; - myuser = getpwnam(name); - if (myuser==NULL) + myuser = getpwnam(name); + if (myuser == NULL) bb_error_msg_and_die("unknown user name: %s", name); return myuser->pw_uid; } - /* Hacked by Tito Ragusa (c) 2004 to make it more - * flexible : - * - * if bufsize is > 0 char *name cannot be set to NULL. - * On success username is written on the static allocated - * buffer name (and a pointer to it is returned). - * On failure uid as string is written to the static - * allocated buffer name and NULL is returned. - * if bufsize is = 0 char *name can be set to NULL. - * On success username is returned. - * On failure NULL is returned. - * if bufsize is < 0 char *name can be set to NULL - * On success username is returned. - * On failure an error message is printed and - * the program exits. - */ - -/* gets a username given a uid */ -char * bb_getpwuid(char *name, long uid, int bufsize) -{ - struct passwd *myuser = getpwuid(uid); - - return bb_getug(name, (myuser) ? - myuser->pw_name : (char *)myuser , uid, bufsize, 'u'); -} - - /* - * if bufsize is > 0 char *buffer cannot be set to NULL. - * If idname is not NULL it is written on the static - * allocated buffer (and a pointer to it is returned). - * if idname is NULL, id as string is written to the static - * allocated buffer and NULL is returned. - * if bufsize is = 0 char *buffer can be set to NULL. - * If idname exists a pointer to it is returned, - * else NULL is returned. - * if bufsize is < 0 char *buffer can be set to NULL. - * If idname exists a pointer to it is returned, - * else an error message is printed and the program exits. - */ - -/* internal function for bb_getpwuid and bb_getgrgid */ -char * bb_getug(char *buffer, char *idname, long id, int bufsize, char prefix) -{ - if(bufsize > 0 ) { - assert(buffer!=NULL); - if(idname) { - return safe_strncpy(buffer, idname, bufsize); - } - snprintf(buffer, bufsize, "%ld", id); - } else if(bufsize < 0 && !idname) { - bb_error_msg_and_die("unknown %cid %ld", prefix, id); - } - return idname; -} - unsigned long get_ug_id(const char *s, - long (*__bb_getxxnam)(const char *)) + long (*xname2id)(const char *)) { unsigned long r; - char *p; - - r = strtoul(s, &p, 10); - if (*p || (s == p)) { - r = __bb_getxxnam(s); - } + r = bb_strtoul(s, NULL, 10); + if (errno) + return xname2id(s); return r; }