+
+/*
+ * Handle redirects to legacy web servers
+ */
+void handle_redir(void) {
+ if (num_redir > 0) {
+ int i;
+ const char *req = ChrPtr(WC->Hdr->this_page);
+ if (!req) {
+ do_404();
+ return;
+ }
+ if (req[0] == '/') ++req;
+ syslog(9, "handle_redir() called; redirect this: %s", req);
+ for (i=0; i<num_redir; ++i) {
+ if (!strncmp(redir[i].urlpart, req, strlen(redir[i].urlpart))) {
+ char go_here[1024];
+ snprintf(go_here, sizeof go_here, redir[i].redirect_to, req);
+ syslog(9, "redirecting to: %s", go_here);
+ http_redirect(go_here);
+ return;
+ }
+ }
+ }
+ do_404();
+}
+
+
+
+/*
+ * load redirect strings (for supporting transition of legacy web servers to citadel on the same host)
+ */
+void load_redirs(char *filename) {
+ char buf[1024];
+ int num_redir_alloc = num_redir;
+ FILE *fp = fopen(filename, "r");
+ if (!fp) {
+ syslog(1, "Cannot open %s: %s", filename, strerror(errno));
+ return;
+ }
+
+ while (fgets(buf, sizeof buf, fp) != NULL) {
+ buf[strlen(buf)-1] = 0;
+
+ char *ch = strchr(buf, '#');
+ if (ch) strcpy(ch, "");
+ striplt(buf);
+ if (!IsEmptyStr(buf)) {
+
+ if (num_redir >= num_redir_alloc) {
+ if (num_redir_alloc == 0) {
+ num_redir_alloc = 10;
+ }
+ else {
+ num_redir_alloc = num_redir_alloc * 2;
+ }
+ redir = realloc(redir, sizeof(struct redirector) * num_redir_alloc );
+ }
+
+ extract_token(redir[num_redir].urlpart, buf, 0, '|', sizeof(redir[num_redir].urlpart));
+ extract_token(redir[num_redir].redirect_to, buf, 1, '|', sizeof(redir[num_redir].redirect_to));
+ WebcitAddUrlHandler(redir[num_redir].urlpart, strlen(redir[num_redir].urlpart), "", 0, handle_redir, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC);
+ ++num_redir;
+ }
+
+ }
+ fclose(fp);
+}
+
+
+