static int do_synclogfile(const char *synclogfile) { strarray_t *folders = NULL; sync_log_reader_t *slr; int nskipped = 0; int i; int r; slr = sync_log_reader_create_with_filename(synclogfile); r = sync_log_reader_begin(slr); if (r) goto out; folders = read_sync_log_items(slr); sync_log_reader_end(slr); /* sort folders for locality of reference in file processing mode */ strarray_sort(folders, cmpstringp_raw); signals_poll(); /* have some due items in the queue, try to index them */ rx = search_begin_update(verbose); for (i = 0; i < folders->count; i++) { const char *mboxname = strarray_nth(folders, i); if (verbose > 1) syslog(LOG_INFO, "do_synclogfile: indexing %s", mboxname); r = index_one(mboxname, /*blocking*/1); if (r == IMAP_MAILBOX_NONEXISTENT) r = 0; if (r == IMAP_MAILBOX_LOCKED || r == IMAP_AGAIN) { nskipped++; if (nskipped > 10000) { syslog(LOG_ERR, "IOERROR: skipped too many times at %s", mboxname); break; } r = 0; /* try again at the end */ strarray_append(folders, mboxname); } if (r) { syslog(LOG_ERR, "IOERROR: failed to index %s: %s", mboxname, error_message(r)); break; } if (sleepmicroseconds) usleep(sleepmicroseconds); } search_end_update(rx); rx = NULL; out: strarray_free(folders); sync_log_reader_free(slr); return r; }
static void do_rolling(const char *channel) { strarray_t *folders = NULL; sync_log_reader_t *slr; int i; int r; slr = sync_log_reader_create_with_channel(channel); for (;;) { signals_poll(); if (shutdown_file(NULL, 0)) shut_down(EC_TEMPFAIL); r = sync_log_reader_begin(slr); if (r) { /* including IMAP_AGAIN */ usleep(100000); /* 1/10th second */ continue; } folders = read_sync_log_items(slr); if (folders->count) { /* have some due items in the queue, try to index them */ rx = search_begin_update(verbose); for (i = 0; i < folders->count; i++) { const char *mboxname = strarray_nth(folders, i); if (verbose > 1) syslog(LOG_INFO, "do_rolling: indexing %s", mboxname); r = index_one(mboxname, /*blocking*/0); if (r == IMAP_AGAIN || r == IMAP_MAILBOX_LOCKED) { /* XXX: alternative, just append to strarray_t *folders ... */ sync_log_channel(channel, "APPEND %s", mboxname); } if (sleepmicroseconds) usleep(sleepmicroseconds); } search_end_update(rx); rx = NULL; } strarray_free(folders); folders = NULL; } /* XXX - we don't really get here... */ strarray_free(folders); sync_log_reader_free(slr); }
static int do_sync_filename(const char *filename) { sync_log_reader_t *slr; int r; if ((filename == NULL) || !strcmp(filename, "-")) slr = sync_log_reader_create_with_fd(0); /* STDIN */ else slr = sync_log_reader_create_with_filename(filename); r = sync_log_reader_begin(slr); if (!r) r = do_sync(slr); sync_log_reader_end(slr); sync_log_reader_free(slr); return r; }
static int do_daemon_work(const char *channel, const char *sync_shutdown_file, unsigned long timeout, unsigned long min_delta, int *restartp) { int r = 0; time_t session_start; time_t single_start; int delta; struct stat sbuf; sync_log_reader_t *slr; *restartp = RESTART_NONE; slr = sync_log_reader_create_with_channel(channel); session_start = time(NULL); while (1) { single_start = time(NULL); signals_poll(); /* Check for shutdown file */ if (sync_shutdown_file && !stat(sync_shutdown_file, &sbuf)) { unlink(sync_shutdown_file); break; } /* See if its time to RESTART */ if ((timeout > 0) && ((single_start - session_start) > (time_t) timeout)) { *restartp = RESTART_NORMAL; break; } r = sync_log_reader_begin(slr); if (r) { /* including specifically r == IMAP_AGAIN */ if (min_delta > 0) { sleep(min_delta); } else { usleep(100000); /* 1/10th second */ } continue; } /* Process the work log */ if ((r=do_sync(slr))) { syslog(LOG_ERR, "Processing sync log file %s failed: %s", sync_log_reader_get_file_name(slr), error_message(r)); break; } r = sync_log_reader_end(slr); if (r) break; delta = time(NULL) - single_start; if (((unsigned) delta < min_delta) && ((min_delta-delta) > 0)) sleep(min_delta-delta); } sync_log_reader_free(slr); if (*restartp == RESTART_NORMAL) { r = do_restart(); if (r) { syslog(LOG_ERR, "sync_client RESTART failed: %s", error_message(r)); } else { syslog(LOG_INFO, "sync_client RESTART succeeded"); } r = 0; } return(r); }