diff --git a/Makefile.am b/Makefile.am index d9f498d..05a3df1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,8 @@ bin_PROGRAMS=isync isync_SOURCES=main.c imap.c sync.c maildir.c isync.h list.c cram.c config.c +isync_LDADD=@DEBUGOBJ@ +isync_DEPENDENCIES=@DEBUGOBJ@ +EXTRA_isync_SOURCES=debug.c man_MANS=isync.1 EXTRA_DIST=sample.isyncrc $(man_MANS) INCLUDES=$(RPM_OPT_FLAGS) diff --git a/TODO b/TODO index ee9afd2..6936f7b 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,5 @@ add support for syncing with other: and shared: via NAMESPACE -finish implementing --quiet - --fast downloads the last message again if no new messages have arrived isync gets confused when new mail is delivered while in the middle of an diff --git a/config.c b/config.c index b554e54..5edf20e 100644 --- a/config.c +++ b/config.c @@ -18,8 +18,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#define _GNU_SOURCE 1 - #include #include #include @@ -39,16 +37,14 @@ config_defaults (config_t * conf) memcpy (conf, &global, sizeof (config_t)); } -#ifndef HAVE_STRNDUP static char * -strndup (const char *s, size_t nchars) +my_strndup (const char *s, size_t nchars) { char *r = malloc (sizeof (char) * (nchars + 1)); strncpy (r, s, nchars); r[nchars] = 0; return r; } -#endif /* ! HAVE_STRNDUP */ char * expand_strdup (const char *s) @@ -73,7 +69,7 @@ expand_strdup (const char *s) p = strchr (s, '/'); if (p) { - user = strndup (s, (int)(p - s)); + user = my_strndup (s, (int)(p - s)); p++; } else @@ -324,3 +320,12 @@ find_box (const char *s) } return 0; } + +void +free_config (void) +{ + free (global.user); + free (global.maildir); + free (global.host); + free (global.pass); +} diff --git a/configure.in b/configure.in index cbbbe86..ec8d124 100644 --- a/configure.in +++ b/configure.in @@ -8,7 +8,13 @@ AC_ARG_WITH(ssl-dir, [ --with-ssl-dir=DIR location where openssl is insalled], else AC_MSG_ERROR(can't find OpenSSL in $withval) fi]) -AC_CHECK_FUNCS(getopt_long strndup) +AC_ARG_ENABLE(debug, [ --enable-debug enable memory debugging +code], + [AC_DEFINE(DEBUG), + DEBUGOBJ=debug.o], + [DEBUGOBJ='']) +AC_SUBST(DEBUGOBJ) +AC_CHECK_FUNCS(getopt_long) AC_CHECK_LIB(socket,socket) AC_CHECK_LIB(nsl,inet_ntoa) AC_CHECK_LIB(crypto,ERR_error_string) diff --git a/isync.h b/isync.h index de6c122..ccf385a 100644 --- a/isync.h +++ b/isync.h @@ -23,6 +23,7 @@ #if HAVE_LIBSSL #include #endif +#include "debug.h" typedef struct { @@ -173,6 +174,7 @@ int sync_mailbox (mailbox_t *, imap_t *, int, unsigned int, unsigned int); void load_config (const char *); char * expand_strdup (const char *s); config_t *find_box (const char *); +void free_config (void); void imap_close (imap_t *); int imap_copy_message (imap_t * imap, unsigned int uid, const char *mailbox); diff --git a/list.c b/list.c index b557b17..b32272a 100644 --- a/list.c +++ b/list.c @@ -153,7 +153,7 @@ free_list (list_t * list) { tmp = list; list = list->next; - if (is_list (list)) + if (is_list (tmp)) free_list (tmp->child); else if (is_atom (tmp)) free (tmp->val); diff --git a/main.c b/main.c index dc23b79..bf05853 100644 --- a/main.c +++ b/main.c @@ -334,5 +334,11 @@ cleanup: /* gracefully close connection to the IMAP server */ imap_close (imap); + free_config (); + +#if DEBUG + debug_cleanup (); +#endif + exit (0); }