int seen_write(struct seen *seendb, const char *uniqueid, struct seendata *sd) { int sz = strlen(sd->seenuids) + 50; char *data = xmalloc(sz); int datalen; int r; assert(seendb && uniqueid); if (SEEN_DEBUG) { syslog(LOG_DEBUG, "seen_db: seen_write %s (%s)", seendb->user, uniqueid); } snprintf(data, sz, "%d %lu %u %lu %s", SEEN_VERSION, sd->lastread, sd->lastuid, sd->lastchange, sd->seenuids); datalen = strlen(data); r = cyrusdb_store(seendb->db, uniqueid, strlen(uniqueid), data, datalen, &seendb->tid); switch (r) { case CYRUSDB_OK: break; case CYRUSDB_IOERROR: r = IMAP_AGAIN; break; default: syslog(LOG_ERR, "DBERROR: error updating database: %s", cyrusdb_strerror(r)); r = IMAP_IOERROR; break; } free(data); sync_log_seen(seendb->user, uniqueid); return r; }
int main(int argc, char *argv[]) { char *alt_config = NULL; char cmd = '\0'; int opt; if ((geteuid()) == 0 && (become_cyrus(/*is_master*/0) != 0)) { fatal("must run as the Cyrus user", EC_USAGE); } while ((opt = getopt(argc, argv, "C:uUvmMacqnsb")) != EOF) { switch (opt) { case 'C': /* alt config file */ alt_config = optarg; break; case 'u': /* User */ cmd = 'u'; break; case 'U': /* UnUser */ cmd = 'U'; break; case 'v': /* sieVe */ cmd = 'v'; break; case 'm': /* Mailbox */ cmd = 'm'; break; case 'M': /* UnMailbox */ cmd = 'M'; break; case 'a': /* Append */ cmd = 'a'; break; case 'c': /* aCl */ cmd = 'c'; break; case 'q': /* Quota */ cmd = 'q'; break; case 'n': /* aNnotation */ cmd = 'n'; break; case 's': /* Seen */ cmd = 's'; break; case 'b': /* suBscription */ cmd = 'b'; break; } } /* need at least one value */ if ((argc - optind) < 1) usage(argv[0]); /* and not an empty string */ if (!argv[optind][0]) usage(argv[0]); if (cmd == 's' || cmd == 'b') { /* need a second value */ if ((argc - optind) < 2) usage(argv[0]); /* and not an empty string */ if (!argv[optind+1][0]) usage(argv[0]); } cyrus_init(alt_config, "cyr_synclog", 0, 0); sync_log_init(); switch(cmd) { case 'u': /* User */ sync_log_user(argv[optind]); break; case 'U': /* UnUser */ sync_log_unuser(argv[optind]); break; case 'v': /* sieVe */ sync_log_sieve(argv[optind]); break; case 'm': /* Mailbox */ sync_log_mailbox(argv[optind]); break; case 'M': /* UnMailbox */ sync_log_unmailbox(argv[optind]); break; case 'q': /* Quota */ sync_log_quota(argv[optind]); break; case 'n': /* aNnotation */ sync_log_annotation(argv[optind]); break; case 's': /* Seen */ sync_log_seen(argv[optind], argv[optind+1]); break; case 'b': /* suBscription */ sync_log_subscribe(argv[optind], argv[optind+1]); break; default: /* just as is! */ sync_log(argv[optind]); break; } sync_log_done(); cyrus_done(); return 0; }