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] |
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 ()) |
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 |
|
|