4 * This is the "Art Vandelay" module. It is an importer/exporter.
16 #include <sys/types.h>
24 #include "sysdep_decls.h"
25 #include "citserver.h"
28 #include "dynloader.h"
36 char artv_tempfilename1[256];
37 char artv_tempfilename2[256];
38 FILE *artv_global_message_list;
40 void artv_export_users_backend(struct usersupp *usbuf, void *data) {
42 cprintf("%d\n", usbuf->version);
43 cprintf("%d\n", usbuf->uid);
44 cprintf("%s\n", usbuf->password);
45 cprintf("%u\n", usbuf->flags);
46 cprintf("%ld\n", usbuf->timescalled);
47 cprintf("%ld\n", usbuf->posted);
48 cprintf("%d\n", usbuf->axlevel);
49 cprintf("%ld\n", usbuf->usernum);
50 cprintf("%ld\n", usbuf->lastcall);
51 cprintf("%d\n", usbuf->USuserpurge);
52 cprintf("%s\n", usbuf->fullname);
53 cprintf("%d\n", usbuf->USscreenwidth);
54 cprintf("%d\n", usbuf->USscreenheight);
55 cprintf("%d\n", usbuf->moderation_filter);
59 void artv_export_users(void) {
60 ForEachUser(artv_export_users_backend, NULL);
64 void artv_export_room_msg(long msgnum) {
65 cprintf("%ld\n", msgnum);
66 fprintf(artv_global_message_list, "%ld\n", msgnum);
70 void artv_export_rooms_backend(struct quickroom *qrbuf, void *data) {
72 cprintf("%s\n", qrbuf->QRname);
73 cprintf("%s\n", qrbuf->QRpasswd);
74 cprintf("%ld\n", qrbuf->QRroomaide);
75 cprintf("%ld\n", qrbuf->QRhighest);
76 cprintf("%ld\n", qrbuf->QRgen);
77 cprintf("%u\n", qrbuf->QRflags);
78 cprintf("%s\n", qrbuf->QRdirname);
79 cprintf("%ld\n", qrbuf->QRinfo);
80 cprintf("%d\n", qrbuf->QRfloor);
81 cprintf("%ld\n", qrbuf->QRmtime);
82 cprintf("%d\n", qrbuf->QRep.expire_mode);
83 cprintf("%d\n", qrbuf->QRep.expire_value);
84 cprintf("%ld\n", qrbuf->QRnumber);
85 cprintf("%d\n", qrbuf->QRorder);
87 getroom(&CC->quickroom, qrbuf->QRname);
88 /* format of message list export is all message numbers output
89 * one per line terminated by a 0.
91 CtdlForEachMessage(MSGS_ALL, 0L, (-127), NULL, NULL,
92 artv_export_room_msg);
99 void artv_export_rooms(void) {
101 artv_global_message_list = fopen(artv_tempfilename1, "w");
102 ForEachRoom(artv_export_rooms_backend, NULL);
103 fclose(artv_global_message_list);
106 * Process the 'global' message list. (Sort it and remove dups.
107 * Dups are ok because a message may be in more than one room, but
108 * this will be handled by exporting the reference count, not by
109 * exporting the message multiple times.)
111 sprintf(cmd, "sort <%s >%s", artv_tempfilename1, artv_tempfilename2);
113 sprintf(cmd, "uniq <%s >%s", artv_tempfilename2, artv_tempfilename1);
118 void artv_export_floors(void) {
122 for (i=0; i < MAXFLOORS; ++i) {
126 cprintf("%u\n", flbuf.f_flags);
127 cprintf("%s\n", flbuf.f_name);
128 cprintf("%d\n", flbuf.f_ref_count);
129 cprintf("%d\n", flbuf.f_ep.expire_mode);
130 cprintf("%d\n", flbuf.f_ep.expire_value);
139 * Traverse the room file...
141 void artv_export_visits(void) {
143 struct cdbdata *cdbv;
145 cdb_rewind(CDB_VISIT);
147 while (cdbv = cdb_next_item(CDB_VISIT), cdbv != NULL) {
148 memset(&vbuf, 0, sizeof(struct visit));
149 memcpy(&vbuf, cdbv->ptr,
150 ((cdbv->len > sizeof(struct visit)) ?
151 sizeof(struct visit) : cdbv->len));
155 cprintf("%ld\n", vbuf.v_roomnum);
156 cprintf("%ld\n", vbuf.v_roomgen);
157 cprintf("%ld\n", vbuf.v_usernum);
158 cprintf("%ld\n", vbuf.v_lastseen);
159 cprintf("%u\n", vbuf.v_flags);
164 void artv_export_message(long msgnum) {
165 cprintf("message\n");
166 cprintf("%ld\n", msgnum);
167 /* FIXME do more here of course */
172 void artv_export_messages(void) {
177 artv_global_message_list = fopen(artv_tempfilename1, "r");
178 lprintf(7, "Opened %s\n", artv_tempfilename1);
179 while (fgets(buf, sizeof(buf), artv_global_message_list) != NULL) {
182 artv_export_message(msgnum);
186 fclose(artv_global_message_list);
187 lprintf(7, "Exported %ld messages.\n", count);
193 void artv_do_export(void) {
194 cprintf("%d Yikes.\n", LISTING_FOLLOWS);
196 /* export the config file */
198 cprintf("%s\n", config.c_nodename);
199 cprintf("%s\n", config.c_fqdn);
200 cprintf("%s\n", config.c_humannode);
201 cprintf("%s\n", config.c_phonenum);
202 cprintf("%d\n", config.c_bbsuid);
203 cprintf("%d\n", config.c_creataide);
204 cprintf("%d\n", config.c_sleeping);
205 cprintf("%d\n", config.c_initax);
206 cprintf("%d\n", config.c_regiscall);
207 cprintf("%d\n", config.c_twitdetect);
208 cprintf("%s\n", config.c_twitroom);
209 cprintf("%s\n", config.c_moreprompt);
210 cprintf("%d\n", config.c_restrict);
211 cprintf("%ld\n", config.c_msgbase);
212 cprintf("%s\n", config.c_bbs_city);
213 cprintf("%s\n", config.c_sysadm);
214 cprintf("%s\n", config.c_bucket_dir);
215 cprintf("%d\n", config.c_setup_level);
216 cprintf("%d\n", config.c_maxsessions);
217 cprintf("%s\n", config.c_net_password);
218 cprintf("%d\n", config.c_port_number);
219 cprintf("%d\n", config.c_ipgm_secret);
220 cprintf("%d\n", config.c_ep.expire_mode);
221 cprintf("%d\n", config.c_ep.expire_value);
222 cprintf("%d\n", config.c_userpurge);
223 cprintf("%d\n", config.c_roompurge);
224 cprintf("%s\n", config.c_logpages);
225 cprintf("%d\n", config.c_createax);
226 cprintf("%ld\n", config.c_maxmsglen);
227 cprintf("%d\n", config.c_min_workers);
228 cprintf("%d\n", config.c_max_workers);
229 cprintf("%d\n", config.c_pop3_port);
230 cprintf("%d\n", config.c_smtp_port);
231 cprintf("%d\n", config.c_default_filter);
233 /* Export the control file */
235 cprintf("control\n");
236 cprintf("%ld\n", CitControl.MMhighest);
237 cprintf("%u\n", CitControl.MMflags);
238 cprintf("%ld\n", CitControl.MMnextuser);
239 cprintf("%ld\n", CitControl.MMnextroom);
240 cprintf("%d\n", CitControl.version);
244 artv_export_floors();
245 artv_export_visits();
246 artv_export_messages();
254 void artv_do_import(void) {
255 cprintf("%d command not yet implemented\n", ERROR);
261 void cmd_artv(char *cmdbuf) {
263 static int is_running = 0;
265 if (CtdlAccessCheck(ac_aide)) return; /* FIXME should be intpgm */
267 cprintf("%d The importer/exporter is already running.\n",
273 strcpy(artv_tempfilename1, tmpnam(NULL));
274 strcpy(artv_tempfilename2, tmpnam(NULL));
276 extract(cmd, cmdbuf, 0);
277 if (!strcasecmp(cmd, "export")) artv_do_export();
278 else if (!strcasecmp(cmd, "import")) artv_do_import();
279 else cprintf("%d illegal command\n", ERROR);
281 unlink(artv_tempfilename1);
282 unlink(artv_tempfilename2);
290 char *Dynamic_Module_Init(void)
292 CtdlRegisterProtoHook(cmd_artv, "ARTV", "import/export data store");