99 #ifdef GETPW_R_NEEDS_POSIX_PTHREAD_SEMANTICS
100 #define _POSIX_PTHREAD_SEMANTICS
110 static HTABLE *mypwcache_name = 0;
111 static BINHASH *mypwcache_uid = 0;
122 #ifdef HAVE_POSIX_GETPW_R
123 #define GETPW_R_BUFSIZ 1024
125 #define MYPWD_ERROR_DELAY (30)
129 static struct mypasswd *mypwenter(
const struct passwd * pwd)
136 if (mypwcache_name == 0) {
144 mypwd->
pw_uid = pwd->pw_uid;
145 mypwd->
pw_gid = pwd->pw_gid;
157 sizeof(mypwd->
pw_uid)) == 0)
159 sizeof(mypwd->
pw_uid), (
void *) mypwd);
187 if (last_pwd->
pw_uid != uid) {
191 *result = mypwd = last_pwd;
201 binhash_find(mypwcache_uid, (
void *) &uid,
sizeof(uid))) == 0) {
202 #ifdef HAVE_POSIX_GETPW_R
203 char pwstore[GETPW_R_BUFSIZ];
207 err = getpwuid_r(uid, &pwbuf, pwstore,
sizeof(pwstore), &pwd);
215 if ((pwd = getpwuid(uid)) == 0) {
220 mypwd = mypwenter(pwd);
222 *result = last_pwd = mypwd;
251 if (strcmp(last_pwd->
pw_name, name) != 0) {
255 *result = mypwd = last_pwd;
265 #ifdef HAVE_POSIX_GETPW_R
266 char pwstore[GETPW_R_BUFSIZ];
270 err = getpwnam_r(name, &pwbuf, pwstore,
sizeof(pwstore), &pwd);
278 if ((pwd = getpwnam(name)) == 0) {
283 mypwd = mypwenter(pwd);
285 *result = last_pwd = mypwd;
305 sizeof(mypwd->
pw_uid), (void (*) (
void *)) 0);
326 int main(
int argc,
char **argv)
333 msg_fatal(
"usage: %s name or uid ...", argv[0]);
340 for (i = 1; i < argc; i++) {
342 mypwd[i] =
mypwuid(atoi(argv[i]));
347 msg_info(
"lookup %s %s/%d refcount=%d name_cache=%d uid_cache=%d",
351 mypwd[argc] = last_pwd;
356 for (i = 1; i < argc + 1; i++) {
357 msg_info(
"free %s/%d refcount=%d name_cache=%d uid_cache=%d",
359 mypwcache_name->
used, mypwcache_uid->
used);
362 msg_info(
"name_cache=%d uid_cache=%d",
363 mypwcache_name->
used, mypwcache_uid->
used);
int mypwnam_err(const char *name, struct mypasswd **result)
char * mystrdup(const char *str)
NORETURN msg_panic(const char *fmt,...)
int mypwuid_err(uid_t uid, struct mypasswd **result)
int main(int argc, char **argv)
struct mypasswd * mypwuid(uid_t uid)
BINHASH * binhash_create(ssize_t size)
#define MYPWD_ERROR_DELAY
BINHASH_INFO * binhash_enter(BINHASH *table, const void *key, ssize_t key_len, void *value)
BINHASH_INFO * binhash_locate(BINHASH *table, const void *key, ssize_t key_len)
HTABLE * htable_create(ssize_t size)
struct mypasswd * mypwnam(const char *name)
void msg_warn(const char *fmt,...)
void * htable_find(HTABLE *table, const char *key)
NORETURN msg_fatal(const char *fmt,...)
void mypwfree(struct mypasswd *mypwd)
void msg_vstream_init(const char *name, VSTREAM *vp)
void htable_delete(HTABLE *table, const char *key, void(*free_fn)(void *))
void * binhash_find(BINHASH *table, const void *key, ssize_t key_len)
void binhash_delete(BINHASH *table, const void *key, ssize_t key_len, void(*free_fn)(void *))
void * mymalloc(ssize_t len)
HTABLE_INFO * htable_enter(HTABLE *table, const char *key, void *value)
void msg_info(const char *fmt,...)