1 /*****************************************************************************/
2 /* */
3 /* (C) Copyright 1992-1997 Alberto Pasquale */
4 /* Portions (C) Copyright 1999 Per Lundberg */
5 /* */
6 /* A L L R I G H T S R E S E R V E D */
7 /* */
8 /*****************************************************************************/
9 /* */
10 /* How to contact the author: Alberto Pasquale of 2:332/504@fidonet */
11 /* Viale Verdi 106 */
12 /* 41100 Modena */
13 /* Italy */
14 /* */
15 /*****************************************************************************/
16
17 #include <stdlib.h>
18 #include <string.h>
19 #include <time.h>
20 #include "types.hpp"
21 #include "misc.hpp"
22 #include "outblk.hpp"
23 #include "cfgdata.hpp"
24
25 #ifdef __QNXNTO__
26 #include <strings.h>
27 #endif // __QNXNTO__
28
29 #define vID 8 // version ID of the DAT file (byte)
30
31
read_cib(FILE * f,InpSave * is)32 static void read_cib (FILE *f, InpSave *is)
33 {
34 fread (is, sizeof (InpSave), 1, f);
35 }
36
37
read_cob(FILE * f,OutncBlk * cob,OutSave * os=NULL)38 void read_cob (FILE *f, OutncBlk *cob, OutSave *os = NULL)
39 {
40 time_t NewPwdFileTime = 0;
41
42 if (os) {
43 NewPwdFileTime = os->PwdFileTime; // save newpwdfiletime
44 fread (os, sizeof (OutSave), 1, f); // read cob save blk
45 }
46 // read all cib save blks
47 InpncBlk *cib = cob->InpBlk;
48 while (cib) { // if error, Time remains 0
49 read_cib (f, cib->s);
50 cib = cib->next;
51 }
52
53 if (os)
54 if (os->PwdFileTime < NewPwdFileTime) { // if new cob pwd cfg
55 cob->InpSavInit ();
56 os->PwdFileTime = NewPwdFileTime;
57 }
58 }
59
60
read_data(pcsz DatFile,time_t newcfgtime)61 void read_data (pcsz DatFile, time_t newcfgtime)
62 {
63 FILE *f;
64
65 f = fopen (DatFile, "rb");
66 if (!f)
67 return; // file not existent, all fields remain as initialized
68
69 byte versionID = 0;
70 fread (&versionID, sizeof (versionID), 1, f);
71 if (versionID != vID) {
72 fclose (f); // if different version number don't read
73 return;
74 }
75
76 time_t cfgtime = 0;
77 fread (&cfgtime, sizeof (cfgtime), 1, f);
78 if (cfgtime < newcfgtime) { // Cfg modified ?
79 fclose (f);
80 return;
81 }
82
83 if (nocomp)
84 read_cob (f, nocomp);
85
86 OUTBLK *cob = outblk;
87 while (cob) {
88 read_cob (f, cob, cob->s);
89 cob = cob->next;
90 }
91
92 fclose (f);
93 }
94
95
save_cib(FILE * f,InpSave * is)96 int save_cib (FILE *f, InpSave *is)
97 {
98 return (fwrite (is, sizeof (InpSave), 1, f) != 1);
99 }
100
101
save_cob(FILE * f,OutncBlk * cob,OutSave * os=NULL)102 int save_cob (FILE *f, OutncBlk *cob, OutSave *os = NULL)
103 {
104 int error = 0;
105
106 if (os)
107 error |= (fwrite (os, sizeof (OutSave), 1, f) != 1);
108
109 InpncBlk *cib = cob->InpBlk;
110 while (cib) {
111 error |= save_cib (f, cib->s);
112 cib = cib->next;
113 }
114
115 return error;
116 }
117
118
save_data(pcsz DatFile,time_t cfgtime)119 void save_data (pcsz DatFile, time_t cfgtime)
120 {
121 FILE *f;
122 int error = 0;
123
124 f = fopen (DatFile, "wb");
125 if (!f) {
126 vprintlog ("Cannot save data to \"%s\"\n", DatFile);
127 return;
128 }
129
130 byte versionID = vID; // version ID of the DAT file
131 error |= (fwrite (&versionID, sizeof (versionID), 1, f) != 1);
132
133 error |= (fwrite (&cfgtime, sizeof (cfgtime), 1, f) != 1);
134
135 if (nocomp)
136 error |= save_cob (f, nocomp);
137
138 OUTBLK *cob = outblk;
139 while (cob) {
140 error |= save_cob (f, cob, cob->s);
141 cob = cob->next;
142 }
143
144 fclose (f);
145
146 if (error)
147 vprintlog ("Error writing \"%s\"\n", DatFile);
148 }
149
150