1 /*@ S-nail - a mail user agent derived from Berkeley Mail.
2 *@ Folder related user commands.
4 * Copyright (c) 2000-2004 Gunnar Ritter, Freiburg i. Br., Germany.
5 * Copyright (c) 2012 - 2017 Steffen (Daode) Nurpmeso <steffen@sdaoden.eu>.
8 * Copyright (c) 1980, 1993
9 * The Regents of the University of California. All rights reserved.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 #define n_FILE cmd_folder
38 #ifndef HAVE_AMALGAMATION
43 static int _c_file(void *v
, enum fedit_mode fm
);
46 _c_file(void *v
, enum fedit_mode fm
)
58 if (n_pstate
& n_PS_HOOK_MASK
) {
59 n_err(_("Cannot change folder from within a hook\n"));
64 save_mbox_for_possible_quitstuff();
66 i
= setfile(*argv
, fm
);
71 assert(!(fm
& FEDIT_NEWMAIL
)); /* (Prevent implementation error) */
72 if (n_pstate
& n_PS_SETFILE_OPENED
)
73 temporary_folder_hook_check(FAL0
);
76 /* TODO Don't report "no messages" == 1 == error when we're in, e.g.,
77 * TODO a macro: because that recursed commando loop will terminate the
78 * TODO entire macro due to that! So either the user needs to be able
79 * TODO to react&ignore this "error" (as in "if DOSTUFF" or "DOSTUFF;
80 * TODO if $?", then "overriding an "error"), or we need a different
81 * TODO return that differentiates */
82 i
= (n_pstate
& n_PS_ROBOT
) ? 0 : 1;
85 if (n_pstate
& n_PS_SETFILE_OPENED
)
86 announce(ok_blook(bsdcompat
) || ok_blook(bsdannounce
));
99 rv
= _c_file(v
, FEDIT_NONE
);
110 rv
= _c_file(v
, FEDIT_RDONLY
);
122 if (n_pstate
& n_PS_HOOK_MASK
)
123 n_err(_("Cannot call `newmail' from within a hook\n"));
124 else if ((val
= setfile(mailname
,
125 FEDIT_NEWMAIL
| ((mb
.mb_perm
& MB_DELE
) ? 0 : FEDIT_RDONLY
))
128 setdot(message
+ mdot
- 1);
141 switch (mb
.mb_type
) {
146 rv
= c_cmdnotsupp(NULL
);
161 char **args
, *name
, *ename
;
165 if (*(args
= v
) == NULL
) {
166 n_err(_("Synopsis: remove: <mailbox>...\n"));
173 fmt
= _("Remove %s");
174 fmt_len
= strlen(fmt
);
176 if ((name
= fexpand(*args
, FEXP_FULL
)) == NULL
)
178 ename
= n_shexp_quote_cp(name
, FAL0
);
180 if (!strcmp(name
, mailname
)) {
181 n_err(_("Cannot remove current mailbox %s\n"), ename
);
186 size_t vl
= strlen(ename
) + fmt_len
+1;
187 char *vb
= salloc(vl
);
189 snprintf(vb
, vl
, fmt
, ename
);
190 asw
= getapproval(vb
, TRU1
);
195 switch (which_protocol(name
)) {
197 if (unlink(name
) == -1) { /* TODO do not handle .gz .bz2 .xz.. */
203 if (!stat(name
, &sb
) && S_ISDIR(sb
.st_mode
)) {
214 n_err(_("Cannot remove POP3 mailbox %s\n"), ename
);
218 if (maildir_remove(name
) != OKAY
)
222 n_err(_("Not removed: unknown protocol: %s\n"), ename
);
226 } while (*++args
!= NULL
);
235 char **args
= v
, *old
, *new;
236 enum protocol oldp
, newp
;
242 if (args
[0] == NULL
|| args
[1] == NULL
|| args
[2] != NULL
) {
243 n_err(_("Synopsis: rename: <old> <new>\n"));
247 if ((old
= fexpand(args
[0], FEXP_FULL
)) == NULL
)
249 oldp
= which_protocol(old
);
250 if ((new = fexpand(args
[1], FEXP_FULL
)) == NULL
)
252 newp
= which_protocol(new);
254 if (!strcmp(old
, mailname
) || !strcmp(new, mailname
)) {
255 n_err(_("Cannot rename current mailbox %s\n"),
256 n_shexp_quote_cp(old
, FAL0
));
262 if (newp
== PROTO_POP3
)
266 if (link(old
, new) == -1) {
281 } else if (unlink(old
) == -1) {
287 if (rename(old
, new) == -1) {
294 n_err(_("Cannot rename POP3 mailboxes\n"));
299 n_err(_("Unknown protocol in %s and %s; not renamed\n"),
300 n_shexp_quote_cp(old
, FAL0
), n_shexp_quote_cp(new, FAL0
));
319 if(*(argv
= v
) != NULL
){
320 if((cp
= fexpand(*argv
, FEXP_NSHELL
| FEXP_LOCAL
)) == NULL
) /* XXX NSH? */
325 rv
= run_command(ok_vlook(LISTER
), 0, COMMAND_FD_PASS
, COMMAND_FD_PASS
, cp
,