4 * Transparently handle the upgrading of server data formats.
16 #include <sys/types.h>
18 #if TIME_WITH_SYS_TIME
19 # include <sys/time.h>
23 # include <sys/time.h>
34 #include "sysdep_decls.h"
35 #include "citserver.h"
39 #include "dynloader.h"
43 #include "serv_upgrade.h"
45 void do_pre555_usersupp_upgrade(void) {
46 struct pre555usersupp usbuf;
47 struct usersupp newus;
48 struct cdbdata *cdbus;
49 char tempfilename[PATH_MAX];
51 static char vcard[1024];
53 lprintf(5, "Upgrading user file\n");
56 lprintf(1, "%s\n", strerror(errno));
59 strcpy(tempfilename, tmpnam(NULL));
61 /* First, back out all old version records to a flat file */
62 cdb_rewind(CDB_USERSUPP);
63 while(cdbus = cdb_next_item(CDB_USERSUPP), cdbus != NULL) {
64 memset(&usbuf, 0, sizeof(struct pre555usersupp));
65 memcpy(&usbuf, cdbus->ptr,
66 ( (cdbus->len > sizeof(struct pre555usersupp)) ?
67 sizeof(struct pre555usersupp) : cdbus->len) );
69 fwrite(&usbuf, sizeof(struct pre555usersupp), 1, fp);
72 /* ...and overwrite the records with new format records */
74 while (fread(&usbuf, sizeof(struct pre555usersupp), 1, fp) > 0) {
75 if (strlen(usbuf.fullname) > 0) {
76 lprintf(9, "Upgrading <%s>\n", usbuf.fullname);
77 memset(&newus, 0, sizeof(struct usersupp));
79 newus.uid = usbuf.USuid;
80 strcpy(newus.password, usbuf.password);
81 newus.flags = usbuf.flags;
82 newus.timescalled = (long) usbuf.timescalled;
83 newus.posted = (long) usbuf.posted;
84 newus.axlevel = (CIT_UBYTE) usbuf.axlevel;
85 newus.usernum = (long) usbuf.usernum;
86 newus.lastcall = (long) usbuf.lastcall;
87 newus.USuserpurge = (int) usbuf.USuserpurge;
88 strcpy(newus.fullname, usbuf.fullname);
89 newus.USscreenwidth = (CIT_UBYTE) usbuf.USscreenwidth;
90 newus.USscreenheight = (CIT_UBYTE) usbuf.USscreenheight;
96 "Content-type: text/x-vcard\n\n"
100 "email;internet:%s\n"
101 "adr:;;%s;%s;%s;%s;USA\n"
111 tp = fopen(tempfilename, "w");
112 fwrite(vcard, strlen(vcard)+1, 1, tp);
115 CtdlWriteObject(USERCONFIGROOM, "text/x-vcard",
116 tempfilename, &newus, 0, 1, CM_SKIP_HOOKS);
117 unlink(tempfilename);
121 fclose(fp); /* this file deletes automatically */
131 void check_server_upgrades(void) {
134 lprintf(5, "Server-hosted upgrade level is %d.%02d\n",
135 (CitControl.version / 100),
136 (CitControl.version % 100) );
138 if (CitControl.version < REV_LEVEL) {
139 lprintf(5, "Server hosted updates need to be processed at "
140 "this time. Please wait...\n");
146 if (CitControl.version < 555) do_pre555_usersupp_upgrade();
148 CitControl.version = REV_LEVEL;
155 char *Dynamic_Module_Init(void)
157 check_server_upgrades();