- added a new function to the database interface, cdb_close_cursor(). always
[citadel.git] / citadel / serv_upgrade.c
1 /*
2  * $Id$
3  *
4  * Transparently handle the upgrading of server data formats.
5  *
6  */
7
8 #include "sysdep.h"
9 #include <stdlib.h>
10 #include <unistd.h>
11 #include <stdio.h>
12 #include <fcntl.h>
13 #include <signal.h>
14 #include <pwd.h>
15 #include <errno.h>
16 #include <sys/types.h>
17
18 #if TIME_WITH_SYS_TIME
19 # include <sys/time.h>
20 # include <time.h>
21 #else
22 # if HAVE_SYS_TIME_H
23 #  include <sys/time.h>
24 # else
25 #  include <time.h>
26 # endif
27 #endif
28
29 #include <sys/wait.h>
30 #include <string.h>
31 #include <limits.h>
32 #include "citadel.h"
33 #include "server.h"
34 #include "sysdep_decls.h"
35 #include "citserver.h"
36 #include "support.h"
37 #include "config.h"
38 #include "control.h"
39 #include "dynloader.h"
40 #include "database.h"
41 #include "user_ops.h"
42 #include "msgbase.h"
43 #include "serv_upgrade.h"
44
45 void do_pre555_usersupp_upgrade(void) {
46         struct pre555usersupp usbuf;
47         struct usersupp newus;
48         struct cdbdata *cdbus;
49         char tempfilename[PATH_MAX];
50         FILE *fp, *tp;
51         static char vcard[1024];
52
53         lprintf(5, "Upgrading user file\n");
54         fp = tmpfile();
55         if (fp == NULL) {
56                 lprintf(1, "%s\n", strerror(errno));
57                 exit(errno);
58         }
59         strcpy(tempfilename, tmpnam(NULL));
60
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) );
68                 cdb_free(cdbus);
69                 fwrite(&usbuf, sizeof(struct pre555usersupp), 1, fp);
70         }
71
72         /* ...and overwrite the records with new format records */
73         rewind(fp);
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));
78
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;
91
92                 putuser(&newus);
93
94                 /* write the vcard */
95                 sprintf(vcard,
96                         "Content-type: text/x-vcard\n\n"
97                         "begin:vcard\n"
98                         "n:%s\n"
99                         "tel;home:%s\n"
100                         "email;internet:%s\n"
101                         "adr:;;%s;%s;%s;%s;USA\n"
102                         "end:vcard\n",
103                         usbuf.USname,
104                         usbuf.USphone,
105                         usbuf.USemail,
106                         usbuf.USaddr,
107                         usbuf.UScity,
108                         usbuf.USstate,
109                         usbuf.USzip);
110
111                 tp = fopen(tempfilename, "w");
112                 fwrite(vcard, strlen(vcard)+1, 1, tp);
113                 fclose(tp);
114
115                 CtdlWriteObject(USERCONFIGROOM, "text/x-vcard",
116                         tempfilename, &newus, 0, 1, CM_SKIP_HOOKS);
117                 unlink(tempfilename);
118             }
119         }
120
121         fclose(fp);     /* this file deletes automatically */
122 }
123
124
125
126
127
128
129
130
131 void check_server_upgrades(void) {
132
133         get_control();
134         lprintf(5, "Server-hosted upgrade level is %d.%02d\n",
135                 (CitControl.version / 100),
136                 (CitControl.version % 100) );
137
138         if (CitControl.version < REV_LEVEL) {
139                 lprintf(5, "Server hosted updates need to be processed at "
140                                 "this time.  Please wait...\n");
141         }
142         else {
143                 return;
144         }
145
146         if (CitControl.version < 555) do_pre555_usersupp_upgrade();
147
148         CitControl.version = REV_LEVEL;
149         put_control();
150 }
151
152
153
154
155 char *Dynamic_Module_Init(void)
156 {
157         check_server_upgrades();
158         return "$Id$";
159 }