Tito writes:
No binary (build failed)
—
(log yok)
| @@ -21,90 +21,121 @@ | |
| */ | |
| /* BB_AUDIT SUSv3 _NOT_ compliant -- option -G is not currently supported. */ | |
| + | /* Hacked by Tito Ragusa (C) 2004 to handle usernames of whatever length and to |
| + | * be more similar to GNU id. |
| + | */ |
| #include "busybox.h" | |
| + | #include "grp_.h" |
| + | #include "pwd_.h" |
| #include <stdio.h> | |
| #include <unistd.h> | |
| #include <getopt.h> | |
| #include <string.h> | |
| #include <sys/types.h> | |
| + | |
| #ifdef CONFIG_SELINUX | |
| #include <proc_secure.h> | |
| #include <flask_util.h> | |
| #endif | |
| - | #define JUST_USER 1 |
| - | #define JUST_GROUP 2 |
| - | #define PRINT_REAL 4 |
| - | #define NAME_NOT_NUMBER 8 |
| + | #define PRINT_REAL 1 |
| + | #define NAME_NOT_NUMBER 2 |
| + | #define JUST_USER 4 |
| + | #define JUST_GROUP 8 |
| + | |
| + | void printf_full(unsigned int id, char *arg, char prefix) |
| + | { |
| + | printf("%cid=%u",prefix, id); |
| + | if(arg) |
| + | printf("(%s) ", arg); |
| + | } |
| extern int id_main(int argc, char **argv) | |
| { | |
| - | char user[32], group[32]; |
| - | long pwnam, grnam; |
| - | int uid, gid; |
| + | struct passwd *p; |
| + | char *user; |
| + | char *group; |
| + | uid_t uid; |
| + | gid_t gid; |
| int flags; | |
| #ifdef CONFIG_SELINUX | |
| int is_flask_enabled_flag = is_flask_enabled(); | |
| #endif | |
| - | flags = bb_getopt_ulflags(argc, argv, "ugrn"); |
| + | bb_opt_complementaly = "u~g:g~u"; |
| + | flags = bb_getopt_ulflags(argc, argv, "rnug"); |
| - | if (((flags & (JUST_USER | JUST_GROUP)) == (JUST_USER | JUST_GROUP)) |
| - | || (argc > optind + 1) |
| - | ) { |
| + | if ((flags & 0x80000000UL) |
| + | /* Don't allow -n -r -nr */ |
| + | || (flags <= 3 && flags > 0) |
| + | || (argc > optind + 1)) |
| bb_show_usage(); | |
| + | |
| + | /* This values could be overwritten later */ |
| + | uid = geteuid(); |
| + | gid = getegid(); |
| + | if (flags & PRINT_REAL) { |
| + | uid = getuid(); |
| + | gid = getgid(); |
| } | |
| + | |
| + | if(argv[optind]) |
| + | { |
| - | if (argv[optind] == NULL) { |
| - | if (flags & PRINT_REAL) { |
| - | uid = getuid(); |
| - | gid = getgid(); |
| - | } else { |
| - | uid = geteuid(); |
| - | gid = getegid(); |
| - | } |
| - | my_getpwuid(user, uid, sizeof(user)); |
| - | } else { |
| - | safe_strncpy(user, argv[optind], sizeof(user)); |
| - | gid = my_getpwnamegid(user); |
| + | p=getpwnam(argv[optind]); |
| + | /* this is needed because it exits on failure */ |
| + | uid = my_getpwnam(argv[optind]); |
| + | gid = p->pw_gid; |
| + | /* in this case PRINT_REAL is the same */ |
| } | |
| - | my_getgrgid(group, gid, sizeof(group)); |
| + | |
| + | user=my_getpwuid(NULL, uid, (flags & JUST_USER) ? -1 : 0); |
| - | pwnam=my_getpwnam(user); |
| - | grnam=my_getgrnam(group); |
| + | if(flags & JUST_USER) |
| + | { |
| + | gid=uid; |
| + | group=user; |
| + | goto PRINT; |
| + | } |
| + | |
| + | group=my_getgrgid(NULL, gid, (flags & JUST_GROUP) ? -1 : 0); |
| - | if (flags & (JUST_GROUP | JUST_USER)) { |
| - | char *s = group; |
| - | if (flags & JUST_USER) { |
| - | s = user; |
| - | grnam = pwnam; |
| - | } |
| - | if (flags & NAME_NOT_NUMBER) { |
| - | puts(s); |
| - | } else { |
| - | printf("%ld\n", grnam); |
| - | } |
| - | } else { |
| - | #ifdef CONFIG_SELINUX |
| - | printf("uid=%ld(%s) gid=%ld(%s)", pwnam, user, grnam, group); |
| - | if(is_flask_enabled_flag) |
| - | { |
| - | security_id_t mysid = getsecsid(); |
| - | char context[80]; |
| - | int len = sizeof(context); |
| - | context[0] = '\0'; |
| - | if(security_sid_to_context(mysid, context, &len)) |
| - | strcpy(context, "unknown"); |
| - | printf(" context=%s\n", context); |
| - | } |
| + | if(flags & JUST_GROUP) |
| + | { |
| + | PRINT: |
| + | if(flags & NAME_NOT_NUMBER) |
| + | puts(group); |
| else | |
| - | printf("\n"); |
| - | #else |
| - | printf("uid=%ld(%s) gid=%ld(%s)\n", pwnam, user, grnam, group); |
| + | printf ("%u\n", gid); |
| + | bb_fflush_stdout_and_exit(EXIT_SUCCESS); |
| + | } |
| + | |
| + | /* Print full info like GNU id */ |
| + | printf_full(uid, user, 'u'); |
| + | printf_full(gid, group, 'g'); |
| + | #ifdef CONFIG_SELINUX |
| + | if(is_flask_enabled_flag) |
| + | { |
| + | security_id_t mysid = getsecsid(); |
| + | char context[80]; |
| + | int len = sizeof(context); |
| + | context[0] = '\0'; |
| + | if(security_sid_to_context(mysid, context, &len)) |
| + | strcpy(context, "unknown"); |
| + | printf("context=%s", context); |
| + | } |
| #endif | |
| + | puts(""); |
| + | bb_fflush_stdout_and_exit((user && group) ? EXIT_SUCCESS : EXIT_FAILURE); |
| + | } |
| - | } |
| + | /* END CODE */ |
| + | /* |
| + | Local Variables: |
| + | c-file-style: "linux" |
| + | c-basic-offset: 4 |
| + | tab-width: 4 |
| + | End: |
| + | */ |
| - | bb_fflush_stdout_and_exit(0); |
| - | } |
| @@ -26,21 +26,13 @@ | |
| #include <stdlib.h> | |
| #include <unistd.h> | |
| #include "busybox.h" | |
| - | #include "pwd_.h" |
| - | #include "grp_.h" |
| extern int whoami_main(int argc, char **argv) | |
| { | |
| - | struct passwd *p; |
| - | uid_t uid; |
| - | |
| if (argc > 1) | |
| bb_show_usage(); | |
| - | uid = geteuid(); |
| - | if((p = getpwuid(uid))!=NULL) { |
| - | puts(p->pw_name); |
| - | bb_fflush_stdout_and_exit(EXIT_SUCCESS); |
| - | } |
| - | bb_error_msg_and_die("cannot find username for UID %u", (unsigned) uid); |
| + | puts(my_getpwuid(NULL, geteuid(), -1)); |
| + | /* exits on error */ |
| + | bb_fflush_stdout_and_exit(EXIT_SUCCESS); |
| } | |
| @@ -232,7 +232,6 @@ extern long my_getpwnam(const char *name); | |
| extern long my_getgrnam(const char *name); | |
| extern char * my_getpwuid(char *name, long uid, int bufsize); | |
| extern char * my_getgrgid(char *group, long gid, int bufsize); | |
| - | extern long my_getpwnamegid(const char *name); |
| extern char *bb_askpass(int timeout, const char * prompt); | |
| extern int device_open(const char *device, int mode); | |
| @@ -34,7 +34,7 @@ LIBBB_SRC:= \ | |
| human_readable.c inet_common.c inode_hash.c interface.c isdirectory.c \ | |
| kernel_version.c last_char_is.c llist_add_to.c login.c loop.c \ | |
| make_directory.c mode_string.c module_syscalls.c mtab.c mtab_file.c \ | |
| - | my_getgrgid.c my_getgrnam.c my_getpwnam.c my_getpwnamegid.c \ |
| + | my_getgrgid.c my_getgrnam.c my_getpwnam.c \ |
| my_getpwuid.c obscure.c parse_mode.c parse_number.c perror_msg.c \ | |
| perror_msg_and_die.c print_file.c get_console.c \ | |
| process_escape_sequence.c procps.c pwd2spwd.c pw_encrypt.c qmodule.c \ | |
| @@ -19,8 +19,23 @@ | |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| */ | |
| + | /* Hacked by Tito Ragusa (c) 2004 <[email protected]> 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 |
| + | * on failure gid as string is written to buffer 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 |
| + | */ |
| + | |
| #include <stdio.h> | |
| #include <string.h> | |
| + | #include <assert.h> |
| #include "libbb.h" | |
| #include "pwd_.h" | |
| #include "grp_.h" | |
| @@ -33,10 +48,21 @@ char * my_getgrgid(char *group, long gid, int bufsize) | |
| mygroup = getgrgid(gid); | |
| if (mygroup==NULL) { | |
| - | snprintf(group, bufsize, "%ld", gid); |
| + | if(bufsize > 0) { |
| + | assert(group != NULL); |
| + | snprintf(group, bufsize, "%ld", (long)gid); |
| + | } |
| + | if( bufsize < 0 ) { |
| + | bb_error_msg_and_die("unknown gid %ld", (long)gid); |
| + | } |
| return NULL; | |
| } else { | |
| - | return safe_strncpy(group, mygroup->gr_name, bufsize); |
| + | if(bufsize > 0) |
| + | { |
| + | assert(group != NULL); |
| + | return safe_strncpy(group, mygroup->gr_name, bufsize); |
| + | } |
| + | return mygroup->gr_name; |
| } | |
| } | |
| @@ -19,8 +19,23 @@ | |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| */ | |
| + | /* Hacked by Tito Ragusa (c) 2004 <[email protected]> to make it more |
| + | * flexible : |
| + | * |
| + | * if bufsize is > 0 char *user can not be set to NULL |
| + | * on success username is written on static allocated buffer |
| + | * on failure uid as string is written to buffer and NULL is returned |
| + | * if bufsize is = 0 char *user can be set to NULL |
| + | * on success username is returned |
| + | * on failure NULL is returned |
| + | * if bufsize is < 0 char *user can be set to NULL |
| + | * on success username is returned |
| + | * on failure an error message is printed and the program exits |
| + | */ |
| + | |
| #include <stdio.h> | |
| #include <string.h> | |
| + | #include <assert.h> |
| #include "libbb.h" | |
| #include "pwd_.h" | |
| #include "grp_.h" | |
| @@ -34,10 +49,21 @@ char * my_getpwuid(char *name, long uid, int bufsize) | |
| myuser = getpwuid(uid); | |
| if (myuser==NULL) { | |
| - | snprintf(name, bufsize, "%ld", (long)uid); |
| + | if(bufsize > 0) { |
| + | assert(name != NULL); |
| + | snprintf(name, bufsize, "%ld", (long)uid); |
| + | } |
| + | if (bufsize < 0 ) { |
| + | bb_error_msg_and_die("unknown uid %ld", (long)uid); |
| + | } |
| return NULL; | |
| } else { | |
| - | return safe_strncpy(name, myuser->pw_name, bufsize); |
| + | if(bufsize > 0 ) |
| + | { |
| + | assert(name != NULL); |
| + | return safe_strncpy(name, myuser->pw_name, bufsize); |
| + | } |
| + | return myuser->pw_name; |
| } | |
| } | |
| @@ -145,7 +145,6 @@ extern int passwd_main(int argc, char **argv) | |
| int uflg = 0; /* -u - unlock account */ | |
| int dflg = 0; /* -d - delete password */ | |
| const struct passwd *pw; | |
| - | unsigned short ruid; |
| #ifdef CONFIG_FEATURE_SHADOWPASSWDS | |
| const struct spwd *sp; | |
| @@ -170,12 +169,8 @@ extern int passwd_main(int argc, char **argv) | |
| bb_show_usage(); | |
| } | |
| } | |
| - | ruid = getuid(); |
| - | pw = (struct passwd *) getpwuid(ruid); |
| - | if (!pw) { |
| - | bb_error_msg_and_die("Cannot determine your user name."); |
| - | } |
| - | myname = (char *) bb_xstrdup(pw->pw_name); |
| + | myname = (char *) bb_xstrdup(my_getpwuid(NULL, getuid(), -1)); |
| + | /* exits on error */ |
| if (optind < argc) { | |
| name = argv[optind]; | |
| } else { | |