Browse Source

reshuffle sources a bit

split header and move some code to more logical places.
Oswald Buddenhagen 11 năm trước cách đây
mục cha
commit
03b3b566f1
18 tập tin đã thay đổi với 480 bổ sung345 xóa
  1. 2 2
      .gitignore
  2. 1 1
      configure.ac
  3. 2 2
      src/Makefile.am
  4. 131 0
      src/common.h
  5. 1 1
      src/compat/isync.h
  6. 3 35
      src/config.c
  7. 45 0
      src/config.h
  8. 68 0
      src/driver.c
  9. 6 275
      src/driver.h
  10. 3 1
      src/drv_imap.c
  11. 1 1
      src/drv_maildir.c
  12. 4 1
      src/main.c
  13. 1 1
      src/mdconvert.c
  14. 7 11
      src/socket.c
  15. 118 0
      src/socket.h
  16. 5 1
      src/sync.c
  17. 81 0
      src/sync.h
  18. 1 13
      src/util.c

+ 2 - 2
.gitignore

@@ -5,10 +5,10 @@ Makefile
 Makefile.in
 autom4te.cache
 aclocal.m4
+autodefs.h
+autodefs.h.in
 build-stamp
 compile
-config.h
-config.h.in
 config.cache
 config.guess
 config.log

+ 1 - 1
configure.ac

@@ -1,5 +1,5 @@
 AC_INIT([isync], [1.1.0])
-AC_CONFIG_HEADERS([config.h])
+AC_CONFIG_HEADERS([autodefs.h])
 AM_INIT_AUTOMAKE
 
 AM_MAINTAINER_MODE

+ 2 - 2
src/Makefile.am

@@ -5,9 +5,9 @@ SUBDIRS = $(compat_dir)
 
 bin_PROGRAMS = mbsync mdconvert
 
-mbsync_SOURCES = main.c sync.c config.c util.c socket.c drv_imap.c drv_maildir.c
+mbsync_SOURCES = main.c sync.c config.c util.c socket.c driver.c drv_imap.c drv_maildir.c
 mbsync_LDADD = -ldb $(SSL_LIBS) $(SOCK_LIBS)
-noinst_HEADERS = isync.h
+noinst_HEADERS = common.h config.h driver.h sync.h socket.h
 
 mdconvert_SOURCES = mdconvert.c
 mdconvert_LDADD = -ldb

+ 131 - 0
src/common.h

@@ -0,0 +1,131 @@
+/*
+ * mbsync - mailbox synchronizer
+ * Copyright (C) 2000-2002 Michael R. Elkins <me@mutt.org>
+ * Copyright (C) 2002-2006,2010-2012 Oswald Buddenhagen <ossi@users.sf.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * As a special exception, mbsync may be linked with the OpenSSL library,
+ * despite that library's more restrictive license.
+ */
+
+#ifndef COMMON_H
+#define COMMON_H
+
+#include <autodefs.h>
+
+#include <sys/types.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+#define as(ar) (sizeof(ar)/sizeof(ar[0]))
+
+#define __stringify(x) #x
+#define stringify(x) __stringify(x)
+
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
+# define ATTR_UNUSED __attribute__((unused))
+# define ATTR_NORETURN __attribute__((noreturn))
+# define ATTR_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+# define ATTR_UNUSED
+# define ATTR_NORETURN
+# define ATTR_PRINTFLIKE(fmt,var)
+#endif
+
+#ifdef __GNUC__
+# define INLINE __inline__
+#else
+# define INLINE
+#endif
+
+#define EXE "mbsync"
+
+/* main.c */
+
+#define DEBUG        1
+#define VERBOSE      2
+#define XVERBOSE     4
+#define QUIET        8
+#define VERYQUIET    16
+#define KEEPJOURNAL  32
+#define ZERODELAY    64
+#define CRASHDEBUG   128
+
+extern int DFlags;
+extern int UseFSync;
+
+extern int Pid;
+extern char Hostname[256];
+extern const char *Home;
+
+/* util.c */
+
+void ATTR_PRINTFLIKE(1, 2) debug( const char *, ... );
+void ATTR_PRINTFLIKE(1, 2) debugn( const char *, ... );
+void ATTR_PRINTFLIKE(1, 2) info( const char *, ... );
+void ATTR_PRINTFLIKE(1, 2) infon( const char *, ... );
+void ATTR_PRINTFLIKE(1, 2) warn( const char *, ... );
+void ATTR_PRINTFLIKE(1, 2) error( const char *, ... );
+void ATTR_PRINTFLIKE(1, 2) sys_error( const char *, ... );
+void flushn( void );
+
+typedef struct string_list {
+	struct string_list *next;
+	char string[1];
+} string_list_t;
+
+void add_string_list_n( string_list_t **list, const char *str, int len );
+void add_string_list( string_list_t **list, const char *str );
+void free_string_list( string_list_t *list );
+
+#ifndef HAVE_MEMRCHR
+void *memrchr( const void *s, int c, size_t n );
+#endif
+
+void *nfmalloc( size_t sz );
+void *nfcalloc( size_t sz );
+void *nfrealloc( void *mem, size_t sz );
+char *nfstrdup( const char *str );
+int nfvasprintf( char **str, const char *fmt, va_list va );
+int ATTR_PRINTFLIKE(2, 3) nfasprintf( char **str, const char *fmt, ... );
+int ATTR_PRINTFLIKE(3, 4) nfsnprintf( char *buf, int blen, const char *fmt, ... );
+void ATTR_NORETURN oob( void );
+
+char *expand_strdup( const char *s );
+
+int map_name( const char *arg, char **result, int reserve, const char *in, const char *out );
+
+void sort_ints( int *arr, int len );
+
+void arc4_init( void );
+unsigned char arc4_getbyte( void );
+
+int bucketsForSize( int size );
+
+#ifdef HAVE_SYS_POLL_H
+# include <sys/poll.h>
+#else
+# define POLLIN 1
+# define POLLOUT 4
+# define POLLERR 8
+#endif
+
+void add_fd( int fd, void (*cb)( int events, void *aux ), void *aux );
+void conf_fd( int fd, int and_events, int or_events );
+void fake_fd( int fd, int events );
+void del_fd( int fd );
+void main_loop( void );
+
+#endif

+ 1 - 1
src/compat/isync.h

@@ -17,7 +17,7 @@
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <config.h>
+#include <autodefs.h>
 
 #include <sys/types.h>
 #include <stdarg.h>

+ 3 - 35
src/config.c

@@ -20,7 +20,9 @@
  * despite that library's more restrictive license.
  */
 
-#include "isync.h"
+#include "config.h"
+
+#include "sync.h"
 
 #include <assert.h>
 #include <unistd.h>
@@ -32,13 +34,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 
-driver_t *drivers[N_DRIVERS] = { &maildir_driver, &imap_driver };
-
-channel_conf_t global_conf;
 store_conf_t *stores;
-channel_conf_t *channels;
-group_conf_t *groups;
-int UseFSync = 1;
 
 #define ARG_OPTIONAL 0
 #define ARG_REQUIRED 1
@@ -491,31 +487,3 @@ load_config( const char *where, int pseudo )
 		unlink( where );
 	return cfile.err;
 }
-
-void
-parse_generic_store( store_conf_t *store, conffile_t *cfg )
-{
-	if (!strcasecmp( "Trash", cfg->cmd ))
-		store->trash = nfstrdup( cfg->val );
-	else if (!strcasecmp( "TrashRemoteNew", cfg->cmd ))
-		store->trash_remote_new = parse_bool( cfg );
-	else if (!strcasecmp( "TrashNewOnly", cfg->cmd ))
-		store->trash_only_new = parse_bool( cfg );
-	else if (!strcasecmp( "MaxSize", cfg->cmd ))
-		store->max_size = parse_size( cfg );
-	else if (!strcasecmp( "MapInbox", cfg->cmd ))
-		store->map_inbox = nfstrdup( cfg->val );
-	else if (!strcasecmp( "Flatten", cfg->cmd )) {
-		const char *p;
-		for (p = cfg->val; *p; p++)
-			if (*p == '/') {
-				error( "%s:%d: flattened hierarchy delimiter cannot contain the canonical delimiter '/'\n", cfg->file, cfg->line );
-				cfg->err = 1;
-				return;
-			}
-		store->flat_delim = nfstrdup( cfg->val );
-	} else {
-		error( "%s:%d: unknown keyword '%s'\n", cfg->file, cfg->line, cfg->cmd );
-		cfg->err = 1;
-	}
-}

+ 45 - 0
src/config.h

@@ -0,0 +1,45 @@
+/*
+ * mbsync - mailbox synchronizer
+ * Copyright (C) 2000-2002 Michael R. Elkins <me@mutt.org>
+ * Copyright (C) 2002-2006,2010-2012 Oswald Buddenhagen <ossi@users.sf.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * As a special exception, mbsync may be linked with the OpenSSL library,
+ * despite that library's more restrictive license.
+ */
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "common.h"
+
+typedef struct conffile {
+	const char *file;
+	FILE *fp;
+	char *buf;
+	int bufl;
+	int line;
+	int err;
+	char *cmd, *val, *rest;
+} conffile_t;
+
+int parse_bool( conffile_t *cfile );
+int parse_int( conffile_t *cfile );
+int parse_size( conffile_t *cfile );
+int getcline( conffile_t *cfile );
+int merge_ops( int cops, int ops[] );
+int load_config( const char *filename, int pseudo );
+
+#endif

+ 68 - 0
src/driver.c

@@ -0,0 +1,68 @@
+/*
+ * mbsync - mailbox synchronizer
+ * Copyright (C) 2000-2002 Michael R. Elkins <me@mutt.org>
+ * Copyright (C) 2002-2006,2010-2012 Oswald Buddenhagen <ossi@users.sf.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * As a special exception, mbsync may be linked with the OpenSSL library,
+ * despite that library's more restrictive license.
+ */
+
+#include "driver.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+driver_t *drivers[N_DRIVERS] = { &maildir_driver, &imap_driver };
+
+void
+free_generic_messages( message_t *msgs )
+{
+	message_t *tmsg;
+
+	for (; msgs; msgs = tmsg) {
+		tmsg = msgs->next;
+		free( msgs );
+	}
+}
+
+void
+parse_generic_store( store_conf_t *store, conffile_t *cfg )
+{
+	if (!strcasecmp( "Trash", cfg->cmd )) {
+		store->trash = nfstrdup( cfg->val );
+	} else if (!strcasecmp( "TrashRemoteNew", cfg->cmd )) {
+		store->trash_remote_new = parse_bool( cfg );
+	} else if (!strcasecmp( "TrashNewOnly", cfg->cmd )) {
+		store->trash_only_new = parse_bool( cfg );
+	} else if (!strcasecmp( "MaxSize", cfg->cmd )) {
+		store->max_size = parse_size( cfg );
+	} else if (!strcasecmp( "MapInbox", cfg->cmd )) {
+		store->map_inbox = nfstrdup( cfg->val );
+	} else if (!strcasecmp( "Flatten", cfg->cmd )) {
+		const char *p;
+		for (p = cfg->val; *p; p++) {
+			if (*p == '/') {
+				error( "%s:%d: flattened hierarchy delimiter cannot contain the canonical delimiter '/'\n", cfg->file, cfg->line );
+				cfg->err = 1;
+				return;
+			}
+		}
+		store->flat_delim = nfstrdup( cfg->val );
+	} else {
+		error( "%s:%d: unknown keyword '%s'\n", cfg->file, cfg->line, cfg->cmd );
+		cfg->err = 1;
+	}
+}

+ 6 - 275
src/isync.h → src/driver.h

@@ -20,121 +20,10 @@
  * despite that library's more restrictive license.
  */
 
-#include <config.h>
+#ifndef DRIVER_H
+#define DRIVER_H
 
-#include <sys/types.h>
-#include <stdarg.h>
-#include <stdio.h>
-
-#define as(ar) (sizeof(ar)/sizeof(ar[0]))
-
-#define __stringify(x) #x
-#define stringify(x) __stringify(x)
-
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
-# define ATTR_UNUSED __attribute__((unused))
-# define ATTR_NORETURN __attribute__((noreturn))
-# define ATTR_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
-#else
-# define ATTR_UNUSED
-# define ATTR_NORETURN
-# define ATTR_PRINTFLIKE(fmt,var)
-#endif
-
-#ifdef __GNUC__
-# define INLINE __inline__
-#else
-# define INLINE
-#endif
-
-#define EXE "mbsync"
-
-typedef struct ssl_st SSL;
-typedef struct ssl_ctx_st SSL_CTX;
-typedef struct x509_store_st X509_STORE;
-
-typedef struct server_conf {
-	char *tunnel;
-	char *host;
-	int port;
-#ifdef HAVE_LIBSSL
-	char *cert_file;
-	char use_imaps;
-	char use_sslv2, use_sslv3, use_tlsv1, use_tlsv11, use_tlsv12;
-
-	/* these are actually variables and are leaked at the end */
-	char ssl_ctx_valid;
-	unsigned num_trusted;
-	SSL_CTX *SSLContext;
-#endif
-} server_conf_t;
-
-typedef struct buff_chunk {
-	struct buff_chunk *next;
-	char *data;
-	int len;
-	char buf[1];
-} buff_chunk_t;
-
-typedef struct {
-	/* connection */
-	int fd;
-	int state;
-	const server_conf_t *conf; /* needed during connect */
-#ifdef HAVE_IPV6
-	struct addrinfo *addrs, *curr_addr; /* needed during connect */
-#else
-	char **curr_addr; /* needed during connect */
-#endif
-	char *name;
-#ifdef HAVE_LIBSSL
-	SSL *ssl;
-	int force_trusted;
-#endif
-
-	void (*bad_callback)( void *aux ); /* async fail while sending or listening */
-	void (*read_callback)( void *aux ); /* data available for reading */
-	int (*write_callback)( void *aux ); /* all *queued* data was sent */
-	union {
-		void (*connect)( int ok, void *aux );
-		void (*starttls)( int ok, void *aux );
-	} callbacks;
-	void *callback_aux;
-
-	/* writing */
-	buff_chunk_t *write_buf, **write_buf_append; /* buffer head & tail */
-	int write_offset; /* offset into buffer head */
-
-	/* reading */
-	int offset; /* start of filled bytes in buffer */
-	int bytes; /* number of filled bytes in buffer */
-	int scanoff; /* offset to continue scanning for newline at, relative to 'offset' */
-	char buf[100000];
-} conn_t;
-
-typedef struct {
-	const char *file;
-	FILE *fp;
-	char *buf;
-	int bufl;
-	int line;
-	int err;
-	char *cmd, *val, *rest;
-} conffile_t;
-
-#define OP_NEW             (1<<0)
-#define OP_RENEW           (1<<1)
-#define OP_DELETE          (1<<2)
-#define OP_FLAGS           (1<<3)
-#define  OP_MASK_TYPE      (OP_NEW|OP_RENEW|OP_DELETE|OP_FLAGS) /* asserted in the target ops */
-#define OP_EXPUNGE         (1<<4)
-#define OP_CREATE          (1<<5)
-#define XOP_PUSH           (1<<6)
-#define XOP_PULL           (1<<7)
-#define  XOP_MASK_DIR      (XOP_PUSH|XOP_PULL)
-#define XOP_HAVE_TYPE      (1<<8)
-#define XOP_HAVE_EXPUNGE   (1<<9)
-#define XOP_HAVE_CREATE    (1<<10)
+#include "config.h"
 
 typedef struct driver driver_t;
 
@@ -150,33 +39,6 @@ typedef struct store_conf {
 	char trash_remote_new, trash_only_new;
 } store_conf_t;
 
-typedef struct string_list {
-	struct string_list *next;
-	char string[1];
-} string_list_t;
-
-#define M 0 /* master */
-#define S 1 /* slave */
-
-typedef struct channel_conf {
-	struct channel_conf *next;
-	const char *name;
-	store_conf_t *stores[2];
-	const char *boxes[2];
-	char *sync_state;
-	string_list_t *patterns;
-	int ops[2];
-	unsigned max_messages; /* for slave only */
-	signed char expire_unread;
-	char use_internal_date;
-} channel_conf_t;
-
-typedef struct group_conf {
-	struct group_conf *next;
-	const char *name;
-	string_list_t *channels;
-} group_conf_t;
-
 /* For message->flags */
 /* Keep the mailbox driver flag definitions in sync! */
 /* The order is according to alphabetical maildir flag sort */
@@ -362,143 +224,12 @@ struct driver {
 	void (*commit)( store_t *ctx );
 };
 
-
-/* main.c */
-
-extern int Pid;
-extern char Hostname[256];
-extern const char *Home;
-
-
-/* socket.c */
-
-/* call this before doing anything with the socket */
-static INLINE void socket_init( conn_t *conn,
-                                const server_conf_t *conf,
-                                void (*bad_callback)( void *aux ),
-                                void (*read_callback)( void *aux ),
-                                int (*write_callback)( void *aux ),
-                                void *aux )
-{
-	conn->conf = conf;
-	conn->bad_callback = bad_callback;
-	conn->read_callback = read_callback;
-	conn->write_callback = write_callback;
-	conn->callback_aux = aux;
-	conn->fd = -1;
-	conn->name = 0;
-	conn->write_buf_append = &conn->write_buf;
-}
-void socket_connect( conn_t *conn, void (*cb)( int ok, void *aux ) );
-void socket_start_tls(conn_t *conn, void (*cb)( int ok, void *aux ) );
-void socket_close( conn_t *sock );
-int socket_read( conn_t *sock, char *buf, int len ); /* never waits */
-char *socket_read_line( conn_t *sock ); /* don't free return value; never waits */
-typedef enum { KeepOwn = 0, GiveOwn } ownership_t;
-int socket_write( conn_t *sock, char *buf, int len, ownership_t takeOwn );
-
-void cram( const char *challenge, const char *user, const char *pass,
-           char **_final, int *_finallen );
-
-
-/* util.c */
-
-#define DEBUG        1
-#define VERBOSE      2
-#define XVERBOSE     4
-#define QUIET        8
-#define VERYQUIET    16
-#define KEEPJOURNAL  32
-#define ZERODELAY    64
-#define CRASHDEBUG   128
-
-extern int DFlags;
-
-void ATTR_PRINTFLIKE(1, 2) debug( const char *, ... );
-void ATTR_PRINTFLIKE(1, 2) debugn( const char *, ... );
-void ATTR_PRINTFLIKE(1, 2) info( const char *, ... );
-void ATTR_PRINTFLIKE(1, 2) infon( const char *, ... );
-void ATTR_PRINTFLIKE(1, 2) warn( const char *, ... );
-void ATTR_PRINTFLIKE(1, 2) error( const char *, ... );
-void ATTR_PRINTFLIKE(1, 2) sys_error( const char *, ... );
-void flushn( void );
-
-void add_string_list_n( string_list_t **list, const char *str, int len );
-void add_string_list( string_list_t **list, const char *str );
-void free_string_list( string_list_t *list );
-
 void free_generic_messages( message_t * );
 
-#ifndef HAVE_MEMRCHR
-void *memrchr( const void *s, int c, size_t n );
-#endif
-
-void *nfmalloc( size_t sz );
-void *nfcalloc( size_t sz );
-void *nfrealloc( void *mem, size_t sz );
-char *nfstrdup( const char *str );
-int nfvasprintf( char **str, const char *fmt, va_list va );
-int ATTR_PRINTFLIKE(2, 3) nfasprintf( char **str, const char *fmt, ... );
-int ATTR_PRINTFLIKE(3, 4) nfsnprintf( char *buf, int blen, const char *fmt, ... );
-void ATTR_NORETURN oob( void );
-
-char *expand_strdup( const char *s );
-
-int map_name(const char *arg, char **result, int reserve, const char *in, const char *out );
-
-void sort_ints( int *arr, int len );
-
-void arc4_init( void );
-unsigned char arc4_getbyte( void );
-
-int bucketsForSize( int size );
-
-#ifdef HAVE_SYS_POLL_H
-# include <sys/poll.h>
-#else
-# define POLLIN 1
-# define POLLOUT 4
-# define POLLERR 8
-#endif
-
-void add_fd( int fd, void (*cb)( int events, void *aux ), void *aux );
-void conf_fd( int fd, int and_events, int or_events );
-void fake_fd( int fd, int events );
-void del_fd( int fd );
-void main_loop( void );
-
-/* sync.c */
-
-extern const char *str_ms[2], *str_hl[2];
-
-#define SYNC_OK       0 /* assumed to be 0 */
-#define SYNC_FAIL     1
-#define SYNC_FAIL_ALL 2
-#define SYNC_BAD(ms)  (4<<(ms))
-#define SYNC_NOGOOD   16 /* internal */
-#define SYNC_CANCELED 32 /* internal */
-
-/* All passed pointers must stay alive until cb is called. */
-void sync_boxes( store_t *ctx[], const char *names[], channel_conf_t *chan,
-                 void (*cb)( int sts, void *aux ), void *aux );
-
-/* config.c */
+void parse_generic_store( store_conf_t *store, conffile_t *cfg );
 
 #define N_DRIVERS 2
 extern driver_t *drivers[N_DRIVERS];
-
-extern channel_conf_t global_conf;
-extern channel_conf_t *channels;
-extern group_conf_t *groups;
-extern int UseFSync;
-
-int parse_bool( conffile_t *cfile );
-int parse_int( conffile_t *cfile );
-int parse_size( conffile_t *cfile );
-int getcline( conffile_t *cfile );
-int merge_ops( int cops, int ops[] );
-int load_config( const char *filename, int pseudo );
-void parse_generic_store( store_conf_t *store, conffile_t *cfg );
-
-/* drv_*.c */
 extern driver_t maildir_driver, imap_driver;
+
+#endif

+ 3 - 1
src/drv_imap.c

@@ -21,7 +21,9 @@
  * despite that library's more restrictive license.
  */
 
-#include "isync.h"
+#include "driver.h"
+
+#include "socket.h"
 
 #include <assert.h>
 #include <unistd.h>

+ 1 - 1
src/drv_maildir.c

@@ -21,7 +21,7 @@
  * despite that library's more restrictive license.
  */
 
-#include "isync.h"
+#include "driver.h"
 
 #include <assert.h>
 #include <limits.h>

+ 4 - 1
src/main.c

@@ -20,7 +20,7 @@
  * despite that library's more restrictive license.
  */
 
-#include "isync.h"
+#include "sync.h"
 
 #include <stdlib.h>
 #include <stddef.h>
@@ -31,6 +31,9 @@
 #include <time.h>
 #include <sys/wait.h>
 
+int DFlags;
+int UseFSync = 1;
+
 int Pid;		/* for maildir and imap */
 char Hostname[256];	/* for maildir */
 const char *Home;	/* for config */

+ 1 - 1
src/mdconvert.c

@@ -16,7 +16,7 @@
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <config.h>
+#include <autodefs.h>
 
 #include <stdio.h>
 #include <stdlib.h>

+ 7 - 11
src/socket.c

@@ -21,17 +21,7 @@
  * despite that library's more restrictive license.
  */
 
-/* This must come before isync.h to avoid our #define S messing up
- * blowfish.h on MacOS X. */
-#include <config.h>
-#ifdef HAVE_LIBSSL
-# include <openssl/ssl.h>
-# include <openssl/err.h>
-# include <openssl/hmac.h>
-# include <openssl/x509v3.h>
-#endif
-
-#include "isync.h"
+#include "socket.h"
 
 #include <assert.h>
 #include <unistd.h>
@@ -46,6 +36,12 @@
 #include <netinet/tcp.h>
 #include <arpa/inet.h>
 #include <netdb.h>
+#ifdef HAVE_LIBSSL
+# include <openssl/ssl.h>
+# include <openssl/err.h>
+# include <openssl/hmac.h>
+# include <openssl/x509v3.h>
+#endif
 
 enum {
 	SCK_CONNECTING,

+ 118 - 0
src/socket.h

@@ -0,0 +1,118 @@
+/*
+ * mbsync - mailbox synchronizer
+ * Copyright (C) 2000-2002 Michael R. Elkins <me@mutt.org>
+ * Copyright (C) 2002-2006,2010-2012 Oswald Buddenhagen <ossi@users.sf.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * As a special exception, mbsync may be linked with the OpenSSL library,
+ * despite that library's more restrictive license.
+ */
+
+#ifndef SOCKET_H
+#define SOCKET_H
+
+#include "common.h"
+
+typedef struct ssl_st SSL;
+typedef struct ssl_ctx_st SSL_CTX;
+
+typedef struct server_conf {
+	char *tunnel;
+	char *host;
+	int port;
+#ifdef HAVE_LIBSSL
+	char *cert_file;
+	char use_imaps;
+	char use_sslv2, use_sslv3, use_tlsv1, use_tlsv11, use_tlsv12;
+
+	/* these are actually variables and are leaked at the end */
+	char ssl_ctx_valid;
+	unsigned num_trusted;
+	SSL_CTX *SSLContext;
+#endif
+} server_conf_t;
+
+typedef struct buff_chunk {
+	struct buff_chunk *next;
+	char *data;
+	int len;
+	char buf[1];
+} buff_chunk_t;
+
+typedef struct {
+	/* connection */
+	int fd;
+	int state;
+	const server_conf_t *conf; /* needed during connect */
+#ifdef HAVE_IPV6
+	struct addrinfo *addrs, *curr_addr; /* needed during connect */
+#else
+	char **curr_addr; /* needed during connect */
+#endif
+	char *name;
+#ifdef HAVE_LIBSSL
+	SSL *ssl;
+	int force_trusted;
+#endif
+
+	void (*bad_callback)( void *aux ); /* async fail while sending or listening */
+	void (*read_callback)( void *aux ); /* data available for reading */
+	int (*write_callback)( void *aux ); /* all *queued* data was sent */
+	union {
+		void (*connect)( int ok, void *aux );
+		void (*starttls)( int ok, void *aux );
+	} callbacks;
+	void *callback_aux;
+
+	/* writing */
+	buff_chunk_t *write_buf, **write_buf_append; /* buffer head & tail */
+	int write_offset; /* offset into buffer head */
+
+	/* reading */
+	int offset; /* start of filled bytes in buffer */
+	int bytes; /* number of filled bytes in buffer */
+	int scanoff; /* offset to continue scanning for newline at, relative to 'offset' */
+	char buf[100000];
+} conn_t;
+
+/* call this before doing anything with the socket */
+static INLINE void socket_init( conn_t *conn,
+                                const server_conf_t *conf,
+                                void (*bad_callback)( void *aux ),
+                                void (*read_callback)( void *aux ),
+                                int (*write_callback)( void *aux ),
+                                void *aux )
+{
+	conn->conf = conf;
+	conn->bad_callback = bad_callback;
+	conn->read_callback = read_callback;
+	conn->write_callback = write_callback;
+	conn->callback_aux = aux;
+	conn->fd = -1;
+	conn->name = 0;
+	conn->write_buf_append = &conn->write_buf;
+}
+void socket_connect( conn_t *conn, void (*cb)( int ok, void *aux ) );
+void socket_start_tls(conn_t *conn, void (*cb)( int ok, void *aux ) );
+void socket_close( conn_t *sock );
+int socket_read( conn_t *sock, char *buf, int len ); /* never waits */
+char *socket_read_line( conn_t *sock ); /* don't free return value; never waits */
+typedef enum { KeepOwn = 0, GiveOwn } ownership_t;
+int socket_write( conn_t *sock, char *buf, int len, ownership_t takeOwn );
+
+void cram( const char *challenge, const char *user, const char *pass,
+           char **_final, int *_finallen );
+
+#endif

+ 5 - 1
src/sync.c

@@ -20,7 +20,7 @@
  * despite that library's more restrictive license.
  */
 
-#include "isync.h"
+#include "sync.h"
 
 #include <assert.h>
 #include <stdio.h>
@@ -39,6 +39,10 @@
 # define fdatasync fsync
 #endif
 
+channel_conf_t global_conf;
+channel_conf_t *channels;
+group_conf_t *groups;
+
 const char *str_ms[] = { "master", "slave" }, *str_hl[] = { "push", "pull" };
 
 void

+ 81 - 0
src/sync.h

@@ -0,0 +1,81 @@
+/*
+ * mbsync - mailbox synchronizer
+ * Copyright (C) 2000-2002 Michael R. Elkins <me@mutt.org>
+ * Copyright (C) 2002-2006,2010-2012 Oswald Buddenhagen <ossi@users.sf.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * As a special exception, mbsync may be linked with the OpenSSL library,
+ * despite that library's more restrictive license.
+ */
+
+#ifndef SYNC_H
+#define SYNC_H
+
+#include "driver.h"
+
+#define M 0 /* master */
+#define S 1 /* slave */
+
+#define OP_NEW             (1<<0)
+#define OP_RENEW           (1<<1)
+#define OP_DELETE          (1<<2)
+#define OP_FLAGS           (1<<3)
+#define  OP_MASK_TYPE      (OP_NEW|OP_RENEW|OP_DELETE|OP_FLAGS) /* asserted in the target ops */
+#define OP_EXPUNGE         (1<<4)
+#define OP_CREATE          (1<<5)
+#define XOP_PUSH           (1<<6)
+#define XOP_PULL           (1<<7)
+#define  XOP_MASK_DIR      (XOP_PUSH|XOP_PULL)
+#define XOP_HAVE_TYPE      (1<<8)
+#define XOP_HAVE_EXPUNGE   (1<<9)
+#define XOP_HAVE_CREATE    (1<<10)
+
+typedef struct channel_conf {
+	struct channel_conf *next;
+	const char *name;
+	store_conf_t *stores[2];
+	const char *boxes[2];
+	char *sync_state;
+	string_list_t *patterns;
+	int ops[2];
+	unsigned max_messages; /* for slave only */
+	signed char expire_unread;
+	char use_internal_date;
+} channel_conf_t;
+
+typedef struct group_conf {
+	struct group_conf *next;
+	const char *name;
+	string_list_t *channels;
+} group_conf_t;
+
+extern channel_conf_t global_conf;
+extern channel_conf_t *channels;
+extern group_conf_t *groups;
+
+extern const char *str_ms[2], *str_hl[2];
+
+#define SYNC_OK       0 /* assumed to be 0 */
+#define SYNC_FAIL     1
+#define SYNC_FAIL_ALL 2
+#define SYNC_BAD(ms)  (4<<(ms))
+#define SYNC_NOGOOD   16 /* internal */
+#define SYNC_CANCELED 32 /* internal */
+
+/* All passed pointers must stay alive until cb is called. */
+void sync_boxes( store_t *ctx[], const char *names[], channel_conf_t *chan,
+                 void (*cb)( int sts, void *aux ), void *aux );
+
+#endif

+ 1 - 13
src/util.c

@@ -20,7 +20,7 @@
  * despite that library's more restrictive license.
  */
 
-#include "isync.h"
+#include "common.h"
 
 #include <assert.h>
 #include <stdlib.h>
@@ -29,7 +29,6 @@
 #include <string.h>
 #include <pwd.h>
 
-int DFlags;
 static int need_nl;
 
 void
@@ -174,17 +173,6 @@ free_string_list( string_list_t *list )
 	}
 }
 
-void
-free_generic_messages( message_t *msgs )
-{
-	message_t *tmsg;
-
-	for (; msgs; msgs = tmsg) {
-		tmsg = msgs->next;
-		free( msgs );
-	}
-}
-
 #ifndef HAVE_VASPRINTF
 static int
 vasprintf( char **strp, const char *fmt, va_list ap )