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

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

View File

@ -19,7 +19,8 @@ int whoami_main(int argc, char **argv)
if (argc > 1) if (argc > 1)
bb_show_usage(); 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); 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); int get_uidgid(struct bb_uidgid_t*, const char*, int numeric_ok);
/* chown-like handling of "user[:[group]" */ /* chown-like handling of "user[:[group]" */
void parse_chown_usergroup_or_die(struct bb_uidgid_t *u, char *user_group); void parse_chown_usergroup_or_die(struct bb_uidgid_t *u, char *user_group);
/* what is this? */ /* bb_getpwuid, bb_getgrgid:
/*extern char *bb_getug(char *buffer, char *idname, long id, int bufsize, char prefix);*/ bb_getXXXid(buf, bufsz, id) - copy user/group name or id
char *bb_getpwuid(char *name, long uid, int bufsize); as a string to buf, return user/group name or NULL
char *bb_getgrgid(char *group, long gid, int bufsize); 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) */ /* versions which cache results (useful for ps, ls etc) */
const char* get_cached_username(uid_t uid); const char* get_cached_username(uid_t uid);
const char* get_cached_groupname(gid_t gid); const char* get_cached_groupname(gid_t gid);
@ -596,6 +600,7 @@ extern const char *opt_complementary;
extern const char *applet_long_options; extern const char *applet_long_options;
#endif #endif
extern uint32_t option_mask32; 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, ...); extern uint32_t getopt32(int argc, char **argv, const char *applet_opts, ...);

View File

@ -11,22 +11,20 @@
#define assert(x) ((void)0) #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 */ /* 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) { if (bufsize > 0) {
assert(buffer != NULL); assert(buffer != NULL);
@ -40,31 +38,29 @@ static char* bb_getug(char *buffer, char *idname, long id, int bufsize, char pre
return idname; return idname;
} }
/* Hacked by Tito Ragusa (c) 2004 <farmatito@tiscali.it> to make it more /* bb_getpwuid, bb_getgrgid:
* flexible : * bb_getXXXid(buf, bufsz, id) - copy user/group name or id
* * as a string to buf, return user/group name or NULL
* if bufsize is > 0 char *group cannot be set to NULL. * bb_getXXXid(NULL, 0, id) - return user/group name or NULL
* On success groupname is written on static allocated buffer * bb_getXXXid(NULL, -1, id) - return user/group name or exit
* 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.
*/ */
/* 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 */ /* 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); struct group *mygroup = getgrgid(gid);
return bb_getug(group, return bb_getug(group, bufsize,
mygroup ? mygroup->gr_name : (char *)mygroup, (mygroup ? mygroup->gr_name : (char*)mygroup),
gid, bufsize, 'g'); gid, 'g');
} }
/* returns a gid given a group name */ /* returns a gid given a group name */
@ -91,32 +87,6 @@ long xuname2uid(const char *name)
return myuser->pw_uid; 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, unsigned long get_ug_id(const char *s,
long (*xname2id)(const char *)) long (*xname2id)(const char *))
{ {

View File

@ -52,7 +52,7 @@ static int get_cached(cache_t *cp, unsigned id)
} }
#endif #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) static char* get_cached(cache_t *cp, unsigned id, ug_func* fp)
{ {
int i; int i;
@ -62,7 +62,8 @@ static char* get_cached(cache_t *cp, unsigned id, ug_func* fp)
i = cp->size++; i = cp->size++;
cp->cache = xrealloc(cp->cache, cp->size * sizeof(*cp->cache)); cp->cache = xrealloc(cp->cache, cp->size * sizeof(*cp->cache));
cp->cache[i].id = id; 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; return cp->cache[i].name;
} }
const char* get_cached_username(uid_t uid) 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; goto err_ret;
} }
/*memset(salt, 0, sizeof(salt)); - why?*/
crypt_make_salt(salt, 1, 0); /* des */ crypt_make_salt(salt, 1, 0); /* des */
if (algo) { /* MD5 */ if (algo) { /* MD5 */
strcpy(salt, "$1$"); strcpy(salt, "$1$");
crypt_make_salt(salt + 3, 4, 0); 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! */ /* whee, success! */
err_ret: err_ret:
@ -80,7 +80,7 @@ int passwd_main(int argc, char **argv)
OPT_delete = 0x8, /* -d - delete password */ OPT_delete = 0x8, /* -d - delete password */
OPT_lud = 0xe, OPT_lud = 0xe,
STATE_ALGO_md5 = 0x10, STATE_ALGO_md5 = 0x10,
/*STATE_ALGO_des = 0x20, not needed yet */ //STATE_ALGO_des = 0x20, not needed yet
}; };
unsigned opt; unsigned opt;
int rc; int rc;
@ -104,7 +104,7 @@ int passwd_main(int argc, char **argv)
logmode = LOGMODE_BOTH; logmode = LOGMODE_BOTH;
openlog(applet_name, LOG_NOWAIT, LOG_AUTH); openlog(applet_name, LOG_NOWAIT, LOG_AUTH);
opt = getopt32(argc, argv, "a:lud", &opt_a); opt = getopt32(argc, argv, "a:lud", &opt_a);
argc -= optind; //argc -= optind;
argv += optind; argv += optind;
if (strcasecmp(opt_a, "des") != 0) /* -a */ if (strcasecmp(opt_a, "des") != 0) /* -a */
@ -112,11 +112,13 @@ int passwd_main(int argc, char **argv)
//else //else
// opt |= STATE_ALGO_des; // opt |= STATE_ALGO_des;
myuid = getuid(); 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(); bb_show_usage();
myname = xstrdup(bb_getpwuid(NULL, myuid, -1)); /* Will complain and die if username not found */
name = argc ? argv[0] : myname; myname = xstrdup(bb_getpwuid(NULL, -1, myuid));
name = argv[0] ? argv[0] : myname;
pw = getpwnam(name); pw = getpwnam(name);
if (!pw) bb_error_msg_and_die("unknown user %s", 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); newp = xasprintf("!%s", pw->pw_passwd);
} else if (opt & OPT_unlock) { } else if (opt & OPT_unlock) {
if (c) goto skip; /* not '!' */ if (c) goto skip; /* not '!' */
/* pw->pw_passwd pints to static storage,
* strdup'ing to avoid nasty surprizes */
newp = xstrdup(&pw->pw_passwd[1]); newp = xstrdup(&pw->pw_passwd[1]);
} else if (opt & OPT_delete) { } else if (opt & OPT_delete) {
newp = xstrdup(""); //newp = xstrdup("");
newp = (char*)"";
} }
rlimit_fsize.rlim_cur = rlimit_fsize.rlim_max = 512L * 30000; rlimit_fsize.rlim_cur = rlimit_fsize.rlim_max = 512L * 30000;
@ -177,8 +182,8 @@ int passwd_main(int argc, char **argv)
filename); filename);
bb_info_msg("Password for %s changed by %s", name, myname); bb_info_msg("Password for %s changed by %s", name, myname);
if (ENABLE_FEATURE_CLEAN_UP) free(newp); //if (ENABLE_FEATURE_CLEAN_UP) free(newp);
skip: skip:
if (!newp) { if (!newp) {
bb_error_msg_and_die("password for %s is already %slocked", bb_error_msg_and_die("password for %s is already %slocked",
name, (opt & OPT_unlock) ? "un" : ""); name, (opt & OPT_unlock) ? "un" : "");

View File

@ -89,7 +89,7 @@ int logger_main(int argc, char **argv)
char name[80]; char name[80];
/* Fill out the name string early (may be overwritten later) */ /* 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; str_t = name;
/* Parse any options */ /* Parse any options */