From 7173d0719281cd10f80a10aa903b8134430f678e Mon Sep 17 00:00:00 2001 From: Michael Elkins Date: Tue, 16 Jan 2001 19:45:08 +0000 Subject: [PATCH] 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. --- TODO | 4 ++-- config.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- imap.c | 1 - isync.1 | 12 +++++++++++- isync.h | 3 ++- main.c | 35 +++++++++++++++++++++++++---------- 6 files changed, 86 insertions(+), 18 deletions(-) diff --git a/TODO b/TODO index 6366c7a..9fc1131 100644 --- a/TODO +++ b/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 diff --git a/config.c b/config.c index 1f03f14..ed65236 100644 --- a/config.c +++ b/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)) { diff --git a/imap.c b/imap.c index 4109f42..137d904 100644 --- a/imap.c +++ b/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); diff --git a/isync.1 b/isync.1 index daf6812..71dcfdb 100644 --- a/isync.1 +++ b/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 diff --git a/isync.h b/isync.h index 62e0128..b0b0c7c 100644 --- a/isync.h +++ b/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; diff --git a/main.c b/main.c index 02659ae..eb93bd1 100644 --- a/main.c +++ b/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);