3 * XML sitemap generator
5 * Copyright (c) 2010-2021 by the citadel.org team
7 * This program is open source software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License, version 3.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
17 #include "webserver.h"
21 * XML sitemap generator -- go through the message list for a BBS room
23 void sitemap_do_bbs(void) {
26 SharedMessageStatus Stat;
27 message_summary *Msg = NULL;
29 memset(&Stat, 0, sizeof Stat);
30 Stat.maxload = INT_MAX;
31 Stat.lowest_found = (-1);
32 Stat.highest_found = (-1);
33 num_msgs = load_msg_ptrs("MSGS ALL", NULL, NULL, &Stat, NULL, NULL, NULL, NULL, 0);
37 for (i = 0; i < num_msgs; i += 20) {
38 Msg = GetMessagePtrAt(i, WC->summ);
40 wc_printf("<url><loc>%s/readfwd", ChrPtr(site_prefix));
42 urlescputs(ChrPtr(WC->CurRoom.name));
43 wc_printf("?start_reading_at=%ld", Msg->msgnum);
44 wc_printf("</loc></url>\r\n");
51 * XML sitemap generator -- go through the message list for a wiki room
53 void sitemap_do_wiki(void) {
56 SharedMessageStatus Stat;
57 message_summary *Msg = NULL;
60 memset(&Stat, 0, sizeof Stat);
61 Stat.maxload = INT_MAX;
62 Stat.lowest_found = (-1);
63 Stat.highest_found = (-1);
64 num_msgs = load_msg_ptrs("MSGS ALL", NULL, NULL, &Stat, NULL, NULL, NULL, NULL, 0);
68 for (i = 0; i < num_msgs; ++i) {
69 Msg = GetMessagePtrAt(i, WC->summ);
72 serv_printf("MSG0 %ld|3", Msg->msgnum);
73 serv_getln(buf, sizeof buf);
75 while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
76 if ((!strncasecmp(buf, "exti=", 5))
77 && (!bmstrcasestr(buf, "_HISTORY_"))
79 wc_printf("<url><loc>%s/wiki", ChrPtr(site_prefix));
81 urlescputs(ChrPtr(WC->CurRoom.name));
82 wc_printf("?page=%s", &buf[5]);
83 wc_printf("</loc></url>\r\n");
91 struct sitemap_room_list {
92 struct sitemap_room_list *next;
99 * Load the room list for the sitemap
101 struct sitemap_room_list *sitemap_load_roomlist(void) {
103 char roomname_plain[SIZ];
104 struct sitemap_room_list *roomlist = NULL;
107 serv_getln(buf, sizeof buf);
109 while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
110 struct sitemap_room_list *ptr = malloc(sizeof(struct sitemap_room_list));
111 extract_token(roomname_plain, buf, 0, '|', sizeof roomname_plain);
112 ptr->roomname = NewStrBufPlain(roomname_plain, -1);
113 ptr->defview = extract_int(buf, 6);
114 ptr->next = roomlist;
121 extern void sitemap_do_blog(void);
124 * Entry point for RSS feed generator
127 struct sitemap_room_list *roomlist = NULL;
128 output_headers(0, 0, 0, 0, 1, 0);
129 hprintf("Content-type: text/xml\r\n");
130 hprintf("Server: %s / %s\r\n" "Connection: close\r\n", PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software)
134 wc_printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
135 wc_printf("<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\r\n");
137 roomlist = sitemap_load_roomlist();
139 while (roomlist != NULL) {
140 struct sitemap_room_list *ptr;
142 gotoroom(roomlist->roomname);
144 /* Output the messages in this room only if it's a room type we can make sense of */
145 switch (roomlist->defview) {
160 roomlist = roomlist->next;
161 FreeStrBuf(&ptr->roomname);
165 wc_printf("</urlset>\r\n");
170 void InitModule_SITEMAP(void) {
171 WebcitAddUrlHandler(HKEY("sitemap"), "", 0, sitemap, ANONYMOUS | COOKIEUNNEEDED);
172 WebcitAddUrlHandler(HKEY("sitemap.xml"), "", 0, sitemap, ANONYMOUS | COOKIEUNNEEDED);