1 Unit TickType;
2 Interface
3 {$IfDef FPC}
4  {$PackRecords 1}
5 {$EndIf}
6 
7 Uses
8 {$IfDef SPEED}
9   OS2Def,
10 {$EndIf}
11   Types, MKGlobT, GeneralP;
12 
13 Type
14      TChar = Array[0..65534] of Char;
15      PChar2 = ^TChar;
16      PNetAddr = ^TNetAddr;
17      PArea = ^TArea;
18      PTick = ^TTick;
19      PConnectedUser = ^TConnectedUser;
20      PUser = ^TUser;
21      PTickCfg = ^TTickCfg;
22      PPacker = ^TPacker;
23      PUnPacker = ^TUnPacker;
24      PGroup = ^TGroup;
25      PAnnGroup = ^TAnnGroup;
26      PUpLink = ^TUpLink;
27      PDupeEntry = ^TDupeEntry;
28      PArcListEntry = ^TArcListEntry;
29      PArcList = ^TArcList;
30      PPTListEntry = ^TPTListEntry;
31      PPTList = ^TPTList;
32      PAnnAreaEntry = ^TAnnAreaEntry;
33      PAnnFileEntry = ^TAnnFileEntry;
34      PAreaList = ^TAreaList;
35      PString80List = ^TString80List;
36 
37      FileStr = String[20];
38      DirStr = String[150];
39 
40      TNetAddr = {29 Byte}
41        Record
42        Zone, Net, Node, Point: Word;
43        Domain: String[20];
44        end;
45 
46      TDomain = {41b}
47       Record
48       Domain: String[20];
49       Abbrev: String[20];
50       End;
51 
52      TTick = {28861 Byte}
53        Record
54        Area: String[30];
55        AreaDesc: String[80];
56        ReleaseTime: ULong; {Unix format}
57        Replaces: FileStr;
58        Name: FileStr;
59        Desc: String[255];
60        LDesc: Array[1..100] of String[80];
61        NumLDesc: Byte;
62        Size: ULong;
63        Date: ULong; {Unix format}
64        CRC: ULong;
65        Origin: TNetAddr;
66        From: TNetAddr;
67        _To: TNetAddr;
68        ToName: String[40];
69        Pwd: String[20];
70        CreatedBy: String;
71        SeenBy: Array[1..500] of TNetAddr;
72        NumSB: Byte;
73        App: Array[1..20] of String[150];
74        NumApp: Byte;
75        Path: Array[1..20] of String128;
76        NumPath: Byte;
77        Bad: Byte;
78        End;
79 
80      TConnectedUser =
81        Record
82        Prev: PConnectedUser;
83        Next: PConnectedUser;
84        User: PUser;
85        Receive: Boolean;
86        Send: Boolean;
87        End;
88 
89      TArea = {614 Byte}
90        Record
91        Prev: PArea;
92        Next: PArea;
93        Name: String[40];
94        Desc: String[80];
95        BBSArea: String[40];
96        Path: DirStr;
97        MoveTo: DirStr;
98        ReplaceExt: String[10];
99        Group: Byte;
100        Level: ULong;
101        Addr: TNetAddr;
102        Flags: ULong;
103          {Bit Desc
104            0  PassThrough
105            1  DupeCheck
106            2  CRC-Check
107            3  Touch
108            4  not used
109            5  Manual
110            6  No %Pause
111            7  NewFiles-Hatch
112            8  Costsharing
113            9  Hidden
114           10  RemoteChange
115          }
116        LastHatch : ULong;
117        CostPerMB: ULong;
118        AnnGroups: Set of Byte;
119        Users: PConnectedUser;
120        End;
121 
122      TUser = {217 Byte}
123        Record
124        Prev: PUser;
125        Next: PUser;
126        Name: String[40];
127        Addr: TNetAddr;
128        ArcAddr: TNetAddr;
129        OwnAddr: TNetAddr;
130        Active: Boolean;
131        Level: ULong;
132        Groups: Set of Byte;
133        Pwd: String[20];
134        MailFlags: Byte;
135          { Value  Desc
136              1    Normal
137              2    Direct
138              3    Hold
139              4    Crash
140          }
141        Sends: Boolean;
142        Receives: Boolean;
143        Flags: ULong;
144          {Bit Desc
145            0  Send TIC
146            1  Notify
147            2  may AutoCreate
148            3  Admin
149            4  NMAnn
150          }
151        Packer: Byte;
152        PackTICs: Boolean;
153        PackFiles: Boolean;
154        May: ULong;
155          {Bit Desc
156            0  connect areas
157            1  disconnect areas
158            2  %Pause
159            3  %Pwd
160            4  %Compression
161            5  %Tic
162            6  %Notify
163            7  %Rescan
164          }
165        ACGroup: Byte;
166        End;
167 
168      TPacker = {85 Byte}
169        Record
170        Index: Byte;
171        Ext: String[3];
172        Cmd: String[80];
173        End;
174 
175      TUnPacker = {85 Byte}
176        Record
177        Index: Byte;
178        Ext: String[3];
179        Cmd: String[80];
180        End;
181 
182      TGroup = {42 Byte}
183        Record
184        Index: Byte;
185        Name: String[40];
186        End;
187 
188      TAnnGroup = {587b}
189        Record
190        Next: PAnnGroup;
191        Prev: PAnnGroup;
192        Index: Byte;
193        Name: String[40];
194        Area: DirStr;
195        Subj: String[72];
196        FromName: String[30];
197        ToName: String[30];
198        FromAddr: TNetAddr;
199        ToAddr: TNetAddr;
200        Typ: Byte;
201        HeaderFile: DirStr;
202        FooterFile: DirStr;
203        End;
204 
205      TArcName = {22b}
206        Record
207        FileName: String20;
208        UnPacker: Byte;
209        End;
210 
211      TMgrName = String20; {22b}
212 
213      TTickCfg =
214        Record
215        SysOp: String[40];                              {    41b}
216        BBS: String[40];                                {    41b}
217        Addrs: Array[1..100] of TNetAddr;               {  2900b}
218        NumAddrs: Word;                                 {     2b}
219        Domains: Array[1..50] of TDomain;               {  2050b}
220        NumDomains: Byte;                               {     1b}
221        Areas: PArea;                                   {     4b}
222        NumAreas: ULong;                                {     1b}
223        Users: PUser;                                   {     4b}
224        NumUser: ULong;                                 {     1b}
225        InBound: DirStr;                                {   151b}
226        OBType: Byte;                                   {     1b}
227        OutBound: DirStr;                               {   151b}
228        TicOut: DirStr;                                 {   151b}
229        NetMail: DirStr;                                {   151b}
230        Bad: DirStr;                                    {   151b}
231        PT: DirStr;                                     {   151b}
232        FlagDir: DirStr;                                {   151b}
233        Packer: Array[1..50] of TPacker;                {  4250b}
234        UnPacker: Array[1..50] of TUnPacker;            {  4250b}
235        NumPacker: Byte;                                {     1b}
236        NumUnPacker: Byte;                              {     1b}
237        Groups: Array[1..255] of TGroup;                { 10710b}
238        NumGroups: Byte;                                {     1b}
239        AnnGroups: PAnnGroup;                           {     4b}
240        NumAnnGroups: Byte;                             {     1b}
241        UpLinks: PUpLink;                               {     4b}
242        NumUpLinks: Byte;                               {     1b}
243        ArcNames: Array[1..50] of TArcName;             {  1100b}
244        NumArcNames: Byte;                              {     1b}
245        MgrNames: Array[1..20] of TMgrName;             {   440b}
246        NumMgrNames: Byte;                              {     1b}
247        DescPos: Byte;                                  {     1b}
248        LDescString: String[10];                        {    11b}
249        AddDLC: Boolean;                                {     1b}
250        DLCDig: Byte;                                   {     1b}
251        SingleDescLine: Boolean;                        {     1b}
252        CheckDest: Boolean;                             {     1b}
253        DelReq: Boolean;                                {     1b}
254        DelRsp: Boolean;                                {     1b}
255        LocalPwd: String[20];                           {    21b}
256        LongDirNames: Boolean;                          {     1b}
257        SplitDirs: Boolean;                             {     1b}
258        MaxDupeAge: Word;                               {     2b}
259        DataPath: DirStr;                               {   151b}
260        AreasLog: DirStr;                               {   151b}
261        BBSAreaLog: DirStr;                             {   151b}
262        MsgIDFile: DirStr;                              {   151b}
263        DupeFile: DirStr;                               {   151b}
264        LNameLst: DirStr;                               {   151b}
265        NewAreasLst: DirStr;                            {   151b}
266        ArcLst: DirStr;                                 {   151b}
267        PTLst: DirStr;                                  {   151b}
268        CreateDirs: Boolean;                            {     1b}
269        end;                                            {-------}
270                                                        { 15391b}
271 
272      TUpLink =
273        Record
274        Prev: PUpLink;
275        Next: PUpLink;
276        Comment: String[40];
277        Name: String[20];     {Name of ConfMgr, e.g. "FileFix"}
278        Addr: TNetAddr;       {Address of ConfMgr, e.g. "2:2435/40"}
279        Level: ULong;         {Min DownLink Level required to forward requests}
280        Group: Byte;
281        Pwd: String[20];      {Pwd for ConfMgr, e.g. "secret"}
282        AreaList: DirStr;     {List of areas available from this UpLink}
283        Unconditional: Boolean; {Forward request even if area is not in AreaList}
284        end;
285 
286      TDupeEntry =        {80b}
287        Record
288        Area: String[40];
289        Name: String[30];
290        CRC: ULong;
291        Date: LongInt; {UnixDate}
292        End;
293 
294      TArcListEntry =     {332b}
295        Record
296        Addr: TNetAddr;
297        FileName: DirStr;
298        Del: Boolean;
299        PTFN: DirStr; {PassThrough FileName}
300        End;
301 
302      TArcList =          {349b}
303        Record
304        Prev: PArcList;
305        Next: PArcList;
306        a: TArcListEntry;
307        IsDone: Boolean;
308        End;
309 
310      TPTListEntry =      {172b}
311        Record
312        TICName: DirStr;
313        FileName: FileStr;
314        End;
315 
316      TPTList =           {188b}
317        Record
318        Prev: PPTList;
319        Next: PPTList;
320        a: TPTListEntry;
321        End;
322 
323      TAnnAreaEntry =
324        Record
325        Prev: PAnnAreaEntry;
326        Next: PAnnAreaEntry;
327        Area: String[40];
328        AnnGroups: Set of Byte;
329        Desc: String[40];
330        Files: PAnnFileEntry;
331        End;
332 
333      TAnnFileEntry =
334        Record
335        Prev: PAnnFileEntry;
336        Next: PAnnFileEntry;
337        Name: String[40];
338        Desc: PChar2;
339        Size: LongInt;
340        Date: TimeTyp;
341        Sender: TNetAddr;
342        End;
343 
344      TAreaList =
345        Record
346        Prev: PAreaList;
347        Next: PAreaList;
348        Name: String[40];
349        BBSArea: String[40];
350        End;
351 
352      TString80List =
353       Record
354       s: String80;
355       next: PString80List;
356       End;
357 
358 
Addr2Strnull359 Function Addr2Str(Addr: TNetAddr): String;
Addr2StrNDnull360 Function Addr2StrND(Addr: TNetAddr): String;
361 Procedure Str2Addr(s: String; var Addr: TNetAddr);
CompAddrnull362 Function CompAddr(A1, A2: TNetAddr): Boolean;
363 Procedure CopyAddr(var A1:TNetAddr; A2: TNetAddr);
364 Procedure MKAddr2TNetAddr(MKAddr: AddrType; Var A1: TNetAddr);
365 Procedure TNetAddr2MKAddr(A1: TNetAddr; Var MKAddr: AddrType);
366 
367 Implementation
368 
Addr2Strnull369 Function Addr2Str(Addr: TNetAddr): String;
370 Var
371   s: String;
372 
373   Begin
374   With Addr do
375     Begin
376     s := IntToStr(Zone) + ':' + IntToStr(Net) + '/' + IntToStr(Node);
377     If (Point <> 0) then s := s + '.' + IntToStr(Point);
378     If (Domain <> '') then s := s + '@' + Domain;
379     Addr2Str := s;
380     End;
381   End;
382 
383 {without domain, e.g. for origin}
Addr2StrNDnull384 Function Addr2StrND(Addr: TNetAddr): String;
385 Var
386   s: String;
387 
388   Begin
389   With Addr do
390     Begin
391     s := IntToStr(Zone) + ':' + IntToStr(Net) + '/' + IntToStr(Node);
392     If (Point <> 0) then s := s + '.' + IntToStr(Point);
393     Addr2StrND := s;
394     End;
395   End;
396 
397 Procedure Str2Addr(s: String; var Addr: TNetAddr);
398 Var
399 {$IfDef VIRTUALPASCAL}
400   i: LongInt;
401 {$Else}
402   i: Integer;
403 {$EndIf}
404 
405   Begin
406   If (Pos(':', s) = 0) then Addr.Zone := 0
407   Else
408     Begin
409     Val(Copy(s, 1, Pos(':', s) - 1), Addr.Zone, i);
410     Delete(s, 1, Pos(':', s));
411     End;
412   If (Pos('/', s) = 0) then Addr.Net := 0
413   Else
414     Begin
415     Val(Copy(s, 1, Pos('/', s) - 1), Addr.Net, i);
416     Delete(s, 1, Pos('/', s));
417     End;
418   If (Pos('.', s) = 0) or
419    ((Pos('.', s) > Pos('@', s)) and (Pos('@', s) > 0)) then
420     Begin
421     Addr.Point := 0;
422     If (Pos('@', s) = 0) then
423       Begin
424       Val(s, Addr.Node, i);
425       Addr.Domain := '';
426       End
427     Else
428       Begin
429       Val(Copy(s, 1, Pos('@', s) - 1), Addr.Node, i);
430       Delete(s, 1, Pos('@', s));
431       Addr.Domain := UpStr(s);
432       End;
433     End
434   Else
435     Begin
436     Val(Copy(s, 1, Pos('.', s) - 1), Addr.Node, i);
437     Delete(s, 1, Pos('.', s));
438     If (Pos('@', s) = 0) then
439       Begin
440       Val(s, Addr.Point, i);
441       Addr.Domain := '';
442       End
443     Else
444       Begin
445       Val(Copy(s, 1, Pos('@', s) - 1), Addr.Point, i);
446       Delete(s, 1, Pos('@', s));
447       Addr.Domain := UpStr(s);
448       End;
449     End;
450   End;
451 
CompAddrnull452 Function CompAddr(A1, A2: TNetAddr): Boolean;
453 Var
454   C: Boolean;
455 
456   Begin
457   c := ((A1.Zone = 0) or (A2.Zone = 0) or (A1.Zone = A2.Zone));
458   c := c and ((A1.Net = 0) or (A2.Net = 0) or (A1.Net = A2.Net));
459   c := c and (A1.Node = A2.Node);
460   c := c and (A1.Point = A2.Point);
461   c := c and ((A1.Domain = '') or (A2.Domain = '') or (UpStr(A1.Domain) = UpStr(A2.Domain)));
462   CompAddr := c;
463   End;
464 
465 Procedure CopyAddr(var A1:TNetAddr; A2: TNetAddr);
466   Begin
467   A1.Zone := A2.Zone;
468   A1.Net := A2.Net;
469   A1.Node := A2.Node;
470   A1.Point := A2.Point;
471   A1.Domain := A2.Domain;
472   End;
473 
474 Procedure MKAddr2TNetAddr(MKAddr: AddrType; Var A1: TNetAddr);
475   Begin
476   A1.Zone := MKAddr.Zone;
477   A1.Net := MKAddr.Net;
478   A1.Node := MKAddr.Node;
479   A1.Point := MKAddr.Point;
480   A1.Domain := MKAddr.Domain;
481   End;
482 
483 Procedure TNetAddr2MKAddr(A1: TNetAddr; Var MKAddr: AddrType);
484   Begin
485   MKAddr.Zone := A1.Zone;
486   MKAddr.Net := A1.Net;
487   MKAddr.Node := A1.Node;
488   MKAddr.Point := A1.Point;
489   MKAddr.Domain := A1.Domain;
490   End;
491 
492 end.
493 
494