소스 검색

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.

Michael Elkins 24 년 전
부모
커밋
7173d07192
6개의 변경된 파일86개의 추가작업 그리고 18개의 파일을 삭제
  1. 2 2
      TODO
  2. 46 3
      config.c
  3. 0 1
      imap.c
  4. 11 1
      isync.1
  5. 2 1
      isync.h
  6. 25 10
      main.c

+ 2 - 2
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

+ 46 - 3
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))
 	{

+ 0 - 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);

+ 11 - 1
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

+ 2 - 1
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;

+ 25 - 10
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);