Go to the documentation of this file.00001
00005 #include "system.h"
00006 #include "ugid.h"
00007 #include "debug.h"
00008
00009
00010
00011
00012
00013
00014
00015
00016 int unameToUid(const char * thisUname, uid_t * uid)
00017 {
00018 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 #if !defined(RPM_VENDOR_OPENPKG)
00029 } else if (strcmp(thisUname, "root") == 0) {
00030 *uid = 0;
00031 return 0;
00032 #endif
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);
00042 }
00043 strcpy(lastUname, thisUname);
00044
00045 pwent = getpwnam(thisUname);
00046 if (pwent == NULL) {
00047
00048 endpwent();
00049
00050 pwent = getpwnam(thisUname);
00051 if (pwent == NULL) return -1;
00052 }
00053
00054 lastUid = pwent->pw_uid;
00055 }
00056
00057 *uid = lastUid;
00058
00059 return 0;
00060 }
00061
00062 int gnameToGid(const char * thisGname, gid_t * gid)
00063 {
00064 static char * lastGname = NULL;
00065 static size_t lastGnameLen = 0;
00066 static size_t lastGnameAlloced;
00067 static gid_t lastGid;
00068 size_t thisGnameLen;
00069 struct group * grent;
00070
00071 if (thisGname == NULL) {
00072 lastGnameLen = 0;
00073 return -1;
00074 #if !defined(RPM_VENDOR_OPENPKG)
00075 } else if (strcmp(thisGname, "root") == 0) {
00076 *gid = 0;
00077 return 0;
00078 #endif
00079 }
00080
00081 thisGnameLen = strlen(thisGname);
00082 if (lastGname == NULL || thisGnameLen != lastGnameLen ||
00083 strcmp(thisGname, lastGname) != 0)
00084 {
00085 if (lastGnameAlloced < thisGnameLen + 1) {
00086 lastGnameAlloced = thisGnameLen + 10;
00087 lastGname = xrealloc(lastGname, lastGnameAlloced);
00088 }
00089 strcpy(lastGname, thisGname);
00090
00091 grent = getgrnam(thisGname);
00092 if (grent == NULL) {
00093
00094 endgrent();
00095
00096 grent = getgrnam(thisGname);
00097 if (grent == NULL) {
00098 #if !defined(RPM_VENDOR_OPENPKG)
00099
00100 if (strcmp(thisGname, "lock") == 0) {
00101 *gid = lastGid = 54;
00102 return 0;
00103 } else
00104 if (strcmp(thisGname, "mail") == 0) {
00105 *gid = lastGid = 12;
00106 return 0;
00107 } else
00108 #endif
00109 return -1;
00110 }
00111 }
00112 lastGid = grent->gr_gid;
00113 }
00114
00115 *gid = lastGid;
00116
00117 return 0;
00118 }
00119
00120 char * uidToUname(uid_t uid)
00121 {
00122 static uid_t lastUid = (uid_t) -1;
00123 static char * lastUname = NULL;
00124 static size_t lastUnameLen = 0;
00125
00126 if (uid == (uid_t) -1) {
00127 lastUid = (uid_t) -1;
00128 return NULL;
00129 #if !defined(RPM_VENDOR_OPENPKG)
00130 } else if (uid == (uid_t) 0) {
00131 return "root";
00132 #endif
00133 } else if (uid == lastUid) {
00134 return lastUname;
00135 } else {
00136 struct passwd * pwent = getpwuid(uid);
00137 size_t len;
00138
00139 if (pwent == NULL) return NULL;
00140
00141 lastUid = uid;
00142 len = strlen(pwent->pw_name);
00143 if (lastUnameLen < len + 1) {
00144 lastUnameLen = len + 20;
00145 lastUname = xrealloc(lastUname, lastUnameLen);
00146 }
00147 strcpy(lastUname, pwent->pw_name);
00148
00149 return lastUname;
00150 }
00151 }
00152
00153 char * gidToGname(gid_t gid)
00154 {
00155 static gid_t lastGid = (gid_t) -1;
00156 static char * lastGname = NULL;
00157 static size_t lastGnameLen = 0;
00158
00159 if (gid == (gid_t) -1) {
00160 lastGid = (gid_t) -1;
00161 return NULL;
00162 #if !defined(RPM_VENDOR_OPENPKG)
00163 } else if (gid == (gid_t) 0) {
00164 return "root";
00165 #endif
00166 } else if (gid == lastGid) {
00167 return lastGname;
00168 } else {
00169 struct group * grent = getgrgid(gid);
00170 size_t len;
00171
00172 if (grent == NULL) return NULL;
00173
00174 lastGid = gid;
00175 len = strlen(grent->gr_name);
00176 if (lastGnameLen < len + 1) {
00177 lastGnameLen = len + 20;
00178 lastGname = xrealloc(lastGname, lastGnameLen);
00179 }
00180 strcpy(lastGname, grent->gr_name);
00181
00182 return lastGname;
00183 }
00184 }