Magellan Linux

Diff of /trunk/mkinitrd-magellan/busybox/libbb/bb_pwd.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 983 by niro, Fri Apr 24 18:33:46 2009 UTC revision 984 by niro, Sun May 30 11:32:42 2010 UTC
# Line 3  Line 3 
3   * password utility routines.   * password utility routines.
4   *   *
5   * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>   * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
6     * Copyright (C) 2008 by Tito Ragusa <farmatito@tiscali.it>
7   *   *
8   * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.   * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
9   */   */
10    
11  #include "libbb.h"  #include "libbb.h"
12    
13  #define assert(x) ((void)0)  /* TODO: maybe change API to return malloced data?
14     * This will allow to stop using libc functions returning
15  /* internal function for bb_getpwuid and bb_getgrgid */   * pointers to static data (getpwuid)
 /* 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.  
16   */   */
17  static char* bb_getug(char *buffer, int bufsize, char *idname, long id, char prefix)  
18    struct passwd* FAST_FUNC xgetpwnam(const char *name)
19  {  {
20   if (bufsize > 0) {   struct passwd *pw = getpwnam(name);
21   assert(buffer != NULL);   if (!pw)
22   if (idname) {   bb_error_msg_and_die("unknown user %s", name);
23   return safe_strncpy(buffer, idname, bufsize);   return pw;
24   }  }
25   snprintf(buffer, bufsize, "%ld", id);  
26   } else if (bufsize < 0 && !idname) {  struct group* FAST_FUNC xgetgrnam(const char *name)
  bb_error_msg_and_die("unknown %cid %ld", prefix, id);  
  }  
  return idname;  
 }  
   
 /* 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* FAST_FUNC bb_getpwuid(char *name, int bufsize, long uid)  
27  {  {
28   struct passwd *myuser = getpwuid(uid);   struct group *gr = getgrnam(name);
29     if (!gr)
30     bb_error_msg_and_die("unknown group %s", name);
31     return gr;
32    }
33    
34   return bb_getug(name, bufsize,  
35   (myuser ? myuser->pw_name : (char*)myuser),  struct passwd* FAST_FUNC xgetpwuid(uid_t uid)
36   uid, 'u');  {
37     struct passwd *pw = getpwuid(uid);
38     if (!pw)
39     bb_error_msg_and_die("unknown uid %u", (unsigned)uid);
40     return pw;
41  }  }
42  /* gets a groupname given a gid */  
43  char* FAST_FUNC bb_getgrgid(char *group, int bufsize, long gid)  struct group* FAST_FUNC xgetgrgid(gid_t gid)
44  {  {
45   struct group *mygroup = getgrgid(gid);   struct group *gr = getgrgid(gid);
46     if (!gr)
47     bb_error_msg_and_die("unknown gid %u", (unsigned)gid);
48     return gr;
49    }
50    
51   return bb_getug(group, bufsize,  char* FAST_FUNC xuid2uname(uid_t uid)
52   (mygroup ? mygroup->gr_name : (char*)mygroup),  {
53   gid, 'g');   struct passwd *pw = xgetpwuid(uid);
54     return pw->pw_name;
55  }  }
56    
57  /* returns a gid given a group name */  char* FAST_FUNC xgid2group(gid_t gid)
 long FAST_FUNC xgroup2gid(const char *name)  
58  {  {
59   struct group *mygroup;   struct group *gr = xgetgrgid(gid);
60     return gr->gr_name;
61    }
62    
63   mygroup = getgrnam(name);  char* FAST_FUNC uid2uname(uid_t uid)
64   if (mygroup == NULL)  {
65   bb_error_msg_and_die("unknown group name: %s", name);   struct passwd *pw = getpwuid(uid);
66     return (pw) ? pw->pw_name : NULL;
67    }
68    
69   return mygroup->gr_gid;  char* FAST_FUNC gid2group(gid_t gid)
70    {
71     struct group *gr = getgrgid(gid);
72     return (gr) ? gr->gr_name : NULL;
73    }
74    
75    char* FAST_FUNC uid2uname_utoa(long uid)
76    {
77     char *name = uid2uname(uid);
78     return (name) ? name : utoa(uid);
79    }
80    
81    char* FAST_FUNC gid2group_utoa(long gid)
82    {
83     char *name = gid2group(gid);
84     return (name) ? name : utoa(gid);
85  }  }
86    
 /* returns a uid given a username */  
87  long FAST_FUNC xuname2uid(const char *name)  long FAST_FUNC xuname2uid(const char *name)
88  {  {
89   struct passwd *myuser;   struct passwd *myuser;
90    
91   myuser = getpwnam(name);   myuser = xgetpwnam(name);
  if (myuser == NULL)  
  bb_error_msg_and_die("unknown user %s", name);  
   
92   return myuser->pw_uid;   return myuser->pw_uid;
93  }  }
94    
95    long FAST_FUNC xgroup2gid(const char *name)
96    {
97     struct group *mygroup;
98    
99     mygroup = xgetgrnam(name);
100     return mygroup->gr_gid;
101    }
102    
103  unsigned long FAST_FUNC get_ug_id(const char *s,  unsigned long FAST_FUNC get_ug_id(const char *s,
104   long FAST_FUNC (*xname2id)(const char *))   long FAST_FUNC (*xname2id)(const char *))
105  {  {

Legend:
Removed from v.983  
changed lines
  Added in v.984