1/* vi: set sw=4 ts=4: */ 2/* 3 * password utility routines. 4 * 5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> 6 * 7 * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. 8 */ 9 10#include "libbb.h" 11 12#define assert(x) ((void)0) 13 14/* internal function for bb_getpwuid and bb_getgrgid */ 15/* Hacked by Tito Ragusa (c) 2004 <farmatito@tiscali.it> to make it more 16 * flexible: 17 * 18 * bufsize > 0: If idname is not NULL it is copied to buffer, 19 * and buffer is returned. Else id as string is written 20 * to buffer, and NULL is returned. 21 * 22 * bufsize == 0: idname is returned. 23 * 24 * bufsize < 0: If idname is not NULL it is returned. 25 * Else an error message is printed and the program exits. 26 */ 27static char* bb_getug(char *buffer, int bufsize, char *idname, long id, char prefix) 28{ 29 if (bufsize > 0) { 30 assert(buffer != NULL); 31 if (idname) { 32 return safe_strncpy(buffer, idname, bufsize); 33 } 34 snprintf(buffer, bufsize, "%ld", id); 35 } else if (bufsize < 0 && !idname) { 36 bb_error_msg_and_die("unknown %cid %ld", prefix, id); 37 } 38 return idname; 39} 40 41/* bb_getpwuid, bb_getgrgid: 42 * bb_getXXXid(buf, bufsz, id) - copy user/group name or id 43 * as a string to buf, return user/group name or NULL 44 * bb_getXXXid(NULL, 0, id) - return user/group name or NULL 45 * bb_getXXXid(NULL, -1, id) - return user/group name or exit 46 */ 47/* gets a username given a uid */ 48char* bb_getpwuid(char *name, int bufsize, long uid) 49{ 50 struct passwd *myuser = getpwuid(uid); 51 52 return bb_getug(name, bufsize, 53 (myuser ? myuser->pw_name : (char*)myuser), 54 uid, 'u'); 55} 56/* gets a groupname given a gid */ 57char* bb_getgrgid(char *group, int bufsize, long gid) 58{ 59 struct group *mygroup = getgrgid(gid); 60 61 return bb_getug(group, bufsize, 62 (mygroup ? mygroup->gr_name : (char*)mygroup), 63 gid, 'g'); 64} 65 66/* returns a gid given a group name */ 67long xgroup2gid(const char *name) 68{ 69 struct group *mygroup; 70 71 mygroup = getgrnam(name); 72 if (mygroup == NULL) 73 bb_error_msg_and_die("unknown group name: %s", name); 74 75 return mygroup->gr_gid; 76} 77 78/* returns a uid given a username */ 79long xuname2uid(const char *name) 80{ 81 struct passwd *myuser; 82 83 myuser = getpwnam(name); 84 if (myuser == NULL) 85 bb_error_msg_and_die("unknown user name: %s", name); 86 87 return myuser->pw_uid; 88} 89 90unsigned long get_ug_id(const char *s, 91 long (*xname2id)(const char *)) 92{ 93 unsigned long r; 94 95 r = bb_strtoul(s, NULL, 10); 96 if (errno) 97 return xname2id(s); 98 return r; 99} 100