* Removed all of the thread cancellation cruft that is no longer necessary
[citadel.git] / citadel / serv_upgrade.c
1 /* $Id$ */
2 #include "sysdep.h"
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <stdio.h>
6 #include <fcntl.h>
7 #include <signal.h>
8 #include <pwd.h>
9 #include <errno.h>
10 #include <sys/types.h>
11 #include <sys/time.h>
12 #include <sys/wait.h>
13 #include <string.h>
14 #include <limits.h>
15 #include "citadel.h"
16 #include "server.h"
17 #include <time.h>
18 #include "sysdep_decls.h"
19 #include "citserver.h"
20 #include "support.h"
21 #include "config.h"
22 #include "control.h"
23 #include "dynloader.h"
24 #include "database.h"
25 #include "user_ops.h"
26 #include "msgbase.h"
27 #include "serv_upgrade.h"
28
29 void do_pre555_usersupp_upgrade(void) {
30         struct pre555usersupp usbuf;
31         struct usersupp newus;
32         struct cdbdata *cdbus;
33         char tempfilename[PATH_MAX];
34         FILE *fp, *tp;
35         static char vcard[1024];
36
37         lprintf(5, "Upgrading user file\n");
38         fp = tmpfile();
39         if (fp == NULL) {
40                 lprintf(1, "%s\n", strerror(errno));
41                 exit(errno);
42         }
43         strcpy(tempfilename, tmpnam(NULL));
44
45         /* First, back out all old version records to a flat file */
46         cdb_rewind(CDB_USERSUPP);
47         while(cdbus = cdb_next_item(CDB_USERSUPP), cdbus != NULL) {
48                 memset(&usbuf, 0, sizeof(struct pre555usersupp));
49                 memcpy(&usbuf, cdbus->ptr,
50                         ( (cdbus->len > sizeof(struct pre555usersupp)) ?
51                         sizeof(struct pre555usersupp) : cdbus->len) );
52                 cdb_free(cdbus);
53                 fwrite(&usbuf, sizeof(struct pre555usersupp), 1, fp);
54         }
55
56         /* ...and overwrite the records with new format records */
57         rewind(fp);
58         while (fread(&usbuf, sizeof(struct pre555usersupp), 1, fp) > 0) {
59             if (strlen(usbuf.fullname) > 0) {
60                 lprintf(9, "Upgrading <%s>\n", usbuf.fullname);
61                 memset(&newus, 0, sizeof(struct usersupp));
62
63                 newus.uid = usbuf.USuid;
64                 strcpy(newus.password, usbuf.password);
65                 newus.flags = usbuf.flags;
66                 newus.timescalled = (long) usbuf.timescalled;
67                 newus.posted = (long) usbuf.posted;
68                 newus.axlevel = (CIT_UBYTE) usbuf.axlevel;
69                 newus.usernum = (long) usbuf.usernum;
70                 newus.lastcall = (long) usbuf.lastcall;
71                 newus.USuserpurge = (int) usbuf.USuserpurge;
72                 strcpy(newus.fullname, usbuf.fullname);
73                 newus.USscreenwidth = (CIT_UBYTE) usbuf.USscreenwidth;
74                 newus.USscreenheight = (CIT_UBYTE) usbuf.USscreenheight;
75
76                 putuser(&newus);
77
78                 /* write the vcard */
79                 sprintf(vcard,
80                         "Content-type: text/x-vcard\n\n"
81                         "begin:vcard\n"
82                         "n:%s\n"
83                         "tel;home:%s\n"
84                         "email;internet:%s\n"
85                         "adr:;;%s;%s;%s;%s;USA\n"
86                         "end:vcard\n",
87                         usbuf.USname,
88                         usbuf.USphone,
89                         usbuf.USemail,
90                         usbuf.USaddr,
91                         usbuf.UScity,
92                         usbuf.USstate,
93                         usbuf.USzip);
94
95                 tp = fopen(tempfilename, "w");
96                 fwrite(vcard, strlen(vcard)+1, 1, tp);
97                 fclose(tp);
98
99                 CtdlWriteObject(CONFIGROOM, "text/x-vcard",
100                         tempfilename, &newus, 0, 1, CM_SKIP_HOOKS);
101                 unlink(tempfilename);
102             }
103         }
104
105         fclose(fp);     /* this file deletes automatically */
106 }
107
108
109
110
111
112
113
114
115 void check_server_upgrades(void) {
116
117         get_control();
118         lprintf(5, "Server-hosted upgrade level is %d.%02d\n",
119                 (CitControl.version / 100),
120                 (CitControl.version % 100) );
121
122         if (CitControl.version < config.c_setup_level) {
123                 lprintf(5, "Server hosted updates need to be processed at "
124                                 "this time.  Please wait...\n");
125         }
126         else {
127                 return;
128         }
129
130
131         if (CitControl.version < 555) do_pre555_usersupp_upgrade();
132
133
134         CitControl.version = config.c_setup_level;
135         put_control();
136 }
137
138
139
140
141 char *Dynamic_Module_Init(void)
142 {
143         check_server_upgrades();
144         return "$Id$";
145 }