40 |
|
|
41 |
#include <mailutils/error.h> |
#include <mailutils/error.h> |
42 |
#include <mailutils/iterator.h> |
#include <mailutils/iterator.h> |
|
#include <mailutils/list.h> |
|
43 |
#include <mailutils/mutil.h> |
#include <mailutils/mutil.h> |
44 |
|
|
45 |
/* convert a sequence of hex characters into an integer */ |
/* convert a sequence of hex characters into an integer */ |
404 |
return len; |
return len; |
405 |
} |
} |
406 |
|
|
407 |
static list_t _app_getpwnam = NULL; |
/* General retrieve stack support: */ |
408 |
|
|
409 |
void |
void |
410 |
mu_register_getpwnam (struct passwd *(*fun) __P((const char *))) |
mu_register_retriever (list_t *pflist, mu_retrieve_fp fun) |
411 |
{ |
{ |
412 |
if (!_app_getpwnam && list_create (&_app_getpwnam)) |
if (!*pflist && list_create (pflist)) |
413 |
return; |
return; |
414 |
list_append (_app_getpwnam, fun); |
list_append (*pflist, fun); |
415 |
} |
} |
416 |
|
|
417 |
struct passwd * |
void * |
418 |
mu_getpwnam (const char *name) |
mu_retrieve (list_t flist, void *data) |
419 |
{ |
{ |
420 |
struct passwd *p; |
void *p = NULL; |
421 |
iterator_t itr; |
iterator_t itr; |
422 |
|
|
423 |
p = getpwnam (name); |
if (iterator_create (&itr, flist) == 0) |
|
|
|
|
if (!p && iterator_create (&itr, _app_getpwnam) == 0) |
|
424 |
{ |
{ |
425 |
struct passwd *(*fun) __P((const char *)); |
mu_retrieve_fp fun; |
426 |
for (iterator_first (itr); !p && !iterator_is_done (itr); |
for (iterator_first (itr); !p && !iterator_is_done (itr); |
427 |
iterator_next (itr)) |
iterator_next (itr)) |
428 |
{ |
{ |
429 |
iterator_current (itr, (void **)&fun); |
iterator_current (itr, (void **)&fun); |
430 |
p = (*fun) (name); |
p = (*fun) (data); |
431 |
} |
} |
432 |
|
|
433 |
iterator_destroy (&itr); |
iterator_destroy (&itr); |
435 |
return p; |
return p; |
436 |
} |
} |
437 |
|
|
438 |
static list_t _app_getpwuid = NULL; |
/* getpwd support: */ |
439 |
|
|
440 |
|
static list_t _app_getpwnam = NULL; |
441 |
|
|
442 |
void |
void |
443 |
mu_register_getpwuid (struct passwd *(*fun) __P((uid_t))) |
mu_register_getpwnam (struct passwd *(*fun) __P((const char *))) |
444 |
{ |
{ |
445 |
if (!_app_getpwuid && list_create (&_app_getpwuid)) |
mu_register_retriever (&_app_getpwnam, (mu_retrieve_fp)fun); |
|
return; |
|
|
list_append (_app_getpwuid, fun); |
|
446 |
} |
} |
447 |
|
|
448 |
struct passwd * |
struct passwd * |
449 |
mu_getpwuid (uid_t uid) |
mu_getpwnam (const char *name) |
450 |
{ |
{ |
451 |
struct passwd *p; |
struct passwd *p = getpwnam (name); |
452 |
iterator_t itr; |
return p ? p : mu_retrieve (_app_getpwnam, (void*) name); |
453 |
|
} |
454 |
|
|
455 |
p = getpwuid (uid); |
/* getpwuid support: */ |
456 |
|
|
457 |
if (!p && iterator_create (&itr, _app_getpwuid) == 0) |
static list_t _app_getpwuid = NULL; |
|
{ |
|
|
struct passwd *(*fun) __P((uid_t)); |
|
|
for (iterator_first (itr); !p && !iterator_is_done (itr); |
|
|
iterator_next (itr)) |
|
|
{ |
|
|
iterator_current (itr, (void **)&fun); |
|
|
p = (*fun) (uid); |
|
|
} |
|
458 |
|
|
459 |
iterator_destroy (&itr); |
void |
460 |
} |
mu_register_getpwuid (struct passwd *(*fun) __P((uid_t))) |
461 |
return p; |
{ |
462 |
|
mu_register_retriever (&_app_getpwuid, (mu_retrieve_fp)fun); |
463 |
|
} |
464 |
|
|
465 |
|
struct passwd * |
466 |
|
mu_getpwuid (uid_t uid) |
467 |
|
{ |
468 |
|
struct passwd *p = getpwuid (uid); |
469 |
|
return p ? p : mu_retrieve (_app_getpwuid, &uid); |
470 |
} |
} |
471 |
|
|
472 |
|
/* Virtual domains */ |
473 |
|
|
474 |
int mu_virtual_domain; |
int mu_virtual_domain; |
475 |
|
|
698 |
* had to look it up, so if somebody else is curious, thats where |
* had to look it up, so if somebody else is curious, thats where |
699 |
* to find it. |
* to find it. |
700 |
*/ |
*/ |
701 |
int mu_spawnvp(const char* prog, const char* const av_[], int* stat) |
int mu_spawnvp (const char* prog, const char* const av_[], int* stat) |
702 |
{ |
{ |
703 |
pid_t pid; |
pid_t pid; |
704 |
int err = 0; |
int err = 0; |