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:
parent
661f6fad77
commit
3734b946bf
@ -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()) {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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, ...);
|
||||||
|
|
||||||
|
|
||||||
|
@ -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 *))
|
||||||
{
|
{
|
||||||
|
@ -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)
|
||||||
|
@ -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" : "");
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user