bb_getpwuid, bb_getgrgid: change order of arguments to more intuitive one;
authorDenis Vlasenko <vda.linux@googlemail.com>
Fri, 27 Jul 2007 11:20:10 +0000 (11:20 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Fri, 27 Jul 2007 11:20:10 +0000 (11:20 -0000)
comment thoroughly when they die and when they dont.

coreutils/id.c
coreutils/whoami.c
include/libbb.h
libbb/bb_pwd.c
libbb/procps.c
loginutils/passwd.c
sysklogd/logger.c

index 27fb26e77ce9b324bfeed2b9504abe1806396e02..614d6d064078f9d785853e11b6f1a01d58a70add 100644 (file)
 #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()) {
index 156516fa772b47c5f5fe79ec55c2fc1de858bed4..3718358d5d195a4bde3c903061490761377ccf4a 100644 (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);
 }
index 8fb5520ebd7be0c4d14403eb85d43d1b1563f170..82cee380b714d81abab226416a0350f2f678fce7 100644 (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, ...);
 
 
index 3af1994d59ee9d806474eb327704d3e33be48d6d..2bdb66230efd22bf2273c21f77fef6cac0ab0f5b 100644 (file)
 
 #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 *))
 {
index 37593700a6ca89ca2a29d81b4738e9b472b7eaca..aa207af6f9b1fd0ddaf33c2deece78e1a4c587bd 100644 (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)
index cd98d410180a08ff9af600686b7a0414d6548d64..a293ee9268c399035b3542502134b242024f0d56 100644 (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" : "");
index d9c3e5048969423d6fb454be3308f89fe76a1aa7..3f67aff5ce99ef8eaf119687004ad61830cbbcb2 100644 (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 */