ソースを参照

reshuffle sources a bit

split header and move some code to more logical places.
Oswald Buddenhagen 11 年 前
コミット
03b3b566f1
18 ファイル変更480 行追加345 行削除
  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 )