bb_getpwuid, bb_getgrgid: change order of arguments to more intuitive one;

comment thoroughly when they die and when they dont.
This commit is contained in:
Denis Vlasenko 2007-07-27 11:20:10 +00:00
parent 661f6fad77
commit 3734b946bf
7 changed files with 68 additions and 87 deletions

View File

@ -20,13 +20,13 @@
#define JUST_USER 4
#define JUST_GROUP 8
#if ENABLE_SELINUX
#define JUST_CONTEXT 16
#define JUST_CONTEXT 16
#endif
static short printf_full(unsigned int id, const char *arg, const char prefix)
static int printf_full(unsigned int id, const char *arg, const char prefix)
{
const char *fmt = "%cid=%u";
short status = EXIT_FAILURE;
int status = EXIT_FAILURE;
if (arg) {
fmt = "%cid=%u(%s)";
@ -71,8 +71,8 @@ int id_main(int argc, char **argv)
if (flags & (JUST_GROUP | JUST_USER USE_SELINUX(| JUST_CONTEXT))) {
/* JUST_GROUP and JUST_USER are mutually exclusive */
if (flags & NAME_NOT_NUMBER) {
/* bb_getpwuid and bb_getgrgid exit on failure so puts cannot segfault */
puts((flags & JUST_USER) ? bb_getpwuid(NULL, uid, -1 ) : bb_getgrgid(NULL, gid, -1 ));
/* bb_getXXXid(-1) exit on failure, puts cannot segfault */
puts((flags & JUST_USER) ? bb_getpwuid(NULL, -1, uid) : bb_getgrgid(NULL, -1, gid));
} else {
if (flags & JUST_USER) {
printf("%u\n", uid);
@ -100,11 +100,10 @@ int id_main(int argc, char **argv)
}
/* Print full info like GNU id */
/* bb_getpwuid doesn't exit on failure here */
status = printf_full(uid, bb_getpwuid(NULL, uid, 0), 'u');
/* bb_getpwuid(0) doesn't exit on failure (returns NULL) */
status = printf_full(uid, bb_getpwuid(NULL, 0, uid), 'u');
putchar(' ');
/* bb_getgrgid doesn't exit on failure here */
status |= printf_full(gid, bb_getgrgid(NULL, gid, 0), 'g');
status |= printf_full(gid, bb_getgrgid(NULL, 0, gid), 'g');
#if ENABLE_SELINUX
if (is_selinux_enabled()) {

View File

@ -19,7 +19,8 @@ int whoami_main(int argc, char **argv)
if (argc > 1)
bb_show_usage();
puts(bb_getpwuid(NULL, geteuid(), -1));
/* Will complain and die if username not found */
puts(bb_getpwuid(NULL, -1, geteuid()));
return fflush(stdout);
}

View File

@ -481,10 +481,14 @@ struct bb_uidgid_t {
int get_uidgid(struct bb_uidgid_t*, const char*, int numeric_ok);
/* chown-like handling of "user[:[group]" */
void parse_chown_usergroup_or_die(struct bb_uidgid_t *u, char *user_group);
/* what is this? */
/*extern char *bb_getug(char *buffer, char *idname, long id, int bufsize, char prefix);*/
char *bb_getpwuid(char *name, long uid, int bufsize);
char *bb_getgrgid(char *group, long gid, int bufsize);
/* 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
*/
char *bb_getpwuid(char *name, int bufsize, long uid);
char *bb_getgrgid(char *group, int bufsize, long gid);
/* versions which cache results (useful for ps, ls etc) */
const char* get_cached_username(uid_t uid);
const char* get_cached_groupname(gid_t gid);
@ -596,6 +600,7 @@ extern const char *opt_complementary;
extern const char *applet_long_options;
#endif
extern uint32_t option_mask32;
/* TODO: don't pass argc, determine it by looking at argv */
extern uint32_t getopt32(int argc, char **argv, const char *applet_opts, ...);

View File

@ -11,22 +11,20 @@
#define assert(x) ((void)0)
/*
* 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 */
static char* bb_getug(char *buffer, char *idname, long id, int bufsize, char prefix)
/* Hacked by Tito Ragusa (c) 2004 <farmatito@tiscali.it> 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);
@ -40,31 +38,29 @@ static char* bb_getug(char *buffer, char *idname, long id, int bufsize, char pre
return idname;
}
/* Hacked by Tito Ragusa (c) 2004 <farmatito@tiscali.it> 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.
/* 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 */
@ -91,32 +87,6 @@ long xuname2uid(const char *name)
return myuser->pw_uid;
}
/* Hacked by Tito Ragusa (c) 2004 <farmatito@tiscali.it> 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');
}
unsigned long get_ug_id(const char *s,
long (*xname2id)(const char *))
{

View File

@ -52,7 +52,7 @@ static int get_cached(cache_t *cp, unsigned id)
}
#endif
typedef char* ug_func(char *name, long uid, int bufsize);
typedef char* ug_func(char *name, int bufsize, long uid);
static char* get_cached(cache_t *cp, unsigned id, ug_func* fp)
{
int i;
@ -62,7 +62,8 @@ static char* get_cached(cache_t *cp, unsigned id, ug_func* fp)
i = cp->size++;
cp->cache = xrealloc(cp->cache, cp->size * sizeof(*cp->cache));
cp->cache[i].id = id;
fp(cp->cache[i].name, id, sizeof(cp->cache[i].name));
/* Never fails. Generates numeric string if name isn't found */
fp(cp->cache[i].name, sizeof(cp->cache[i].name), id);
return cp->cache[i].name;
}
const char* get_cached_username(uid_t uid)

View File

@ -51,13 +51,13 @@ static char* new_password(const struct passwd *pw, uid_t myuid, int algo)
goto err_ret;
}
/*memset(salt, 0, sizeof(salt)); - why?*/
crypt_make_salt(salt, 1, 0); /* des */
if (algo) { /* MD5 */
strcpy(salt, "$1$");
crypt_make_salt(salt + 3, 4, 0);
}
ret = xstrdup(pw_encrypt(newp, salt)); /* returns ptr to static */
/* pw_encrypt returns ptr to static */
ret = xstrdup(pw_encrypt(newp, salt));
/* whee, success! */
err_ret:
@ -80,7 +80,7 @@ int passwd_main(int argc, char **argv)
OPT_delete = 0x8, /* -d - delete password */
OPT_lud = 0xe,
STATE_ALGO_md5 = 0x10,
/*STATE_ALGO_des = 0x20, not needed yet */
//STATE_ALGO_des = 0x20, not needed yet
};
unsigned opt;
int rc;
@ -104,7 +104,7 @@ int passwd_main(int argc, char **argv)
logmode = LOGMODE_BOTH;
openlog(applet_name, LOG_NOWAIT, LOG_AUTH);
opt = getopt32(argc, argv, "a:lud", &opt_a);
argc -= optind;
//argc -= optind;
argv += optind;
if (strcasecmp(opt_a, "des") != 0) /* -a */
@ -112,11 +112,13 @@ int passwd_main(int argc, char **argv)
//else
// opt |= STATE_ALGO_des;
myuid = getuid();
if ((opt & OPT_lud) && (!argc || myuid))
/* -l, -u, -d require root priv and username argument */
if ((opt & OPT_lud) && (myuid || !argv[0]))
bb_show_usage();
myname = xstrdup(bb_getpwuid(NULL, myuid, -1));
name = argc ? argv[0] : myname;
/* Will complain and die if username not found */
myname = xstrdup(bb_getpwuid(NULL, -1, myuid));
name = argv[0] ? argv[0] : myname;
pw = getpwnam(name);
if (!pw) bb_error_msg_and_die("unknown user %s", name);
@ -158,9 +160,12 @@ int passwd_main(int argc, char **argv)
newp = xasprintf("!%s", pw->pw_passwd);
} else if (opt & OPT_unlock) {
if (c) goto skip; /* not '!' */
/* pw->pw_passwd pints to static storage,
* strdup'ing to avoid nasty surprizes */
newp = xstrdup(&pw->pw_passwd[1]);
} else if (opt & OPT_delete) {
newp = xstrdup("");
//newp = xstrdup("");
newp = (char*)"";
}
rlimit_fsize.rlim_cur = rlimit_fsize.rlim_max = 512L * 30000;
@ -177,8 +182,8 @@ int passwd_main(int argc, char **argv)
filename);
bb_info_msg("Password for %s changed by %s", name, myname);
if (ENABLE_FEATURE_CLEAN_UP) free(newp);
skip:
//if (ENABLE_FEATURE_CLEAN_UP) free(newp);
skip:
if (!newp) {
bb_error_msg_and_die("password for %s is already %slocked",
name, (opt & OPT_unlock) ? "un" : "");

View File

@ -89,7 +89,7 @@ int logger_main(int argc, char **argv)
char name[80];
/* Fill out the name string early (may be overwritten later) */
bb_getpwuid(name, geteuid(), sizeof(name));
bb_getpwuid(name, sizeof(name), geteuid());
str_t = name;
/* Parse any options */