comment thoroughly when they die and when they dont.
#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)";
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);
}
/* 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()) {
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);
}
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);
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, ...);
#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);
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 */
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 *))
{
}
#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;
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)
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:
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;
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 */
//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);
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;
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" : "");
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 */