/[mailutils]/mailutils/mailbox/mutil.c
ViewVC logotype

Diff of /mailutils/mailbox/mutil.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.28 by gray, Mon Mar 25 10:38:41 2002 UTC revision 1.29 by gray, Wed Apr 10 13:26:12 2002 UTC
# Line 40  Line 40 
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 */
# Line 405  mu_cpystr (char *dst, const char *src, s Line 404  mu_cpystr (char *dst, const char *src, s
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);
# Line 438  mu_getpwnam (const char *name) Line 435  mu_getpwnam (const char *name)
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    
# Line 699  mu_tempfile (const char *tmpdir, char ** Line 698  mu_tempfile (const char *tmpdir, char **
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;

Legend:
Removed from v.1.28  
changed lines
  Added in v.1.29

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26