1 /* umapisdm.c - *.MSG messagebase */
2 
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <time.h>
7 #include <ctype.h>
8 #include "typesize.h"
9 #include "umapi.h"
10 #include "umapisdm.h"
11 #include "umdate.h"
12 
sdmIntReadMsgHdr(FILE * f)13 tSdmMsgHdr *sdmIntReadMsgHdr(FILE *f)
14 {
15   tSdmMsgHdr *hdr;
16   UCHAR b1, b2;
17 
18   hdr = malloc(sizeof(tSdmMsgHdr));
19 
20   rewind(f);
21   fread(hdr->fromUserName, 36, 1, f);
22   hdr->fromUserName[36] = 0;
23   fread(hdr->toUserName, 36, 1, f);
24   hdr->toUserName[36] = 0;
25   fread(hdr->subject, 72, 1, f);
26   hdr->subject[72] = 0;
27   fread(hdr->dateTime, 20, 1, f);
28   hdr->dateTime[20] = 0;
29 
30   fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
31   hdr->timesRead = (b2 * 256) + b1;
32   fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
33   hdr->destNode = (b2 * 256) + b1;
34   fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
35   hdr->origNode = (b2 * 256) + b1;
36   fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
37   hdr->cost = (b2 * 256) + b1;
38   fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
39   hdr->origNet = (b2 * 256) + b1;
40   fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
41   hdr->destNet = (b2 * 256) + b1;
42   fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
43   hdr->destZone = (b2 * 256) + b1;
44   fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
45   hdr->origZone = (b2 * 256) + b1;
46   fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
47   hdr->destPoint = (b2 * 256) + b1;
48   fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
49   hdr->origPoint = (b2 * 256) + b1;
50   fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
51   hdr->replyTo = (b2 * 256) + b1;
52   fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
53   hdr->attrib = (b2 * 256) + b1;
54   fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
55   hdr->nextReply = (b2 * 256) + b1;
56 
57   return hdr;
58 }
59 
sdmIntConvHdr(tSdmMsgHdr * sdmHdr,tUmMsgNr msgNr)60 tUmMsgHdr *sdmIntConvHdr(tSdmMsgHdr *sdmHdr, tUmMsgNr msgNr)
61 {
62   tUmMsgHdr *msgHdr;
63 
64   msgHdr = malloc(sizeof(tUmMsgHdr));
65   msgHdr->areaType = cUmAreaTypeSdm;
66   msgHdr->msgNr = msgNr;
67   msgHdr->flags = 0;
68   if (sdmHdr->attrib & cSdmMsgFlagPriv) msgHdr->flags |= cUmMsgFlagPriv;
69   if (sdmHdr->attrib & cSdmMsgFlagCrash) msgHdr->flags |= cUmMsgFlagCrash;
70   if (sdmHdr->attrib & cSdmMsgFlagRcvd) msgHdr->flags |= cUmMsgFlagRead;
71   if (sdmHdr->attrib & cSdmMsgFlagSent) msgHdr->flags |= cUmMsgFlagSent;
72   if (sdmHdr->attrib & cSdmMsgFlagAttach) msgHdr->flags |= cUmMsgFlagAttach;
73   if (sdmHdr->attrib & cSdmMsgFlagIntrans) msgHdr->flags |= cUmMsgFlagIntrans;
74   if (sdmHdr->attrib & cSdmMsgFlagOrphan) msgHdr->flags |= cUmMsgFlagOrphan;
75   if (sdmHdr->attrib & cSdmMsgFlagKillSent) msgHdr->flags |= cUmMsgFlagKillSent;
76   if (sdmHdr->attrib & cSdmMsgFlagLocal) msgHdr->flags |= cUmMsgFlagLocal;
77   if (sdmHdr->attrib & cSdmMsgFlagHold) msgHdr->flags |= cUmMsgFlagHold;
78   if (sdmHdr->attrib & cSdmMsgFlagFReq) msgHdr->flags |= cUmMsgFlagFReq;
79   if (sdmHdr->attrib & cSdmMsgFlagRcptReq) msgHdr->flags |= cUmMsgFlagRcptReq;
80   if (sdmHdr->attrib & cSdmMsgFlagRcpt) msgHdr->flags |= cUmMsgFlagRcpt;
81   if (sdmHdr->attrib & cSdmMsgFlagAuditReq) msgHdr->flags |= cUmMsgFlagAuditReq;
82   if (sdmHdr->attrib & cSdmMsgFlagUpdReq) msgHdr->flags |= cUmMsgFlagUpdReq;
83 
84   msgHdr->fromAddr.zone = sdmHdr->origZone;
85   msgHdr->fromAddr.net = sdmHdr->origNet;
86   msgHdr->fromAddr.node = sdmHdr->origNode;
87   msgHdr->fromAddr.point = sdmHdr->origPoint;
88   msgHdr->fromAddr.domain = NULL;
89   msgHdr->toAddr.zone = sdmHdr->destZone;
90   msgHdr->toAddr.net = sdmHdr->destNet;
91   msgHdr->toAddr.node = sdmHdr->destNode;
92   msgHdr->toAddr.point = sdmHdr->destPoint;
93   msgHdr->toAddr.domain = NULL;
94   msgHdr->fromName = strdup(sdmHdr->fromUserName);
95   msgHdr->toName = strdup(sdmHdr->toUserName);
96   msgHdr->subject = strdup(sdmHdr->subject);
97 
98   msgHdr->dateWritten = ftscDate2UnixDate(sdmHdr->dateTime);
99 
100   msgHdr->dateArrived = 0;
101   msgHdr->dateRead = 0;
102   msgHdr->replyTo = sdmHdr->replyTo;
103 
104   if (sdmHdr->nextReply != 0)
105   {
106     msgHdr->replies = malloc(sizeof(tUmMsgNr));
107     msgHdr->replies[0] = sdmHdr->nextReply;
108     msgHdr->numReplies = 1;
109   }
110   else
111   {
112     msgHdr->replies = NULL;
113     msgHdr->numReplies = 0;
114   }
115 
116   msgHdr->data = (void *) sdmHdr;
117 
118   return msgHdr;
119 }
120 
sdmAreaOpen(char * areaName)121 tUmArea *sdmAreaOpen(char *areaName)
122 {
123   tUmArea *area;
124   tSdmArea *sdmArea;
125 
126   if ((areaName == NULL) || (*areaName == 0)) return NULL;
127 
128   area = calloc(1, sizeof(tUmArea));
129   sdmArea = calloc(1, sizeof(tSdmArea));
130 
131   if (areaName[strlen(areaName) - 1] == dirSepC)
132   {
133     area->areaName = malloc(strlen(areaName));
134     strncpy(area->areaName, areaName, strlen(areaName) - 1);
135     area->areaName[strlen(areaName) - 1] = 0;
136   }
137   else area->areaName = strdup(areaName);
138   area->areaType = cUmAreaTypeSdm;
139   area->data = (void *) sdmArea;
140 
141   return area;
142 }
143 
sdmAreaClose(tUmArea * area)144 void sdmAreaClose(tUmArea *area)
145 {
146   free(area->data);
147   free(area->areaName);
148   free(area);
149 }
150 
sdmAreaEmptyMsg(tUmArea * area)151 tUmMsg *sdmAreaEmptyMsg(tUmArea *area)
152 {
153   tUmMsg *msg;
154   tSdmMsg *sdmMsg;
155   tUmMsgHdr *hdr;
156   tSdmMsgHdr *sdmHdr;
157 
158   msg = calloc(1, sizeof(tUmMsg));
159   sdmMsg = calloc(1, sizeof(tSdmMsg));
160   hdr = calloc(1, sizeof(tUmMsgHdr));
161   sdmHdr = calloc(1, sizeof(tSdmMsgHdr));
162   msg->data = (void *) sdmMsg;
163   msg->msgHdr = hdr;
164   hdr->dateWritten = time(NULL);
165   hdr->areaType = cUmAreaTypeSdm;
166   hdr->data = (void *) sdmHdr;
167 
168   return msg;
169 }
170 
sdmAreaReadMsgHdr(tUmArea * area,tUmMsgNr msgNr)171 tUmMsgHdr *sdmAreaReadMsgHdr(tUmArea *area, tUmMsgNr msgNr)
172 {
173   tSdmMsgHdr *sdmHdr;
174   tUmMsgHdr *msgHdr;
175   FILE *f;
176   char *fname;
177 
178   fname = malloc(strlen(area->areaName)+11); // %u: max. 65535
179   sprintf(fname, "%s%c%u.msg", area->areaName, dirSepC, msgNr);
180   f = fopen(fname, "r");
181   free(fname);
182 
183   if (f == NULL) return NULL;
184 
185   sdmHdr = sdmIntReadMsgHdr(f);
186   fclose(f);
187 
188   msgHdr = sdmIntConvHdr(sdmHdr, msgNr);
189   // don't dispose sdmHdr, because it's in msgHdr now
190 
191   return msgHdr;
192 }
193 
sdmAreaReadMsg(tUmArea * area,tUmMsgNr msgNr)194 tUmMsg *sdmAreaReadMsg(tUmArea *area, tUmMsgNr msgNr)
195 {
196   tUmMsg *msg;
197   tSdmMsg *sdmMsg;
198   tSdmMsgHdr *sdmHdr;
199   tUmMsgHdr *msgHdr;
200   FILE *f;
201   char *fname;
202   char buf[1024];
203   char *msgBuf;
204   char *msgBufPos;
205   size_t br;
206   UINT32 msgBufSize;
207 
208   fname = malloc(strlen(area->areaName)+11); // %u: max. 65535
209   sprintf(fname, "%s%c%u.msg", area->areaName, dirSepC, msgNr);
210   f = fopen(fname, "r");
211   free(fname);
212 
213   if (f == NULL) return NULL;
214 
215   sdmHdr = sdmIntReadMsgHdr(f);
216 
217   msgHdr = sdmIntConvHdr(sdmHdr, msgNr);
218   // don't dispose sdmHdr, because it's in msgHdr now
219 
220   msg = malloc(sizeof(tUmMsg));
221   sdmMsg = malloc(sizeof(tSdmMsg));
222   msg->msgHdr = msgHdr;
223   msg->kludges = NULL;
224   msg->body = NULL;
225   msg->data = (void *) sdmMsg;
226 
227   // read whole message into memory
228   msgBuf = NULL;
229   msgBufSize = 0;
230   fseek(f, 0xbeL, SEEK_SET);
231   while (feof(f) == 0)
232   {
233     // read message in 1k-blocks
234     br = fread(buf, 1, 1024, f);
235     if (br > 0)
236     {
237       msgBuf = realloc(msgBuf, msgBufSize + br + 1);
238       msgBufPos = &msgBuf[msgBufSize];
239       strncpy(msgBufPos, buf, br);
240       msgBufSize += br;
241       msgBuf[msgBufSize] = 0;
242     }
243   }
244   fclose(f);
245 
246   // split into kludge- and body-lines
247   msgBufPos = msgBuf;
248   msg->numKludges = 0;
249   msg->numBody = 0;
250   while (*msgBufPos != 0)
251   {
252     char *crPos;
253 
254     // CR gets filtered out (no trailing CR)
255     crPos = strchr(msgBufPos, 13);
256 
257     // kludge or body?
258     if (*msgBufPos == 1)
259     {
260       if (crPos != NULL)
261       {
262 	msg->numKludges++;
263 	msg->kludges = realloc(msg->kludges,
264 			       msg->numKludges * sizeof(char *));
265 	msg->kludges[msg->numKludges - 1] = malloc((crPos - msgBufPos) + 1);
266 	strncpy(msg->kludges[msg->numKludges - 1],
267 		msgBufPos, crPos - msgBufPos);
268 	msg->kludges[msg->numKludges - 1][crPos - msgBufPos] = 0;
269       }
270       else
271       {
272 	msg->numKludges++;
273 	msg->kludges = realloc(msg->kludges,
274 			       msg->numKludges * sizeof(char *));
275 	msg->kludges[msg->numKludges - 1] = malloc(strlen(msgBufPos) + 1);
276 	strncpy(msg->kludges[msg->numKludges - 1],
277 		msgBufPos, strlen(msgBufPos));
278 	msg->kludges[msg->numKludges - 1][strlen(msgBufPos)] = 0;
279       }
280     }
281     else
282     {
283       if (crPos != NULL)
284       {
285 	msg->numBody++;
286 	msg->body = realloc(msg->body,
287 			       msg->numBody * sizeof(char *));
288 	msg->body[msg->numBody - 1] = malloc((crPos - msgBufPos) + 1);
289 	strncpy(msg->body[msg->numBody - 1],
290 		msgBufPos, crPos - msgBufPos);
291 	msg->body[msg->numBody - 1][crPos - msgBufPos] = 0;
292       }
293       else
294       {
295 	msg->numBody++;
296 	msg->body = realloc(msg->body,
297 			       msg->numBody * sizeof(char *));
298 	msg->body[msg->numBody - 1] = malloc(strlen(msgBufPos) + 1);
299 	strncpy(msg->body[msg->numBody - 1],
300 		msgBufPos, strlen(msgBufPos));
301 	msg->body[msg->numBody - 1][strlen(msgBufPos)] = 0;
302       }
303     }
304 
305     if (crPos != NULL) msgBufPos = crPos + 1;
306     else msgBufPos = &msgBufPos[strlen(msgBufPos)];
307   }
308 
309   free(msgBuf);
310 
311   return msg;
312 }
313 
sdmAreaChangeMsgHdr(tUmArea * area,tUmMsgNr msgNr,tUmMsgHdr * msgHdr)314 CHAR sdmAreaChangeMsgHdr(tUmArea *area, tUmMsgNr msgNr, tUmMsgHdr *msgHdr)
315 {
316 
317 }
318 
sdmAreaChangeMsg(tUmArea * area,tUmMsgNr msgNr,tUmMsg * msg)319 CHAR sdmAreaChangeMsg(tUmArea *area, tUmMsgNr msgNr, tUmMsg *msg)
320 {
321 
322 }
323 
sdmAreaAppendMsg(tUmArea * area,tUmMsg * msg)324 tUmMsgNr sdmAreaAppendMsg(tUmArea *area, tUmMsg *msg)
325 {
326 
327 }
328 
sdmAreaDeleteMsg(tUmArea * area,tUmMsgNr msgNr)329 CHAR sdmAreaDeleteMsg(tUmArea *area, tUmMsgNr msgNr)
330 {
331 
332 }
333 
sdmAreaLock(tUmArea * area)334 CHAR sdmAreaLock(tUmArea *area)
335 {
336 
337 }
338 
sdmAreaUnlock(tUmArea * area)339 CHAR sdmAreaUnlock(tUmArea *area)
340 {
341 
342 }
343 
sdmAreaLockMsg(tUmArea * area,tUmMsgNr msgNr)344 CHAR sdmAreaLockMsg(tUmArea *area, tUmMsgNr msgNr)
345 {
346 
347 }
348 
sdmAreaUnlockMsg(tUmArea * area,tUmMsgNr msgNr)349 CHAR sdmAreaUnlockMsg(tUmArea *area, tUmMsgNr msgNr)
350 {
351 
352 }
353 
sdmAreaGetLastread(tUmArea * area,tUmUserNr userNr)354 tUmMsgNr sdmAreaGetLastread(tUmArea *area, tUmUserNr userNr)
355 {
356 
357 }
358 
sdmAreaSetLastread(tUmArea * area,tUmUserNr userNr,tUmMsgNr msgNr)359 CHAR sdmAreaSetLastread(tUmArea *area, tUmUserNr userNr, tUmMsgNr msgNr)
360 {
361 
362 }
363 
sdmAreaNumMsgs(tUmArea * area)364 tUmMsgNr sdmAreaNumMsgs(tUmArea *area)
365 {
366 
367 }
368 
369 // allocates needed memory
sdmAreaMsgList(tUmArea * area,tUmMsgNr * numMsgs)370 tUmMsgNr *sdmAreaMsgList(tUmArea *area, tUmMsgNr *numMsgs)
371 {
372 
373 }
374 
sdmMsgDispose(tUmMsg * msg)375 void sdmMsgDispose(tUmMsg *msg)
376 {
377   free(msg->msgHdr->data);
378   free(msg->msgHdr->fromName);
379   free(msg->msgHdr->toName);
380   free(msg->msgHdr->subject);
381   free(msg->msgHdr->replies);
382   free(msg->msgHdr);
383   if (msg->kludges != NULL) free(msg->kludges);
384   if (msg->body != NULL) free(msg->body);
385   free(msg);
386 }
387 
sdmMsgHdrDispose(tUmMsgHdr * msgHdr)388 void sdmMsgHdrDispose(tUmMsgHdr *msgHdr)
389 {
390   free(msgHdr->data);
391   free(msgHdr->fromName);
392   free(msgHdr->toName);
393   free(msgHdr->subject);
394   free(msgHdr->replies);
395   free(msgHdr);
396 }
397 
398 
399