added support for tilde (~) expansion in the Mailbox' and
CertificateFile'
configuration directives added `Maildir' configuration command to specify the default location of the user's mailboxes. If a relative path is used in a `Mailbox' command, this path is used as a prefix.
This commit is contained in:
parent
b3672634e5
commit
7173d07192
4
TODO
4
TODO
|
@ -1,3 +1,3 @@
|
|||
add upload support to mirror local msgs on the server
|
||||
|
||||
add support for syncing with other: and shared: via NAMESPACE
|
||||
|
||||
finish implementing --quiet
|
||||
|
|
49
config.c
49
config.c
|
@ -51,6 +51,43 @@ config_defaults (config_t * conf)
|
|||
#endif
|
||||
}
|
||||
|
||||
/* `s' is destroyed by this call */
|
||||
static char *
|
||||
expand_strdup (char *s)
|
||||
{
|
||||
char path[_POSIX_PATH_MAX];
|
||||
struct passwd *pw;
|
||||
char *p;
|
||||
|
||||
if (*s == '~')
|
||||
{
|
||||
s++;
|
||||
if (*s == '/')
|
||||
{
|
||||
/* current user */
|
||||
pw = getpwuid (getuid ());
|
||||
p = s + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
p = strchr (s, '/');
|
||||
if (p)
|
||||
*p++ = 0;
|
||||
pw = getpwnam (s);
|
||||
}
|
||||
if (!pw)
|
||||
return 0;
|
||||
snprintf (path, sizeof (path), "%s/%s", pw->pw_dir, p ? p : "");
|
||||
s = path;
|
||||
}
|
||||
else if (*s != '/')
|
||||
{
|
||||
snprintf (path, sizeof (path), "%s/%s", global.maildir, s);
|
||||
s = path;
|
||||
}
|
||||
return strdup (s);
|
||||
}
|
||||
|
||||
void
|
||||
load_config (const char *where)
|
||||
{
|
||||
|
@ -94,7 +131,13 @@ load_config (const char *where)
|
|||
cur = &(*cur)->next;
|
||||
*cur = calloc (1, sizeof (config_t));
|
||||
config_defaults (*cur);
|
||||
(*cur)->path = strdup (val);
|
||||
(*cur)->path = expand_strdup (val);
|
||||
}
|
||||
else if (!strncasecmp ("maildir", cmd, 7))
|
||||
{
|
||||
/* this only affects the global setting */
|
||||
free (global.maildir);
|
||||
global.maildir = expand_strdup (val);
|
||||
}
|
||||
else if (!strncasecmp ("host", cmd, 4))
|
||||
{
|
||||
|
@ -184,9 +227,9 @@ load_config (const char *where)
|
|||
else if (!strncasecmp ("CertificateFile", cmd, 15))
|
||||
{
|
||||
if (*cur)
|
||||
(*cur)->cert_file = strdup (val);
|
||||
(*cur)->cert_file = expand_strdup (val);
|
||||
else
|
||||
global.cert_file = strdup (val);
|
||||
global.cert_file = expand_strdup (val);
|
||||
}
|
||||
else if (!strncasecmp ("RequireSSL", cmd, 10))
|
||||
{
|
||||
|
|
1
imap.c
1
imap.c
|
@ -727,7 +727,6 @@ imap_open (config_t * box, unsigned int minuid, imap_t * imap)
|
|||
void
|
||||
imap_close (imap_t * imap)
|
||||
{
|
||||
puts ("Closing IMAP connection");
|
||||
imap_exec (imap, "LOGOUT");
|
||||
close (imap->sock->fd);
|
||||
free (imap->sock);
|
||||
|
|
12
isync.1
12
isync.1
|
@ -16,7 +16,7 @@
|
|||
\" along with this program; if not, write to the Free Software
|
||||
\" Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
..
|
||||
.TH isync 1 "2000 Dec 27"
|
||||
.TH isync 1 "2001 Jan 16"
|
||||
..
|
||||
.SH NAME
|
||||
isync - synchronize IMAP4 and maildir mailboxes
|
||||
|
@ -168,6 +168,16 @@ command line option overrides this setting when set to
|
|||
\fIno\fR.
|
||||
..
|
||||
.TP
|
||||
\fBMailDir\fR \fIstring\fR
|
||||
Specifies the location for your mailboxes if a relative path is
|
||||
specified in a
|
||||
.I Mailbox
|
||||
command.
|
||||
(Default:
|
||||
.I ~
|
||||
)
|
||||
..
|
||||
.TP
|
||||
\fBMaxSize\fR \fIbytes\fR
|
||||
Sets a threshold for the maximum message size (in bytes) for which
|
||||
.B isync
|
||||
|
|
3
isync.h
3
isync.h
|
@ -47,7 +47,8 @@ typedef struct message message_t;
|
|||
|
||||
struct config
|
||||
{
|
||||
char *path;
|
||||
char *maildir;
|
||||
char *path; /* path relative to .maildir, or absolute path */
|
||||
char *host;
|
||||
int port;
|
||||
char *user;
|
||||
|
|
35
main.c
35
main.c
|
@ -41,6 +41,7 @@ struct option Opts[] = {
|
|||
{"remote", 1, NULL, 'r'},
|
||||
{"host", 1, NULL, 's'},
|
||||
{"port", 1, NULL, 'p'},
|
||||
{"quiet", 0, NULL, 'q'},
|
||||
{"user", 1, NULL, 'u'},
|
||||
{"version", 0, NULL, 'v'},
|
||||
{"verbose", 0, NULL, 'V'},
|
||||
|
@ -134,6 +135,7 @@ main (int argc, char **argv)
|
|||
int delete = 0;
|
||||
char *config = 0;
|
||||
struct passwd *pw;
|
||||
int quiet = 0;
|
||||
|
||||
pw = getpwuid (getuid ());
|
||||
|
||||
|
@ -142,6 +144,7 @@ main (int argc, char **argv)
|
|||
global.port = 143;
|
||||
global.box = "INBOX";
|
||||
global.user = strdup (pw->pw_name);
|
||||
global.maildir = strdup (pw->pw_dir);
|
||||
global.max_size = 0;
|
||||
global.use_namespace = 1;
|
||||
#if HAVE_LIBSSL
|
||||
|
@ -155,9 +158,9 @@ main (int argc, char **argv)
|
|||
#endif
|
||||
|
||||
#if HAVE_GETOPT_LONG
|
||||
while ((i = getopt_long (argc, argv, "c:defhp:u:r:s:vV", Opts, NULL)) != -1)
|
||||
while ((i = getopt_long (argc, argv, "c:defhp:qu:r:s:vV", Opts, NULL)) != -1)
|
||||
#else
|
||||
while ((i = getopt (argc, argv, "c:defhp:u:r:s:vV")) != -1)
|
||||
while ((i = getopt (argc, argv, "c:defhp:u:qr:s:vV")) != -1)
|
||||
#endif
|
||||
{
|
||||
switch (i)
|
||||
|
@ -177,6 +180,10 @@ main (int argc, char **argv)
|
|||
case 'p':
|
||||
global.port = atoi (optarg);
|
||||
break;
|
||||
case 'q':
|
||||
quiet = 1;
|
||||
Verbose = 0;
|
||||
break;
|
||||
case 'r':
|
||||
global.box = optarg;
|
||||
break;
|
||||
|
@ -241,7 +248,8 @@ main (int argc, char **argv)
|
|||
box->pass = strdup (global.pass);
|
||||
}
|
||||
|
||||
printf ("Reading %s\n", box->path);
|
||||
if(!quiet)
|
||||
printf ("Reading %s\n", box->path);
|
||||
mail = maildir_open (box->path, fast);
|
||||
if (!mail)
|
||||
{
|
||||
|
@ -253,7 +261,8 @@ main (int argc, char **argv)
|
|||
if (!imap)
|
||||
exit (1);
|
||||
|
||||
puts ("Synchronizing");
|
||||
if (!quiet)
|
||||
puts ("Synchronizing");
|
||||
i = delete ? SYNC_DELETE : 0;
|
||||
i |= (expunge || box->expunge) ? SYNC_EXPUNGE : 0;
|
||||
if (sync_mailbox (mail, imap, i, box->max_size))
|
||||
|
@ -264,11 +273,13 @@ main (int argc, char **argv)
|
|||
if (expunge && (imap->deleted || mail->deleted))
|
||||
{
|
||||
/* remove messages marked for deletion */
|
||||
printf ("Expunging %d messages from server\n", imap->deleted);
|
||||
if (!quiet)
|
||||
printf ("Expunging %d messages from server\n", imap->deleted);
|
||||
if (imap_expunge (imap))
|
||||
exit (1);
|
||||
printf ("Expunging %d messages from local mailbox\n",
|
||||
mail->deleted);
|
||||
if (!quiet)
|
||||
printf ("Expunging %d messages from local mailbox\n",
|
||||
mail->deleted);
|
||||
if (maildir_expunge (mail, 0))
|
||||
exit (1);
|
||||
}
|
||||
|
@ -280,9 +291,13 @@ main (int argc, char **argv)
|
|||
maildir_expunge (mail, 1);
|
||||
|
||||
/* write changed flags back to the mailbox */
|
||||
printf ("Committing changes to %s\n", mail->path);
|
||||
if (maildir_sync (mail))
|
||||
exit (1);
|
||||
if (mail->changed)
|
||||
{
|
||||
if (!quiet)
|
||||
printf ("Committing changes to %s\n", mail->path);
|
||||
if (maildir_sync (mail))
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
maildir_close (mail);
|
||||
|
|
Loading…
Reference in New Issue
Block a user