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 *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);
00039 }
00040 strcpy(lastUname, thisUname);
00041
00042 pwent = getpwnam(thisUname);
00043 if (pwent == NULL) {
00044
00045 endpwent();
00046
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 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);
00083 }
00084 strcpy(lastGname, thisGname);
00085
00086 grent = getgrnam(thisGname);
00087 if (grent == NULL) {
00088
00089 endgrent();
00090
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 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 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 }