d3e988edd5925d4527b6b733f6e2949a6bf29a3c
[mmh] / sbr / m_draft.c
1
2 /*
3  * m_draft.c -- construct the name of a draft message
4  *
5  * $Id$
6  *
7  * This code is Copyright (c) 2002, by the authors of nmh.  See the
8  * COPYRIGHT file in the root directory of the nmh distribution for
9  * complete copyright information.
10  */
11
12 #include <h/mh.h>
13 #include <h/utils.h>
14 #include <errno.h>
15
16
17 char *
18 m_draft (char *folder, char *msg, int use, int *isdf)
19 {
20     register char *cp;
21     register struct msgs *mp;
22     static char buffer[BUFSIZ];
23
24     if (*isdf == -1 || folder == NULL || *folder == '\0') {
25         if (*isdf == -1 || (cp = context_find ("Draft-Folder")) == NULL) {
26             *isdf = 0;
27             return m_maildir (msg && *msg ? msg : draft);
28         } else {
29             folder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp,
30                     *cp != '@' ? TFOLDER : TSUBCWF);
31         }
32     }
33     *isdf = 1;
34     
35     chdir (m_maildir (""));
36     strncpy (buffer, m_maildir (folder), sizeof(buffer));
37
38     create_folder (buffer, 0, done);
39
40     if (chdir (buffer) == -1)
41         adios (buffer, "unable to change directory to");
42
43     if (!(mp = folder_read (folder)))
44         adios (NULL, "unable to read folder %s", folder);
45
46     /*
47      * Make sure we have enough message status space for all
48      * the message numbers from 1 to "new", since we might
49      * select an empty slot.  If we add more space at the
50      * end, go ahead and add 10 additional slots.
51      */
52     if (mp->hghmsg >= mp->hghoff) {
53         if (!(mp = folder_realloc (mp, 1, mp->hghmsg + 10)))
54             adios (NULL, "unable to allocate folder storage");
55     } else if (mp->lowoff > 1) {
56         if (!(mp = folder_realloc (mp, 1, mp->hghoff)))
57             adios (NULL, "unable to allocate folder storage");
58     }
59
60     mp->msgflags |= ALLOW_NEW;  /* allow the "new" sequence */
61
62     /*
63      * If we have been give a valid message name, then use that.
64      * Else, if we are given the "use" option, then use the
65      * current message.  Else, use special sequence "new".
66      */
67     if (!m_convert (mp, msg && *msg ? msg : use ? "cur" : "new"))
68         done (1);
69     seq_setprev (mp);
70
71     if (mp->numsel > 1)
72         adios (NULL, "only one message draft at a time!");
73
74     snprintf (buffer, sizeof(buffer), "%s/%s", mp->foldpath, m_name (mp->lowsel));
75     cp = buffer;
76
77     seq_setcur (mp, mp->lowsel);/* set current message for folder */
78     seq_save (mp);              /* synchronize message sequences  */
79     folder_free (mp);           /* free folder/message structure  */
80
81     return cp;
82 }