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