+void iorarf_oneroom(char *roomname, char *infofile, char *picfile)
+{
+ FILE *fp;
+ long data_length;
+ char *unencoded_data;
+ char *encoded_data;
+ long info_msgnum = 0;
+ long pic_msgnum = 0;
+ char subject[SIZ];
+
+ // Test for the presence of a legacy "room info file"
+ if (!IsEmptyStr(infofile)) {
+ fp = fopen(infofile, "r");
+ }
+ else {
+ fp = NULL;
+ }
+ if (fp) {
+ fseek(fp, 0, SEEK_END);
+ data_length = ftell(fp);
+
+ if (data_length >= 1) {
+ rewind(fp);
+ unencoded_data = malloc(data_length);
+ if (unencoded_data) {
+ fread(unencoded_data, data_length, 1, fp);
+ encoded_data = malloc((data_length * 2) + 100);
+ if (encoded_data) {
+ sprintf(encoded_data, "Content-type: text/plain\nContent-transfer-encoding: base64\n\n");
+ CtdlEncodeBase64(&encoded_data[strlen(encoded_data)], unencoded_data, data_length, 1);
+ snprintf(subject, sizeof subject, "Imported room banner for %s", roomname);
+ info_msgnum = quickie_message("Citadel", NULL, NULL, SYSCONFIGROOM, encoded_data, FMT_RFC822, subject);
+ free(encoded_data);
+ }
+ free(unencoded_data);
+ }
+ }
+ fclose(fp);
+ if (info_msgnum > 0) unlink(infofile);
+ }
+
+ // Test for the presence of a legacy "room picture file" and import it.
+ if (!IsEmptyStr(picfile)) {
+ fp = fopen(picfile, "r");
+ }
+ else {
+ fp = NULL;
+ }
+ if (fp) {
+ fseek(fp, 0, SEEK_END);
+ data_length = ftell(fp);
+
+ if (data_length >= 1) {
+ rewind(fp);
+ unencoded_data = malloc(data_length);
+ if (unencoded_data) {
+ fread(unencoded_data, data_length, 1, fp);
+ encoded_data = malloc((data_length * 2) + 100);
+ if (encoded_data) {
+ sprintf(encoded_data, "Content-type: image/gif\nContent-transfer-encoding: base64\n\n");
+ CtdlEncodeBase64(&encoded_data[strlen(encoded_data)], unencoded_data, data_length, 1);
+ snprintf(subject, sizeof subject, "Imported room icon for %s", roomname);
+ pic_msgnum = quickie_message("Citadel", NULL, NULL, SYSCONFIGROOM, encoded_data, FMT_RFC822, subject);
+ free(encoded_data);
+ }
+ free(unencoded_data);
+ }
+ }
+ fclose(fp);
+ if (pic_msgnum > 0) unlink(picfile);
+ }
+
+ // Now we have the message numbers of our new banner and icon. Record them in the room record.
+ // NOTE: we are not deleting the old msgnum_info because that position in the record was previously
+ // a pointer to the highest message number which existed in the room when the info file was saved,
+ // and we don't want to delete messages that are not *actually* old banners.
+ struct ctdlroom qrbuf;
+ if (CtdlGetRoomLock(&qrbuf, roomname) == 0) {
+ qrbuf.msgnum_info = info_msgnum;
+ qrbuf.msgnum_pic = pic_msgnum;
+ CtdlPutRoomLock(&qrbuf);
+ }
+
+}
+
+
+struct iorarf_list {
+ struct iorarf_list *next;
+ char name[ROOMNAMELEN];
+ char info[PATH_MAX];
+ char pic[PATH_MAX];
+};
+
+
+/*
+ * Per-room callback function for ingest_old_roominfo_and_roompic_files()
+ *
+ * This is the first pass, where the list of qualifying rooms is gathered.
+ */
+void iorarf_backend(struct ctdlroom *qrbuf, void *data)
+{
+ FILE *fp;
+ struct iorarf_list **iorarf_list = (struct iorarf_list **)data;
+
+ struct iorarf_list *i = malloc(sizeof(struct iorarf_list));
+ i->next = *iorarf_list;
+ strcpy(i->name, qrbuf->QRname);
+ strcpy(i->info, "");
+ strcpy(i->pic, "");