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         *uid = 0;
00030         return 0;
00031     }
00032 
00033     thisUnameLen = strlen(thisUname);
00034     if (lastUname == NULL || thisUnameLen != lastUnameLen ||
00035         strcmp(thisUname, lastUname) != 0) {
00036         if (lastUnameAlloced < thisUnameLen + 1) {
00037             lastUnameAlloced = thisUnameLen + 10;
00038             lastUname = xrealloc(lastUname, lastUnameAlloced);  /* XXX memory leak */
00039         }
00040         strcpy(lastUname, thisUname);
00041 
00042         pwent = getpwnam(thisUname);
00043         if (pwent == NULL) {
00044             /*@-internalglobs@*/ /* FIX: shrug */
00045             endpwent();
00046             /*@=internalglobs@*/
00047             pwent = getpwnam(thisUname);
00048             if (pwent == NULL) return -1;
00049         }
00050 
00051         lastUid = pwent->pw_uid;
00052     }
00053 
00054     *uid = lastUid;
00055 
00056     return 0;
00057 }
00058 
00059 int gnameToGid(const char * thisGname, gid_t * gid)
00060 {
00061 /*@only@*/ static char * lastGname = NULL;
00062     static size_t lastGnameLen = 0;
00063     static size_t lastGnameAlloced;
00064     static gid_t lastGid;
00065     size_t thisGnameLen;
00066     struct group * grent;
00067 
00068     if (thisGname == NULL) {
00069         lastGnameLen = 0;
00070         return -1;
00071     } else if (strcmp(thisGname, "root") == 0) {
00072         *gid = 0;
00073         return 0;
00074     }
00075 
00076     thisGnameLen = strlen(thisGname);
00077     if (lastGname == NULL || thisGnameLen != lastGnameLen ||
00078         strcmp(thisGname, lastGname) != 0)
00079     {
00080         if (lastGnameAlloced < thisGnameLen + 1) {
00081             lastGnameAlloced = thisGnameLen + 10;
00082             lastGname = xrealloc(lastGname, lastGnameAlloced);  /* XXX memory leak */
00083         }
00084         strcpy(lastGname, thisGname);
00085 
00086         grent = getgrnam(thisGname);
00087         if (grent == NULL) {
00088             /*@-internalglobs@*/ /* FIX: shrug */
00089             endgrent();
00090             /*@=internalglobs@*/
00091             grent = getgrnam(thisGname);
00092             if (grent == NULL) return -1;
00093         }
00094         lastGid = grent->gr_gid;
00095     }
00096 
00097     *gid = lastGid;
00098 
00099     return 0;
00100 }
00101 
00102 char * uidToUname(uid_t uid)
00103 {
00104     static uid_t lastUid = (uid_t) -1;
00105 /*@only@*/ static char * lastUname = NULL;
00106     static size_t lastUnameLen = 0;
00107 
00108     if (uid == (uid_t) -1) {
00109         lastUid = (uid_t) -1;
00110         return NULL;
00111     } else if (uid == (uid_t) 0) {
00112         return "root";
00113     } else if (uid == lastUid) {
00114         return lastUname;
00115     } else {
00116         struct passwd * pwent = getpwuid(uid);
00117         size_t len;
00118 
00119         if (pwent == NULL) return NULL;
00120 
00121         lastUid = uid;
00122         len = strlen(pwent->pw_name);
00123         if (lastUnameLen < len + 1) {
00124             lastUnameLen = len + 20;
00125             lastUname = xrealloc(lastUname, lastUnameLen);
00126         }
00127         strcpy(lastUname, pwent->pw_name);
00128 
00129         return lastUname;
00130     }
00131 }
00132 
00133 char * gidToGname(gid_t gid)
00134 {
00135     static gid_t lastGid = (gid_t) -1;
00136 /*@only@*/ static char * lastGname = NULL;
00137     static size_t lastGnameLen = 0;
00138 
00139     if (gid == (gid_t) -1) {
00140         lastGid = (gid_t) -1;
00141         return NULL;
00142     } else if (gid == (gid_t) 0) {
00143         return "root";
00144     } else if (gid == lastGid) {
00145         return lastGname;
00146     } else {
00147         struct group * grent = getgrgid(gid);
00148         size_t len;
00149 
00150         if (grent == NULL) return NULL;
00151 
00152         lastGid = gid;
00153         len = strlen(grent->gr_name);
00154         if (lastGnameLen < len + 1) {
00155             lastGnameLen = len + 20;
00156             lastGname = xrealloc(lastGname, lastGnameLen);
00157         }
00158         strcpy(lastGname, grent->gr_name);
00159 
00160         return lastGname;
00161     }
00162 }

Generated on Sat Oct 28 09:19:18 2006 for rpm by  doxygen 1.4.7