Main Page   Modules   Data Structures   File List   Data Fields   Globals   Related Pages  

rpmio/ugid.c

Go to the documentation of this file.
00001 
00005 #include "system.h"
00006 #include "ugid.h"
00007 #include "debug.h"
00008 
00009 /* unameToUid(), uidTouname() and the group variants are really poorly
00010    implemented. They really ought to use hash tables. I just made the
00011    guess that most files would be owned by root or the same person/group
00012    who owned the last file. Those two values are cached, everything else
00013    is looked up via getpw() and getgr() functions.  If this performs
00014    too poorly I'll have to implement it properly :-( */
00015 
00016 int unameToUid(const char * thisUname, uid_t * uid)
00017 {
00018 /*@only@*/ static char * lastUname = NULL;
00019     static size_t lastUnameLen = 0;
00020     static size_t lastUnameAlloced;
00021     static uid_t lastUid;
00022     struct passwd * pwent;
00023     size_t thisUnameLen;
00024 
00025     if (!thisUname) {
00026         lastUnameLen = 0;
00027         return -1;
00028     } else if (strcmp(thisUname, "root") == 0) {
00029 /*@-boundswrite@*/
00030         *uid = 0;
00031 /*@=boundswrite@*/
00032         return 0;
00033     }
00034 
00035     thisUnameLen = strlen(thisUname);
00036     if (lastUname == NULL || thisUnameLen != lastUnameLen ||
00037         strcmp(thisUname, lastUname) != 0)
00038     {
00039         if (lastUnameAlloced < thisUnameLen + 1) {
00040             lastUnameAlloced = thisUnameLen + 10;
00041             lastUname = xrealloc(lastUname, lastUnameAlloced);  /* XXX memory leak */
00042         }
00043 /*@-boundswrite@*/
00044         strcpy(lastUname, thisUname);
00045 /*@=boundswrite@*/
00046 
00047         pwent = getpwnam(thisUname);
00048         if (pwent == NULL) {
00049             /*@-internalglobs@*/ /* FIX: shrug */
00050             endpwent();
00051             /*@=internalglobs@*/
00052             pwent = getpwnam(thisUname);
00053             if (pwent == NULL) return -1;
00054         }
00055 
00056         lastUid = pwent->pw_uid;
00057     }
00058 
00059 /*@-boundswrite@*/
00060     *uid = lastUid;
00061 /*@=boundswrite@*/
00062 
00063     return 0;
00064 }
00065 
00066 int gnameToGid(const char * thisGname, gid_t * gid)
00067 {
00068 /*@only@*/ static char * lastGname = NULL;
00069     static size_t lastGnameLen = 0;
00070     static size_t lastGnameAlloced;
00071     static gid_t lastGid;
00072     size_t thisGnameLen;
00073     struct group * grent;
00074 
00075     if (thisGname == NULL) {
00076         lastGnameLen = 0;
00077         return -1;
00078     } else if (strcmp(thisGname, "root") == 0) {
00079 /*@-boundswrite@*/
00080         *gid = 0;
00081 /*@=boundswrite@*/
00082         return 0;
00083     }
00084 
00085     thisGnameLen = strlen(thisGname);
00086     if (lastGname == NULL || thisGnameLen != lastGnameLen ||
00087         strcmp(thisGname, lastGname) != 0)
00088     {
00089         if (lastGnameAlloced < thisGnameLen + 1) {
00090             lastGnameAlloced = thisGnameLen + 10;
00091             lastGname = xrealloc(lastGname, lastGnameAlloced);  /* XXX memory leak */
00092         }
00093 /*@-boundswrite@*/
00094         strcpy(lastGname, thisGname);
00095 /*@=boundswrite@*/
00096 
00097         grent = getgrnam(thisGname);
00098         if (grent == NULL) {
00099             /*@-internalglobs@*/ /* FIX: shrug */
00100             endgrent();
00101             /*@=internalglobs@*/
00102             grent = getgrnam(thisGname);
00103             if (grent == NULL) return -1;
00104         }
00105         lastGid = grent->gr_gid;
00106     }
00107 
00108 /*@-boundswrite@*/
00109     *gid = lastGid;
00110 /*@=boundswrite@*/
00111 
00112     return 0;
00113 }
00114 
00115 char * uidToUname(uid_t uid)
00116 {
00117     static uid_t lastUid = (uid_t) -1;
00118 /*@only@*/ static char * lastUname = NULL;
00119     static size_t lastUnameLen = 0;
00120 
00121     if (uid == (uid_t) -1) {
00122         lastUid = (uid_t) -1;
00123         return NULL;
00124     } else if (uid == (uid_t) 0) {
00125         return "root";
00126     } else if (uid == lastUid) {
00127         return lastUname;
00128     } else {
00129         struct passwd * pwent = getpwuid(uid);
00130         size_t len;
00131 
00132         if (pwent == NULL) return NULL;
00133 
00134         lastUid = uid;
00135         len = strlen(pwent->pw_name);
00136         if (lastUnameLen < len + 1) {
00137             lastUnameLen = len + 20;
00138             lastUname = xrealloc(lastUname, lastUnameLen);
00139         }
00140 /*@-boundswrite@*/
00141         strcpy(lastUname, pwent->pw_name);
00142 /*@=boundswrite@*/
00143 
00144         return lastUname;
00145     }
00146 }
00147 
00148 char * gidToGname(gid_t gid)
00149 {
00150     static gid_t lastGid = (gid_t) -1;
00151 /*@only@*/ static char * lastGname = NULL;
00152     static size_t lastGnameLen = 0;
00153 
00154     if (gid == (gid_t) -1) {
00155         lastGid = (gid_t) -1;
00156         return NULL;
00157     } else if (gid == (gid_t) 0) {
00158         return "root";
00159     } else if (gid == lastGid) {
00160         return lastGname;
00161     } else {
00162         struct group * grent = getgrgid(gid);
00163         size_t len;
00164 
00165         if (grent == NULL) return NULL;
00166 
00167         lastGid = gid;
00168         len = strlen(grent->gr_name);
00169         if (lastGnameLen < len + 1) {
00170             lastGnameLen = len + 20;
00171             lastGname = xrealloc(lastGname, lastGnameLen);
00172         }
00173 /*@-boundswrite@*/
00174         strcpy(lastGname, grent->gr_name);
00175 /*@=boundswrite@*/
00176 
00177         return lastGname;
00178     }
00179 }

Generated on Sun Oct 26 13:02:04 2003 for rpm by doxygen1.2.18