/[mailutils]/mailutils/mail/file.c
ViewVC logotype

Diff of /mailutils/mail/file.c

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

revision 1.8 by gray, Mon Jul 15 07:41:23 2002 UTC revision 1.9 by gray, Tue Jul 16 10:25:59 2002 UTC
# Line 19  Line 19 
19    
20  static char *prev_name;  static char *prev_name;
21    
22    /* Expand mail special characters:
23     * #        the previous file
24     * &        the current mbox
25     * +file    the file named in the folder directory (set folder=foo)
26     * Note 1) The followig notations are left intact, since they are
27     * handled by mailbox_create_default:
28     * %        system mailbox
29     * %user    system mailbox of the user (bo
30     * Note 2) Allocates memory
31     */
32    char *
33    mail_expand_name (const char *name)
34    {
35      struct mail_env_entry *env;
36    
37      switch (name[0])
38        {
39        case '#':
40          if (!prev_name)
41            util_error ("No previous file");
42          else
43            name = xstrdup (prev_name);
44          break;
45              
46        case '&':
47          name = getenv ("MBOX");
48          if (!name)
49            util_error ("MBOX environment variable not set");
50          else
51            name = xstrdup (name);
52          break;
53              
54        case '+':
55          env = util_find_env ("folder");
56          if (!env->set)
57            {
58              util_error ("No value set for \"folder\"");
59              return NULL;
60            }
61          else
62            {
63              char *tmp;
64              
65              if (env->value[0] != '/' && env->value[1] != '~')
66                {
67                  char *home = mu_get_homedir ();
68                  tmp  = xmalloc (strlen (home) + 1 +
69                                  strlen (env->value) + 1 +
70                                  strlen (name + 1) + 1);
71                  sprintf (tmp, "%s/%s/%s", home, env->value, name + 1);
72                }
73              else
74                {
75                  tmp  = xmalloc (strlen (env->value) + 1 +
76                                  strlen (name + 1) + 1);
77                  sprintf (tmp, "%s/%s", env->value, name + 1);
78                }
79              name = tmp;
80            }
81          break;
82    
83        default:
84          name = xstrdup (name);
85          break;
86        }
87      return (char*) name;
88    }
89    
90  /*  /*
91   * fi[le] [file]   * fi[le] [file]
92   * fold[er] [file]   * fold[er] [file]
# Line 33  mail_file (int argc, char **argv) Line 101  mail_file (int argc, char **argv)
101      }      }
102    else if (argc == 2)    else if (argc == 2)
103      {      {
104          /* switch folders */
105        char *pname;        char *pname;
106        url_t url;        url_t url;
   
       /* switch folders */  
       /*  
        * special characters:  
        * %      system mailbox  
        * %user  system mailbox of the user  
        * #      the previous file  
        * &      the current mbox  
        * +file  the file named in the folder directory (set folder=foo)  
        */  
107        mailbox_t newbox = NULL;        mailbox_t newbox = NULL;
108        struct mail_env_entry *env;        char *name = mail_expand_name (argv[1]);
109        char *name;  
110                if (!name)
111        switch (argv[1][0])          return 1;
         {  
         case '#':  
           if (!prev_name)  
             {  
               util_error("No previous file");  
               return 1;  
             }  
           name = prev_name;  
           break;  
             
         case '&':  
           name = getenv ("MBOX");  
           break;  
             
         case '+':  
           env = util_find_env ("folder");  
           if (env->set && env->value[0] != '/' && env->value[1] != '~')  
             {  
               char *home = mu_get_homedir ();  
               name = alloca (strlen (home) + 1 +  
                              strlen (env->value) + 1 +  
                              strlen (argv[1] + 1) + 1);  
               if (!name)  
                 {  
                   util_error ("Not enough memory");  
                   return 1;  
                 }  
               sprintf (name, "%s/%s/%s", home, env->value, argv[1] + 1);  
             }  
           else  
             name = argv[1];  
           break;  
             
         default:  
           name = argv[1];  
         }  
112                
113        if (mailbox_create_default (&newbox, name) != 0        if (mailbox_create_default (&newbox, name) != 0
114            || mailbox_open (newbox, MU_STREAM_READ) != 0)            || mailbox_open (newbox, MU_STREAM_RDWR) != 0)
115          {          {
116            mailbox_destroy (&newbox);            mailbox_destroy (&newbox);
117            util_error("can't open mailbox %s: %s",            util_error("can't open mailbox %s: %s", name, mu_errstring (errno));
118                       name ? name : "%", strerror(errno));            free (name);
119            return 1;            return 1;
120          }          }
121    
122          free (name); /* won't need it any more */
123    
124        mailbox_get_url (mbox, &url);        mailbox_get_url (mbox, &url);
125        pname = strdup (url_to_string (url));        pname = strdup (url_to_string (url));
126        if (mail_mbox_close ())        if (mail_mbox_close ())
# Line 103  mail_file (int argc, char **argv) Line 128  mail_file (int argc, char **argv)
128            if (pname)            if (pname)
129              free (pname);              free (pname);
130            mailbox_close (newbox);            mailbox_close (newbox);
131            mailbox_destroy (&newbox);            mailbox_destroy (&newbox);
132            return 1;            return 1;
133          }          }
134                

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.9

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