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 } else if (strcmp(thisUname, "root") == 0) {
00029
00030 *uid = 0;
00031
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);
00042 }
00043
00044 strcpy(lastUname, thisUname);
00045
00046
00047 pwent = getpwnam(thisUname);
00048 if (pwent == NULL) {
00049
00050 endpwent();
00051
00052 pwent = getpwnam(thisUname);
00053 if (pwent == NULL) return -1;
00054 }
00055
00056 lastUid = pwent->pw_uid;
00057 }
00058
00059
00060 *uid = lastUid;
00061
00062
00063 return 0;
00064 }
00065
00066 int gnameToGid(const char * thisGname, gid_t * gid)
00067 {
00068 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
00080 *gid = 0;
00081
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);
00092 }
00093
00094 strcpy(lastGname, thisGname);
00095
00096
00097 grent = getgrnam(thisGname);
00098 if (grent == NULL) {
00099
00100 endgrent();
00101
00102 grent = getgrnam(thisGname);
00103 if (grent == NULL) return -1;
00104 }
00105 lastGid = grent->gr_gid;
00106 }
00107
00108
00109 *gid = lastGid;
00110
00111
00112 return 0;
00113 }
00114
00115 char * uidToUname(uid_t uid)
00116 {
00117 static uid_t lastUid = (uid_t) -1;
00118 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
00141 strcpy(lastUname, pwent->pw_name);
00142
00143
00144 return lastUname;
00145 }
00146 }
00147
00148 char * gidToGname(gid_t gid)
00149 {
00150 static gid_t lastGid = (gid_t) -1;
00151 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
00174 strcpy(lastGname, grent->gr_name);
00175
00176
00177 return lastGname;
00178 }
00179 }