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