X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fmigrate%2Fserv_migrate.c;h=d1d6d04b95795d4adfc2bf51a6ebdb55104e3df5;hb=e26a8dee20d1726b4995821f717f867f50fc5659;hp=d1b6cfca05a94337ffdcea99ecb7a5e5a9543c7e;hpb=6106c1da54f0923550c7bdceb45246fb88e9ea19;p=citadel.git diff --git a/citadel/modules/migrate/serv_migrate.c b/citadel/modules/migrate/serv_migrate.c index d1b6cfca0..d1d6d04b9 100644 --- a/citadel/modules/migrate/serv_migrate.c +++ b/citadel/modules/migrate/serv_migrate.c @@ -84,8 +84,11 @@ void xml_strout(char *str) { char *c = str; while (*c != 0) { - if (*c == '&') { - client_write("&", 5); + if (*c == '\"') { + client_write(""", 6); + } + else if (*c == '\'') { + client_write("'", 6); } else if (*c == '<') { client_write("<", 4); @@ -93,6 +96,9 @@ void xml_strout(char *str) { else if (*c == '>') { client_write(">", 4); } + else if (*c == '&') { + client_write("&", 5); + } else { client_write(c, 1); } @@ -140,7 +146,11 @@ void migr_export_rooms_backend(struct ctdlroom *buf, void *data) { cprintf("%ld\n", buf->QRhighest); cprintf("%ld\n", (long)buf->QRgen); cprintf("%u\n", buf->QRflags); - client_write("", 11); xml_strout(buf->QRdirname); client_write("\n", 13); + if (buf->QRflags & QR_DIRECTORY) { + client_write("", 11); + xml_strout(buf->QRdirname); + client_write("\n", 13); + } cprintf("%ld\n", buf->QRinfo); cprintf("%d\n", buf->QRfloor); cprintf("%ld\n", (long)buf->QRmtime); @@ -180,10 +190,10 @@ void migr_export_rooms(void) { * this will be handled by exporting the reference count, not by * exporting the message multiple times.) */ - snprintf(cmd, sizeof cmd, "sort <%s >%s", migr_tempfilename1, migr_tempfilename2); - if (system(cmd) != 0) CtdlLogPrintf(CTDL_ALERT, "Error %d\n", errno); + snprintf(cmd, sizeof cmd, "sort -n <%s >%s", migr_tempfilename1, migr_tempfilename2); + if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d\n", errno); snprintf(cmd, sizeof cmd, "uniq <%s >%s", migr_tempfilename2, migr_tempfilename1); - if (system(cmd) != 0) CtdlLogPrintf(CTDL_ALERT, "Error %d\n", errno); + if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d\n", errno); } @@ -206,6 +216,23 @@ void migr_export_floors(void) { } +/* + * Return nonzero if the supplied string contains only characters which are valid in a sequence set. + */ +int is_sequence_set(char *s) { + if (!s) return(0); + + char *c = s; + char ch; + while (ch = *c++, ch) { + if (!strchr("0123456789*,:", ch)) { + return(0); + } + } + return(1); +} + + /* * Traverse the visits file... @@ -229,7 +256,7 @@ void migr_export_visits(void) { cprintf("%ld\n", vbuf.v_usernum); client_write("", 8); - if (!IsEmptyStr(vbuf.v_seen)) { + if ( (!IsEmptyStr(vbuf.v_seen)) && (is_sequence_set(vbuf.v_seen)) ) { xml_strout(vbuf.v_seen); } else { @@ -237,7 +264,12 @@ void migr_export_visits(void) { } client_write("", 9); - client_write("", 12); xml_strout(vbuf.v_answered); client_write("\n", 14); + if ( (!IsEmptyStr(vbuf.v_answered)) && (is_sequence_set(vbuf.v_answered)) ) { + client_write("", 12); + xml_strout(vbuf.v_answered); + client_write("\n", 14); + } + cprintf("%u\n", vbuf.v_flags); cprintf("%d\n", vbuf.v_view); client_write("\n", 9); @@ -340,8 +372,8 @@ void migr_export_messages(void) { Ctx = CC; migr_global_message_list = fopen(migr_tempfilename1, "r"); if (migr_global_message_list != NULL) { - CtdlLogPrintf(CTDL_INFO, "Opened %s\n", migr_tempfilename1); - while ((Ctx->kill_me != 1) && + syslog(LOG_INFO, "Opened %s\n", migr_tempfilename1); + while ((Ctx->kill_me == 0) && (fgets(buf, sizeof(buf), migr_global_message_list) != NULL)) { msgnum = atol(buf); if (msgnum > 0L) { @@ -351,10 +383,10 @@ void migr_export_messages(void) { } fclose(migr_global_message_list); } - if (Ctx->kill_me != 1) - CtdlLogPrintf(CTDL_INFO, "Exported %d messages.\n", count); + if (Ctx->kill_me == 0) + syslog(LOG_INFO, "Exported %d messages.\n", count); else - CtdlLogPrintf(CTDL_ERR, "Export aborted due to client disconnect! \n"); + syslog(LOG_ERR, "Export aborted due to client disconnect! \n"); migr_export_message(-1L); /* This frees the encoding buffer */ } @@ -362,8 +394,6 @@ void migr_export_messages(void) { void migr_do_export(void) { - struct config *buf; - buf = &config; CitContext *Ctx; Ctx = CC; @@ -462,12 +492,12 @@ void migr_do_export(void) { cprintf("%d\n", CitControl.version); client_write("\n", 11); - if (Ctx->kill_me != 1) migr_export_users(); - if (Ctx->kill_me != 1) migr_export_openids(); - if (Ctx->kill_me != 1) migr_export_rooms(); - if (Ctx->kill_me != 1) migr_export_floors(); - if (Ctx->kill_me != 1) migr_export_visits(); - if (Ctx->kill_me != 1) migr_export_messages(); + if (Ctx->kill_me == 0) migr_export_users(); + if (Ctx->kill_me == 0) migr_export_openids(); + if (Ctx->kill_me == 0) migr_export_rooms(); + if (Ctx->kill_me == 0) migr_export_floors(); + if (Ctx->kill_me == 0) migr_export_visits(); + if (Ctx->kill_me == 0) migr_export_messages(); client_write("\n", 24); client_write("000\n", 4); Ctx->dont_term = 0; @@ -547,7 +577,7 @@ void migr_xml_start(void *data, const char *el, const char **attr) { } if (citadel_migrate_data != 1) { - CtdlLogPrintf(CTDL_ALERT, "Out-of-sequence tag <%s> detected. Warning: ODD-DATA!\n"); + syslog(LOG_ALERT, "Out-of-sequence tag <%s> detected. Warning: ODD-DATA!\n", el); return; } @@ -592,7 +622,7 @@ void migr_xml_end(void *data, const char *el) { } if (citadel_migrate_data != 1) { - CtdlLogPrintf(CTDL_ALERT, "Out-of-sequence tag <%s> detected. Warning: ODD-DATA!\n"); + syslog(LOG_ALERT, "Out-of-sequence tag <%s> detected. Warning: ODD-DATA!\n", el); return; } @@ -601,14 +631,14 @@ void migr_xml_end(void *data, const char *el) { migr_chardata_len = 0; } - // CtdlLogPrintf(CTDL_DEBUG, "END TAG: <%s> DATA: <%s>\n", el, (migr_chardata_len ? migr_chardata : "")); + // syslog(LOG_DEBUG, "END TAG: <%s> DATA: <%s>\n", el, (migr_chardata_len ? migr_chardata : "")); /*** CONFIG ***/ if (!strcasecmp(el, "config")) { config.c_enable_fulltext = 0; /* always disable */ put_config(); - CtdlLogPrintf(CTDL_INFO, "Completed import of server configuration\n"); + syslog(LOG_INFO, "Completed import of server configuration\n"); } else if (!strcasecmp(el, "c_nodename")) safestrncpy(config.c_nodename, migr_chardata, sizeof config.c_nodename); @@ -697,7 +727,7 @@ void migr_xml_end(void *data, const char *el) { else if (!strcasecmp(el, "control")) { CitControl.MMfulltext = (-1L); /* always flush */ put_control(); - CtdlLogPrintf(CTDL_INFO, "Completed import of control record\n"); + syslog(LOG_INFO, "Completed import of control record\n"); } /*** USER ***/ @@ -716,7 +746,7 @@ void migr_xml_end(void *data, const char *el) { else if (!strcasecmp(el, "user")) { CtdlPutUser(&usbuf); - CtdlLogPrintf(CTDL_INFO, "Imported user: %s\n", usbuf.fullname); + syslog(LOG_INFO, "Imported user: %s\n", usbuf.fullname); } /*** OPENID ***/ @@ -733,7 +763,7 @@ void migr_xml_end(void *data, const char *el) { memcpy(&oid_data[sizeof(long)], openid_url, strlen(openid_url) + 1); cdb_store(CDB_OPENID, openid_url, strlen(openid_url), oid_data, oid_data_len); free(oid_data); - CtdlLogPrintf(CTDL_INFO, "Imported OpenID: %s (%ld)\n", openid_url, openid_usernum); + syslog(LOG_INFO, "Imported OpenID: %s (%ld)\n", openid_url, openid_usernum); } /*** ROOM ***/ @@ -757,7 +787,7 @@ void migr_xml_end(void *data, const char *el) { else if (!strcasecmp(el, "room")) { CtdlPutRoom(&qrbuf); - CtdlLogPrintf(CTDL_INFO, "Imported room: %s\n", qrbuf.QRname); + syslog(LOG_INFO, "Imported room: %s\n", qrbuf.QRname); } /*** ROOM MESSAGE POINTERS ***/ @@ -770,7 +800,7 @@ void migr_xml_end(void *data, const char *el) { msglist_alloc = 1000; msglist = malloc(sizeof(long) * msglist_alloc); - CtdlLogPrintf(CTDL_DEBUG, "Message list for: %s\n", FRname); + syslog(LOG_DEBUG, "Message list for: %s\n", FRname); ptr = migr_chardata; while (*ptr != 0) { @@ -798,8 +828,8 @@ void migr_xml_end(void *data, const char *el) { free(msglist); msglist = NULL; msglist_alloc = 0; - CtdlLogPrintf(CTDL_DEBUG, "Imported %d messages.\n", msgcount); - if (CtdlThreadCheckStop()) { + syslog(LOG_DEBUG, "Imported %d messages.\n", msgcount); + if (server_shutting_down) { return; } } @@ -815,7 +845,7 @@ void migr_xml_end(void *data, const char *el) { else if (!strcasecmp(el, "floor")) { CtdlPutFloor(&flbuf, floornum); - CtdlLogPrintf(CTDL_INFO, "Imported floor #%d (%s)\n", floornum, flbuf.f_name); + syslog(LOG_INFO, "Imported floor #%d (%s)\n", floornum, flbuf.f_name); } /*** VISITS ***/ @@ -837,7 +867,7 @@ void migr_xml_end(void *data, const char *el) { else if (!strcasecmp(el, "visit")) { put_visit(&vbuf); - CtdlLogPrintf(CTDL_INFO, "Imported visit: %ld/%ld/%ld\n", vbuf.v_roomnum, vbuf.v_roomgen, vbuf.v_usernum); + syslog(LOG_INFO, "Imported visit: %ld/%ld/%ld\n", vbuf.v_roomnum, vbuf.v_roomgen, vbuf.v_usernum); } /*** MESSAGES ***/ @@ -857,7 +887,7 @@ void migr_xml_end(void *data, const char *el) { free(decoded_msg); decoded_msg = NULL; PutMetaData(&smi); - CtdlLogPrintf(CTDL_INFO, "Imported message #%ld, size=%ld, refcount=%d, content-type: %s\n", + syslog(LOG_INFO, "Imported message #%ld, size=%ld, refcount=%d, content-type: %s\n", import_msgnum, msglen, smi.meta_refcount, smi.meta_content_type); } @@ -900,7 +930,7 @@ void migr_do_import(void) { linelen = strlen(buf); strcpy(&buf[linelen++], "\n"); - if (CtdlThreadCheckStop()) + if (server_shutting_down) break; // Should we break or return? if (buf[0] == '\0') @@ -985,6 +1015,6 @@ CTDL_MODULE_INIT(migrate) CtdlRegisterProtoHook(cmd_migr, "ARTV", "Across-the-wire migration (legacy syntax)"); } - /* return our Subversion id for the Log */ + /* return our module name for the log */ return "migrate"; }