/[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.35 by gray, Tue Aug 6 01:32:11 2002 UTC revision 1.36 by gray, Tue Aug 13 13:31:52 2002 UTC
# Line 45  Line 45 
45  #include <mailutils/iterator.h>  #include <mailutils/iterator.h>
46  #include <mailutils/mutil.h>  #include <mailutils/mutil.h>
47  #include <mailutils/parse822.h>  #include <mailutils/parse822.h>
48    #include <mailutils/mu_auth.h>
49    
50  #include "mu_asprintf.h"  #include "mu_asprintf.h"
51    
# Line 264  char * Line 265  char *
265  mu_get_homedir (void)  mu_get_homedir (void)
266  {  {
267    char *homedir = getenv ("HOME");    char *homedir = getenv ("HOME");
268    if (!homedir)    if (homedir)
269        homedir = strdup (homedir);
270      else
271      {      {
272        struct passwd *pwd;        struct mu_auth_data *auth = mu_get_auth_by_uid (getuid ());
273          if (!auth)
       pwd = mu_getpwuid (getuid ());  
       if (!pwd)  
274          return NULL;          return NULL;
275        homedir = pwd->pw_dir;        homedir = strdup (auth->dir);
276          mu_auth_data_free (auth);
277      }      }
278    return homedir;    return homedir;
279  }  }
# Line 367  mu_tilde_expansion (const char *ref, con Line 369  mu_tilde_expansion (const char *ref, con
369            strcat (s, p);            strcat (s, p);
370            free (--p);            free (--p);
371            p = s;            p = s;
372              free (homedir);
373          }          }
374        else        else
375          {          {
376            struct passwd *pw;            struct mu_auth_data *auth;
377            char *s = p;            char *s = p;
378            char *name;            char *name;
379            while (*s && *s != delim[0])            while (*s && *s != delim[0])
# Line 378  mu_tilde_expansion (const char *ref, con Line 381  mu_tilde_expansion (const char *ref, con
381            name = calloc (s - p + 1, 1);            name = calloc (s - p + 1, 1);
382            memcpy (name, p, s - p);            memcpy (name, p, s - p);
383            name [s - p] = '\0';            name [s - p] = '\0';
384            pw = mu_getpwnam (name);            
385              auth = mu_get_auth_by_name (name);
386            free (name);            free (name);
387            if (pw)            if (auth)
388              {              {
389                char *buf = calloc (strlen (pw->pw_dir) + strlen (s) + 1, 1);                char *buf = calloc (strlen (auth->dir) + strlen (s) + 1, 1);
390                strcpy (buf, pw->pw_dir);                strcpy (buf, auth->dir);
391                strcat (buf, s);                strcat (buf, s);
392                free (--p);                free (--p);
393                p = buf;                p = buf;
394                  mu_auth_data_free (auth);
395              }              }
396            else            else
397              p--;              p--;
# Line 441  mu_retrieve (list_t flist, void *data) Line 446  mu_retrieve (list_t flist, void *data)
446    return p;    return p;
447  }  }
448    
 /* getpwd support: */  
   
 static list_t _app_getpwnam = NULL;  
   
 void  
 mu_register_getpwnam (struct passwd *(*fun) __P((const char *)))  
 {  
   mu_register_retriever (&_app_getpwnam, (mu_retrieve_fp)fun);  
 }  
   
 struct passwd *  
 mu_getpwnam (const char *name)  
 {  
   struct passwd *p = getpwnam (name);  
   return p ? p : mu_retrieve (_app_getpwnam, (void*) name);  
 }  
   
 /* getpwuid support: */  
   
 static list_t _app_getpwuid = NULL;  
   
 void  
 mu_register_getpwuid (struct passwd *(*fun) __P((uid_t *)))  
 {  
   mu_register_retriever (&_app_getpwuid, (mu_retrieve_fp)fun);  
 }  
   
 struct passwd *  
 mu_getpwuid (uid_t uid)  
 {  
   struct passwd *p = getpwuid (uid);  
   return p ? p : mu_retrieve (_app_getpwuid, &uid);  
 }  
   
 /* Virtual domains */  
   
 int mu_virtual_domain;  
   
 #ifdef USE_VIRTUAL_DOMAINS  
   
 struct passwd *  
 getpwnam_virtual (const char *u)  
 {  
   struct passwd *pw = NULL;  
   FILE *pfile;  
   size_t i = 0, len = strlen (u), delim = 0;  
   char *filename;  
   
   mu_virtual_domain = 0;  
   for (i = 0; i < len && delim == 0; i++)  
     if (u[i] == '!' || u[i] == ':' || u[i] == '@')  
       delim = i;  
   
   if (delim == 0)  
     return NULL;  
   
   filename = malloc (strlen (SITE_VIRTUAL_PWDDIR) +  
                      strlen (&u[delim + 1]) + 2 /* slash and null byte */);  
   if (filename == NULL)  
     return NULL;  
   
   sprintf (filename, "%s/%s", SITE_VIRTUAL_PWDDIR, &u[delim + 1]);  
   pfile = fopen (filename, "r");  
   free (filename);  
   
   if (pfile)  
     while ((pw = fgetpwent (pfile)) != NULL)  
       {  
         if (strlen (pw->pw_name) == delim && !strncmp (u, pw->pw_name, delim))  
           {  
             mu_virtual_domain = 1;  
             break;  
           }  
       }  
   
   return pw;  
 }  
   
 #endif  
   
449  int  int
450  mu_get_host_name (char **host)  mu_get_host_name (char **host)
451  {  {
# Line 988  mu_unroll_symlink (char *out, size_t out Line 913  mu_unroll_symlink (char *out, size_t out
913  char *  char *
914  mu_expand_path_pattern (const char *pattern, const char *username)  mu_expand_path_pattern (const char *pattern, const char *username)
915  {  {
   char *homedir = NULL;  
916    const char *p, *startp;    const char *p, *startp;
917    char *q;    char *q;
918    char *path;    char *path;
919    int len = 0;    int len = 0;
920      struct mu_auth_data *auth = NULL;
921        
922    for (p = pattern; *p; p++)    for (p = pattern; *p; p++)
923      {      {
# Line 1004  mu_expand_path_pattern (const char *patt Line 929  mu_expand_path_pattern (const char *patt
929              break;              break;
930                            
931            case 'h':            case 'h':
932              if (!homedir)              if (!auth)
933                {                {
934                  struct passwd *pwd = mu_getpwnam (username);                  auth = mu_get_auth_by_name (username);
935                  if (!pwd)                  if (!auth)
936                    return NULL;                    return NULL;
                 homedir = pwd->pw_dir;  
937                }                }
938              len += strlen (homedir);              len += strlen (auth->dir);
939              break;              break;
940                            
941            case '%':            case '%':
# Line 1043  mu_expand_path_pattern (const char *patt Line 967  mu_expand_path_pattern (const char *patt
967            break;            break;
968                        
969          case 'h':          case 'h':
970            strcpy (q, homedir);            strcpy (q, auth->dir);
971            q += strlen (homedir);            q += strlen (auth->dir);
972            break;            break;
973                        
974          case '%':          case '%':
# Line 1063  mu_expand_path_pattern (const char *patt Line 987  mu_expand_path_pattern (const char *patt
987        q += strlen (startp);        q += strlen (startp);
988      }      }
989    *q = 0;    *q = 0;
990      if (auth)
991        mu_auth_data_free (auth);
992    return path;    return path;
993  }  }

Legend:
Removed from v.1.35  
changed lines
  Added in v.1.36

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