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 }