File: doku.txt

package info (click to toggle)
sendfile 2.1b.20080616-8
  • links: PTS
  • area: main
  • in suites: bullseye
  • size: 1,568 kB
  • sloc: ansic: 13,128; sh: 4,193; perl: 844; makefile: 147; java: 36; csh: 3
file content (1816 lines) | stat: -rw-r--r-- 49,655 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
*ACHTUNG*		!VERALTET!			*ACHTUNG*

Definition eines Protokolls fr asynchronen Filetransfer im Internet und
                     Referenzimplementierung fr Unix









Ulli Horlacher





Allmandring 30

Rechenzentrum Universitt Stuttgart



framstag@rus.uni-stuttgart.de







5. Mrz 1996

:

Kurzbeschreibung

SAFT (Simple Asynchronous File Transfer) ist ein neues Internet-Protokoll, das es erlaubt, 
Dateien und Nachrichten asynchron zu verschicken, d.h. ohne da es notwendig ist, sich beim 
Empfngersystem einzuloggen. Als Referenzimplementation wurden ein sendfile-Client (ver-
schickt Dateien), ein sendmsg-Client (verschickt einzeilige Nachrichten), ein receive-Client 
(empfngt Dateien aus dem sendfile-spool) und ein sendfiled-Server (empfngt Dateien und 
Nachrichten und verteilt sie weiter) geschrieben.

INHALT

1	Definition des asynchronen Dateitransfers und Abgrenzung 
gegenber existierenden Diensten		4

1.1	Filetransfer im Bitnet	4

1.2	Das SIFT/UFT Protokoll	5

1.3	Das SAFT Protokoll	5

1.3.1	Beispiele	10

1.3.2	Begrndung des Protokolldesigns	12

2	sendfile: eine SAFT Referenzimplementation fr Unix	14

2.1	Programmbeschreibung	14

2.1.1	sendfiled	14

2.1.2	sendfile	16

2.1.3	sendmsg	18

2.1.4	receive	18

2.2	Benutzerkonfigurationsdateien	20

2.3	Installation	21

2.4	Sourcen	23

2.4.1	Aufrufdiagramm	26

2.4.2	Datenstrukturen	27

3	Danksagungen	30

4	Informationsverzeichnis	31

5	Glossar	32

1  Definition des asynchronen Dateitransfers und Abgrenzung 
gegenber existierenden Diensten

Bei einem asynchronen Filetransfer werden Dateien von einem Sender an einen Empfn-
ger geschickt, ohne da letzterer aktiv an der bertragung teilnehmen mu. E-mail ist z.B. 
ein asynchroner Dienst, whrend ftp einen synchronen Dienst darstellt.

Asynchronen Filetransfer gab es bisher im Internet nicht. Wollte ein Benutzer A einem 
beliebigen Benutzer B eine Datei zukommen lassen, hatte er bisher nur folgende wenig 
brauchbare Mglichkeiten:

	ftp [13] zum Empfngeraccount 		
Dazu mu das Pawort des Empfngeraccounts bekannt sein. Wenn A und B nicht 
physisch identisch sind, ist diese Methode sicherheitstechnisch indiskutabel. Aber 
auch wenn es sich bei A und B um dieselbe Person handelt, so wandert doch das Pa-
wort als Klartext in einem tcp-Pckchen durchs Internet.

	ftp ber einen anonymous ftp Server	 	
Die Datei mu von A auf den anonymous ftp Server mittels ftp bertragen werden, A 
mu B mit einer e-mail informieren, da dieser die Datei abholen kann und B mu 
dann ebenfalls ftp aufrufen. Als Nebenbedingung mu ein ftp Server gefunden wer-
den, der von beiden gut erreicht werden kann und dieser Server mu ein allgemein 
schreibbares Verzeichnis aufweisen. Whrend die Datei auf dem anonymous ftp Ser-
ver liegt, kann sie aber praktisch von jedermann gelesen, gelscht oder verndert wer-
den.

	verschicken via e-mail		
Die Datei wird von A an B als e-mail geschickt. Nach RFC 822 darf eine e-mail nur 
Zeichen aus dem NVT-ASCII Zeichensatz enthalten, welcher eine Untermenge von 7 
bit ASCII ist. Somit ist der Dateientransfer auf englische Textdokumente beschrnkt, 
wenn man nicht die zu verschickende Datei entsprechend kodiert, so da sie nur noch 
NVT-ASCII Zeichen enthlt. Als Kodierung bieten sich an: uuencode oder MIME 
[16]. Beide sind aber umstndlich zu handhaben, untersttzen nicht alle Dateiattribute 
und vergrern zwangslufig die zu bertragende Datenmenge. Zudem sind die real 
existierenden Mailsysteme nicht in der Lage, mit greren bertragungen fertig zu 
werden.

1.1  Filetransfer im Bitnet

Im Bitnet gibt es einen asynchronen Filetransferdienst. Dieser wurde als Vorbild genom-
men und auf das Internet abgebildet, wobei die Funktionalitt wesentlich erweitert wurde.

Tatschlich basieren smtliche Bitnetdienste auf asynchronen Filetransfers.

Bitnet erlaubt aufgrund von IBM-internen Restriktionen nur Dateinamen mit 8 Byte 
und 8 Byte Extension, Zeilenlngen von maximal 80 Byte und EBCDIC bzw. 7 bit 
ASCII als Zeichensatz.

1.2  Das SIFT/UFT Protokoll

In der Vorbereitungsphase wurde das SIFT/UFT (Sender-Initiated/Unsolicited File 
Transfer) Protokoll aka RFC 1440 gefunden [15] , welches ebenfalls einen asynchro-
nen Filetransferdienst fr das Internet beschreibt. Dieses Protokoll hat den ,Experi-
mental" Status und enthlt noch einige Fehler bzw. Inkonsistenzen. Auerdem ist es 
stark an IBMs VM Betriebssystem angelehnt, da es ausschliesslich dessen Dateitypen 
untersttzt. 

Es wurde versucht, mit dem Author (Rick Troth, troth@compassnet.com) e-mail Kon-
takt aufzunehmen. Leider lagen seine Antwortzeiten im Schnitt bei ca. 2  Wochen, so 
da eine sinnvolle Diskussion mit ihm nicht mglich war. SIFT/UFT weist folgende 
Mngel auf:

	der Zeichensatz des Protokolls ist nicht spezifiziert

	als Dateitypen sind nur propritre VM-Files vorgesehen

	das Datumformat ist nicht spezifiziert

	die Zeichenstze der Dateien sind nicht spezifiziert

	Designfehler in der DATA-Anweisung: ein String ,EOF" in der zu bertragenden 
Datei fhrt zum Abbruch der bertragung

	die Return Codes des Servers sind nicht spezifiziert

	Rick Troth ist anscheinend der einzige, der SIFT/UFT real benutzt; es ist nur ein 
einziger Server bekannt (ua1vm.ua.edu), der nicht mal selber RFC 1440 konform 
ist

Somit war eine Projektrealisation auf Basis von SIFT/UFT nicht mglich und es 
mute ein eigenes Protokoll entwickelt werden.

1.3  Das SAFT Protokoll

Als Grundlage fr den asynchronen Filetransfer wurde das SAFT-Protokoll entwik-
kelt:

	Simple Asynchronous File Transfer

Wesentliche Merkmale sind:

	Betriebssystemunabhngigkeit	
SAFT soll auf mglichst allen Computersystemen im Internet verfgbar sein.

	Einfachheit 	
,keep it simple": ein berschaubares Protokoll auf ASCII-Basis, so da es leicht mit 
telnet auf den Serverport zu debuggen ist.

	Erweiterbarkeit		
sptere Erweiterungen sollen keine knstlichen Grenzen behindern. Als abschrecken-
des Beispiel sei die 7 Bit Beschrnkung von smtp / RFC 822 genannt.

Quasi als ,Abfallprodukt" wurden noch asynchrone Nachrichten (,messages") als weite-
rer Internetdienst integriert. Bei solch einer Nachricht handelt es sich um einen einzeiligen 
Text, der normalerweise direkt auf das Terminal des Empfngers geschrieben wird.

SAFT ist ein Client/Server-Protokoll. Der SAFT-Client, typischerweise ein Userpro-
gramm, verschickt Dateien oder Nachrichten via Internet an den SAFT-Server, welcher sie 
entgegennimmt und an den lokalen Adressaten direkt ausliefert oder in einem Spoolbe-
reich zwischenlagert, wo sie dann der Adressat mittels eines Receive-Clients abholen 
kann. Die Funktionsweise ist hnlich wie bei normaler Internet-mail.

Der Spooling-Mechanismus und der Receive-Client werden nicht von SAFT beschrieben, 
sondern bleiben der jeweiligen Implementation berlassen. SAFT definiert nur das reine 
bertragungsprotokoll.

SAFT untersttzt folgende Dateiattribute:

	Dateiname in Unicode [19] mit beliebiger Lnge

	Zeitstempel		
Spezifikation nach ISO-8601 [7] (UTC full date & time)

	BINARY	
unstrukturierter Bytestrom

	SOURCE		
Datei besteht aus einzelnen Zeilen jeweils beliebiger Lnge mit CR/LF als EOL Mar-
kierung

	TEXT		
wie Source, nur da zustzlich das Attribut CHARSET (siehe unten) ausgewertet wird

	Name des Zeichensatzes		
Spezifikation nach RFC 1345 [14]

	Betriebssystemspezifische Attribute		
Diese knnen bei der ersten SAFT-Implementation fr das jeweilige Betriebssystem 
vom Autor beliebig verwendet werden. Kompatibilitt ist dabei aus prinzipiellen 
Grnden nur zwischen Client und Server desselben Betriebssystems gewhrleistet.

SAFT kann Dateien mittels gzip Algorithmus komprimiert bertragen. Dieses stellt kein 
Dateiattribut sondern ein bertragungsmerkmal dar. Fr den Sender und Empfnger 
geschieht dies vllig transparent. Diese Komprimierung wurde eingefhrt, um Netzband-
breite zu schonen. Der Flaschenhals eines Filetransfers stellt in der Regel das Netz dar 
und nicht die Leistungsfhigkeit der lokalen CPU.

SAFT benutzt tcp als Transportmedium und den tcp-Port 487. Der SAFT-Client stellt 
eine Verbindung zu diesem Port auf dem Host des SAFT-Servers her.

Die Client/Server Kommunikation ist zweigeteilt, sie setzt sich aus dem eigentlichen 
Kommunikationsprotokoll und der zu bertragenden Datei als ,data-stream" zusam-
men.

Das Kommunikationsprotokoll ist NVT-konform, also 7 bit ASCII ohne Steuerzeichen 
und CR/LF (ASCII 13 und ASCII 10) als EOL Markierung. HT (ASCII 9) ist zwar 
zulssig, sollte aber vermieden werden.

Ein Kommando vom Client besteht aus einer Zeile, die ein Befehlswort und je nach 
Bedarf ein oder mehrere Parameter enthlt, getrennt durch Whitespace. Ein White-
space ist eine nicht-Null Zeichenfolge aus SPACE (ASCII 32) oder HT (ASCII 9) in 
beliebiger Reihenfolge. Nach Mglichkeit sollte immer ein einzelnes SPACE als 
Whitespace verwendet werden.

Als Kommandos sind definiert:

	FROM <sender> [<real name>]
Absender Loginname und optional echter Name und pgp Signatur.

	TO <recipient>		
Empfnger Loginname

	FILE <name>	
Name der zu bertragenden Datei

	DATE <date>		
Zeitstempel der Datei in UTC ISO-8601 Format (YYYY:MM:DD hh:mm:ss)

	TYPE BINARY|SOURCE|TEXT [COMPRESSED]		
Typ der Datei.

	CHARSET <name>	
Name des Zeichensatzes einer Textdatei nach RFC 1345 (&charset Eintrag) . Ali-
ase sind nicht erlaubt. Wenn mglich sollte ISO_8859-1:1987 verwendet werden.

	ATTR <attribute-string>	
Betriebssystemspezifische Dateiattributerweiterung, implementationsabhngig.

	MSG <message>		
Einzeilige Nachricht, die direkt auf das Terminal des Empfngers ausgegeben 
werden soll.

	DEL		
Datei, die zuvor bertragen wurde, wird gelscht.

	RESEND		
Die Datei soll nach vorhergehenden bertragungsabbruch erneut geschickt werden. 
Die Serverantwort enthlt als erster String die Anzahl der bereits bertragenen Bytes: 
<transmitted> 

	SIZE <size> <size uncompressed>	
Gre der zu bertragenden Datei in Bytes: die erste Zahl stellt die tatschlich zu 
bertragenden Bytes dar, die zweite die Gre der Datei nach der Dekomprimierung.

	DATA		
Ab hier folgen <size> - <transmitted> Bytes der Datei als aufeinanderfolgender 
Strom von 8-bit Bytes.

	QUIT		
Ende der Verbindung

Die Befehlswrter knnen in Gro- oder Kleinbuchstaben oder sogar gemischt geschrie-
ben werden. FROM, from oder FrOm sind gleichbedeutend. Nach Mglichkeit sollten 
alle Befehlswrter aber einheitlich in Grobuchstaben geschrieben werden.

<sender>, <real name>, <recipient>, <name> und <message> sind UTF-7 [20] kodierte 
Strings. Nach Mglichkeit sollten hier nur NVT-ASCII oder ISO Latin-1 Zeichen [14] 
enthalten sein.

Zur bertragung einer Datei mssen mindestens die Kommandos FROM, TO, FILE und 
SIZE angegeben werden. DATA startet dann den eigentlichen Transfer. Die anderen 
Kommandos sind optional. Die Reihenfolge der Kommandos spielt im Allgemeinen keine 
Rolle. Ausnahme sind (Format: Kommando (Kommandos, die vorhergehen mssen)):

	DATA ( FROM, TO, FILE , SIZE )

	MSG ( FROM , TO )

	RESEND ( FROM, TO, FILE )

	DEL ( FROM, TO, FILE, DATE, SIZE )

Jedes dieser Kommandos wird vom Server mit einer sogenannten ,reply-message" beant-
wortet, die folgendermaen aufgebaut ist:

Antwort	=	{reply-line} reply-end

reply-line	=	reply-code "-" text

reply-end	=	reply-code " " text

reply-code	=	number number number

number	=	"0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

text	=	char {char} CR LF

char	=	<Zeichen aus NVT-ASCII Zeichensatz>

 CR ist ASCII 13, LF ist ASCII 10. Die erste Ziffer (number) des reply-code gibt Aus-
kunft ber die Kategorie der Antwort:

	2 steht fr: korrekte Kommandodurchfhrung

	3 steht fr: weitere Daten/Informationen werden bentigt

	4 steht fr: fataler Fehler mit anschliessendem Verbindungsabbruch

	5 steht fr: sonstiger Fehler, der aber durch weitere Kommandos wieder behebbar 
ist



Definiert sind folgende ,reply-messages":

	200 Command o.k..

	201 File has been correctly received.

	202 Command not implemented, superfluous at this site.

	205 Non-ASCII character in command line ignored.

	214 <help-text>

	220 <hostname> SAFT server (sendfiled <version> on <OS>) ready.

	221 Goodbye.

	230 <number> Bytes already received.

	302 Header ok, send data.

	410 Spool directory does not exist.

	411 Can`t create user spool directory.

	412 Can`t write to user spool directory.

	415 TCP error: received too few data.

	421 Service not available.

	451 Requested action aborted: local error in processing.

	452 Insufficient storage space.

	453 Insufficient system resources.

	500 Syntax error, command unrecognized.

	501 Syntax error in parameters or arguments.

	502 Command not implemented.

	503 Bad sequence of commands.

	504 Command not implemented for that parameter.

	505 Missing argument.

	510 This SAFT-server can only receive messages. Send files to xx@yy

	511 This SAFT-server can only receive files.

	520 User unkown.

	521 User is not allowed to receive files or messages.

	522 User cannot receive messages.

	523 You are not allowed to send to this user.

	530 User cannot receive messages.

	531 This file has been already received.

	599 Unknown error.

 Nur die aus 3  Ziffern bestehende Replycodes sind fest vergeben, die Texte dahinter kn-
nen beliebig verndert werden, solange sie weiterhin dem Sinn der Meldung entsprechen. 
Ausnahmen hiervon sind die Texte zu den Replycodes 220 und 230:  bei 220 mu der  
String , SAFT " enthalten sein und bei 230 mu das erste Wort im Text die Anzahl der 
bereits bertragenen Bytes sein.

1.3.1  Beispiele

Beispiele einer SAFT-Session anhand eines direkten telnet Zugriffs auf den Serverport 
(fett gedruckte Textteile sind Benutzereingaben):



> telnet linux saft

Trying 129.69.58.50...

Connected to linux.rus.uni-stuttgart.de.

Escape character is '^]'.

220 linux SAFT server (sendfiled 1.4 on Linux) ready.

FROM gaga

200 Command ok.

TO framstag

200 Command ok.

FILE blubb

200 Command ok.

SIZE 5 5

200 Command ok.

DATA

302 Header ok, send data.

ABC

201 File has been correctly received.

QUIT

221 Goodbye.

Connection closed by foreign host.

> telnet linux saft

Trying 129.69.58.50...

Connected to linux.rus.uni-stuttgart.de.

Escape character is '^]'.

220 linux SAFT server (sendfiled 1.4 on Linux) ready.

HELP

214-The following commands are recognized:

214-  FROM <sender> [<real name>] [<pgp signature>]

214-  TO <recipient>

214-  FILE <name>

214-  SIZE <size to transfer> <size uncompressed>

214-  TYPE BINARY|SOURCE|TEXT [COMPRESSED]

214-  DATE <ISO-8601 date string>

214-  CHARSET <RFC-1345 character set name>

214-  ATTR TAR|EXE|NONE

214-  MSG <message>

214-  DEL

214-  RESEND

214-  DATA

214-  QUIT

214-All argument strings have to be UTF-7 encoded.

214 You must specify at least FROM, TO, FILE, SIZE and DATA to send a file.

FROM gaga

200 Command ok.

TO dengibtsnicht

520 User unkown.

TO framstag

200 Command ok.

MSG huhu!

530 User cannot receive messages.

TYPE TEXT

200 Command ok.

FILE x1

200 Command ok.

SIZE 6 6

200 Command ok.

abcd

500 Syntax error, command unrecognized.

DATA

302 Header ok, send data.

abcd

201 File has been correctly received.

FILE x2

200 Command ok.

SIZE 3 3

200 Command ok.

SIZE 5 5

200 Command ok.

DATA

302 Header ok, send data.

123

201 File has been correctly received.

QUIT

221 Goodbye.

Connection closed by foreign host.

Eine Anmerkung zur anscheinenden Diskrepanz bei SIZE und DATA: telnet bertrgt 
eine Zeile mit CR LF als EOL-Markierung. Diese Bytes zhlen natrlich mit.

1.3.2  Begrndung des Protokolldesigns

Die Ablehnung von SIFT/UFT wurde bereits weiter oben besprochen. Als weitere bereits 
existierende Alternativen wurden untersucht:

	http		
Das Hyper Text Transfer Protocol [12] ist zu sehr spezialisiert auf Dokumente mit 
,festem Platz". Es geht davon aus, da Dateien immer unter derselben Adresse anzu-
finden sind. Auerdem kann man mit der derzeitigen http Spezifikation Dateien nur 
holen, nicht aber verschicken.

	fsp		
Das File Service Protocol kennt nur einen anonymous User und keine realen Benutzer 
als Adressaten. Zudem benutzt es udp als Transportmedium, was es zwar sehr sicher 
gegenber Netzproblemen aber auch recht langsam macht.

	smtp mit MIME		
Das Simple Mail Transport Protocol mit Multipurpose Internet Mail Extensions [11] 
[16] [17] ist zwar das flexibelste Transportprotokoll fr Dokumente aller Art, aber lei-
der auch eins der ineffektivsten was den Datendurchsatz angeht und Aufgrund der 7 
bit Restriktion von smtp am schwersten zu implementieren. Dies verdeutlicht die Tat-
sache, da es selbst Jahre nach der Einfhrung von MIME noch keinen brauchbaren 
freien MUA fr Unix oder VMS gibt.

Als groe Probleme stellten sich die Wahl des Zeichensatzes fr Textdateien und das For-
mat der Dateinamen heraus. Fr beide liessen sich keine gemeinsame Basis finden, die 
allen Betriebssystemen im Internet gerecht werden wrde.

Der einzige Zeichensatz, der eine echte Obermenge aller anderen Zeichenstze ist, ist 
ISO-10646 aka Unicode [9] [10] [19]. Unicode basiert aber auf 16 bit breiten Zeichen und 
hat noch keine nennenswerte Verbreitung gefunden. Deshalb erlaubt SAFT die Verwen-
dung eines beliebigen in RFC 1345 definierten Zeichensatzes und berlt die korrekte 
Konvertierung der Empfngerseite. Empfohlen wird jedoch die Verwendung von ISO-
8859-1 aka ISO Latin 1 [14], da dies von der Anzahl der Benutzer und installierten 
Systeme her fhrend ist.

Beim Format des Dateinamens stellt sich ein hnliches Dilemma. Stellvertretend seien 
hier einige verbreitete Betriebssysteme bzw. Filesysteme genannt:

	DOS		
8+3 Zeichen; alle Zeichen bis auf . und \

	VM und MVS		
8+8 Zeichen; A..Z 0..9

	VMS/RMS	 
39+39 Zeichen; A..Z 0..9 $ _ - ; $ - nicht am Anfang; Versionsnummern

	Unix < SysV 4.0		
14 Zeichen; alle Zeichen bis auf ASCII(0) und /

	Unix >= SysV 4.0 und BSD		
255 Zeichen; alle Zeichen bis auf ASCII(0) und /

	Windows NT		
255 Zeichen; alle Unicodezeichen (?)

Ein kleinster gemeinsamer Nenner lie sich hier nicht bilden. Deshalb erlaubt SAFT 
bei Dateinamen die Verwendung von Unicodezeichen und beliebige Lnge. Der Client 
kann aber nicht sicher sein, da der Dateiname auf dem Empfngersystem verarbeitet 
werden kann. Deshalb sollten bei Unkenntnis der Mglichkeiten des Empfngersy-
stems eher konservative Werte benutzt werden.

Der Flaschenhals bei praktisch jeder Kommunikation im Internet stellt die zur Verf-
gung stehende Bandbreite dar. Deshalb kann SAFT Dateien mittels gzip Algorithmus 
komprimiert bertragen. gzip wurde ausgewhlt, weil es

	lizenzfrei ist (GNU Copyleft)

	sehr gute Kompressionsraten liefert

	auf praktisch allen Betriebssystemen verfgbar ist

	einen Quasistandard im Internet darstellt

Viele Betriebssysteme bieten weitere Dateiattribute, als die von SAFT abgedeckten 
an. Diese Attribute sind aber Filesystem-proprietr und nicht zwischen verschiedenen 
Betriebssystemen konvertierbar. VMS/RMS kann z.B. nichts mit dem Hidden-bit von 
DOS/FAT anfangen, whrend wiederum auf allen anderen Betriebssystemen die FDL 
von VMS/RMS keinen Sinn macht.

Deshalb wurde das ATTR Kommando eingefhrt, welches nur fr das jeweilige 
Betriebssystem von Relevanz ist. Jeder Autor einer neuen SAFT Implementation kann 
das ATTR Kommando fr sein Betriebssystem erweitern, indem er neue Parameter 
einfhrt (siehe Kapitel sendfile weiter unten). Er sollte dies jedoch dokumentieren und 
dem Autor von SAFT zwecks Koordination melden.

Die Verwendung von MIME [16] [17] zur Spezifizierung von Dateiattributen wurde 
verworfen, weil MIME Dokumente beschreibt, die visualisiert werden sollen. Hierbei 
wird der Inhalt einer Datei meist einer nicht reversiblen Transformation unterworfen, 
was in Hinblick auf die eigentliche Aufgabenstellung nicht wnschenswert ist.

2  sendfile: eine SAFT Referenzimplementation fr Unix

Das sendfile Paket ist eine Umsetzung des SAFT Protokolls fr Unix-Systeme und umfat 
die Teile:

	sendfiled		
der sendfile daemon, ein SAFT-Server 

	sendfile		
ein SAFT-Client zum Verschicken von Dateien

	sendmsg		
ein SAFT-Client zum Verschicken von Nachrichten

	receive		
ein Client, der bereits empfangene Dateien aus dem lokalen Spool abholt

	Utilities: 

- check_sendfile: informiert beim login auf files im sendfile-Spool

- sf_cleanup: rumt alte Files aus dem Spool

	Dokumentation:

- man-pages: Hilfetexte im Standard-Unix-Format

- LIESMICHe bzw. READMEs: Kurze Hilfetext fr schnelle Information

- doku.ps bzw. doc.ps: dieses Dokument

Der sendfile-Client ist ein Userprogramm, das Dateien an den sendfiled verschickt, wel-
cher sich auf demselben Host befinden kann oder sonst irgendwo im Internet. Der sendfi-
led nimmt die Dateien entgegen, legt sie im Spoolbereich ab und informiert den 
Empfnger mit einer Nachricht, die direkt auf sein Terminal geschrieben wird. Der Emp-
fnger kann sich dann die Dateien mittels des receive-Clients in sein Directory kopieren, 
wobei das Original im Spool gelscht wird. Der sendmsg-Client ist ein Userprogramm, 
das einzeilige Textnachrichten an den sendfiled verschickt, welcher sie dann direkt auf das 
Terminal des Empfngers schreibt.

Das sendfile-Paket setzt voraus, da die Programme gzip, tar und GNU-recode (letzteres 
optional) bereits installiert sind und zur Installation der gcc-Compiler vorhanden ist. Ver-
wendete Programmierstandards sind ANSI-C, POSIX 1003.1 und BSD sockets.

2.1  Programmbeschreibung

2.1.1  sendfiled

Der sendfiled mu nur einmal installiert werden (siehe weiter unten) und luft dann ohne 
weitere direkte Benutzeraktion, da er automatisch vom inetd gestartet wird. Er verhlt sich 
damit analog zu einem ftpd.

sendfiled legt ankommende Dateien im Spool-Directory des Empfngers ab und gibt 
ankommende Nachrichten (messages) auf den tty des Empfngers aus, sofern dies 
nicht durch die Konfigurationsdateien verboten wurde (siehe weiter unten).

Das Spoolverzeichnis ist normalerweise /var/spool/sendfile/username (sofoern beim 
installieren nicht anders spezifiziert).

Zum sendfiled gehren zwei Konfigurationsdateien: nosendfile und sendfile.cf, die 
normalerweise in /usr/local/etc/ liegen. 

In nosendfile knnen lokale Benutzer eingetragen werden, die keine Dateien oder 
Nachrichten erhalten sollen, also vom SAFT-Service ausgeschlossen werden sollen. 
dies sind normalerweise Pseudo-User wie ftp, news, admin, root, nobody, lpd, etc. 

Steht in nosendfile in der ersten Zeile allow-only,bewirkt dies, da jetzt nur noch 
die nachfolgend aufgefhrten Benutzer Dateien oder Nachrichten empfangen knnen.

In sendfile.cf stehen Optionen, die das genau Verhalten des sendfiled steuern und die 
jederzeit gendert werden knnen. Die Bezeichnungen sind im wesentlichen Selbster-
klrend. Hier ein Beispiel:



# sendfile configuration file



# ring the gong when a message arrives (on/off)

bell = on



# maximum allowed files to receive per user

maxfiles = 200



# maximum total disk space quota for spool in MB

# (WARNING! Defining this option will sendfile slow down!)

# maxspool = 100



# minimum free disk space for spool partition in MB

minfree = 10



# accept only messages or files

# acceptonly = messages



# address of your generic SAFT-server (for NFS)

# saftserver = saft.banana.net



# notify by message, mail, both or none

notification = message



# keep spool files at least xx days, then delete them (0=infinity)

keep = 0



# delete aborted or corrupted spool files after xx days (0=never)

deljunk = 10



maxspool beschrnkt die maximale Anzahl an belegten MBs im Spool (total), wrend 
minfree ein Minimum an freien MBs in der Spool Partition garantiert. Die Unterschei-
dung ist deshalb sinnvoll, weil der Spool nicht in einer eigenen Partition sein mu, son-
dern nur ein Directory-Baum innerhalb einer Partition sein kann, die auch noch anderen 
Zwecken dient.

Die Optionen keep und deljunk werden durch den Aufruf von receive oder durch 
ankommende Files ber sendfiled getriggert. Um sicher zu gehen, da auch alte Files von 
allen Usern gelscht werden, gibt es das Programm sf_cleanup. Dies kann bei Bedarf 
gestartet werden (einmal pro Woche oder so).

Mit NFS tut sich sendfile etwas schwer, weil NFS keinerlei Locking-Mechanismus besitzt 
und es so zu Race Conditions und Datenkorruption kommen kann, wenn auf den sendfile-
spool via NFS zugegriffen wird (wenn /var/spool/sendfile via NFS gemountet wird). Mit 
folgendem Workaround funktioniert sendfile aber auch in einer NFS-Umgebung:

	Auf NFS-Clients in sendfile.cf eintragen:

acceptonly = messages

saftserver = nfs.server.host.name

	Auf dem NFS-Server in sendfile.cf eintragen:

notification = mail

Wenn jetzt versucht wird, an einen NFS-Client ein File zu schicken, kommt folgende Feh-
lermeldung (Beispiel):

$ sendfile LIESMICH framstag@moep.bb.bawue.de

%sendfile-F, server error: For sending files use: 
framstag@syssrv.bb.bawue.de

Messages knnen trotzdem weiterhin verschickt werden.

In beiden Konfigurationsdateien dient ein # als Kommentarzeichen, d.h. alles inklusive 
diesem Zeichen bis Zeilenende wird ignoriert.

Als Unix-betriebssystemspezifische Erweiterung des SAFT-Protokolls wurden die Attri-
but TAR und EXE eingefhrt. TAR erlaubt alle Unix-Fileattribute mit zu bertragen. Hat 
eine Datei das tar-Attribut, so handelt es sich um ein tar-Archiv nach POSIX 1003 und 
diese wird vom receive-Client dann entsprechend behandelt. EXE sagt aus, da die ber-
tragene Datei ein ausfhrbares Programm (z.B. executable oder Shell-Script) ist. Der 
receive-Client setzt dann die korrekte Protection. Alle POSIX kompatiblen Betriebssy-
steme, wie z.B. VMS und Windows NT, knnen auch diese erweiterte Attribute berneh-
men, sollte fr diese Systeme eine SAFT-Implementation realisiert werden.

2.1.2  sendfile

Der sendfile-Client ist ein Userprogramm, das Dateien an den Empfnger verschickt. Der 
Aufruf von sendfile -h ergibt die Ausgabe:

usage: sendfile [-stuvd] file-name [...] user[@host]

 or: sendfile [-uva] archive-name file/directory-name [...] user[@host]

 -s send file(s) in source mode

 -t send file(s) in text mode

 -u send file(s) uncompressed

 -v verbose mode

 -a send file(s) as one archive

 -d  delete previous sent file(s)

 ( default mode: send file(s) in binary mode and compressed )

example: sendfile rabbit.gif beate@juhu.lake.de



Im einfachsten Fall reicht die Zeile (Beispiel) 

sendfile bdsm.txt andrea 

um die Datei bdsm.txt an den lokalen Benutzer andrea zu schicken.

sendfile verschickt dann die Datei binr, d.h. ohne jede Vernderung, und komprimiert 
(Falls es sich um eine komprimierbare Datei handelt).. Die Anzahl der bertragenen 
Bytes wird immer angezeigt. Es knnen aber auch die folgenden Optionen angegeben 
werden:

-s	behandelt die zu verschickende Datei als Programm Sourcecode. Dies ist nur 
notwendig, wenn das Empfngersystem kein Unix ist.

-t	behandelt die zu verschickende Datei als Text. Beim Textmodus werden 
Umlaute und andere Sonderzeichen korrekt gewandelt. Dies ist nur notwendig, 
wenn das Empfngersystem kein Unix ist.

-u	verschickt unkomprimiert. Default ist komprimierte bertragung. Dies sollte 
nur dann verwendet werden, wenn sich Sender und Empfnger auf dem selben 
Host befinden. Komprimierte bertragung ist ein wesentliches Mittel zur Reduk-
tion von Netzlast.

-v	gibt alle SAFT-Meldungen mit aus (verbose mode). Dies dient zur Lokalisa-
tion von Protokollfehlern oder zur Befriedigung der Neugier (,Was geht denn da 
ab?").

-a	schickt mehrere Dateien oder ganze Verzeichnisbume als ein Archiv. Das 
erste Argument nach -a gibt den Namen des Archivs an. Diese Option ist nur gl-
tig, wenn das Empfngersystem ebenfalls ein Unix ist.

-d	lscht eine vorher verschickte Datei auf dem Serversystem, vorausgesetzt, es 
befindet sich dort noch im Spool.

Die Optionen -s -t, -d und -a schlieen sich jeweils gegenseitig aus.

Als user-Name darf auch ein elm-Alias verwendet werden, wenn kein sendfile-Alias 
(siehe weiter unten) gleichen Namens vorhanden ist und der elm-Alias auf eine echte 
Internet-Adresse zeigt.

Weitere Beispiele:

sendfile -s *.pas uranus@bigvax.inka.de

sendfile -va C-Projekt sendfile doku.ps uwe

2.1.3  sendmsg

Der sendmsg-Client ist ein Userprogramm, das einzeilige Textnachrichten an den sendfi-
led verschickt, welcher sie dann direkt auf das Terminal des Empfngers schreibt.

Der Aufruf von sendmsg -h ergibt den Output:

usage: sendmsg [-v] user@host

or: sendmsg [-mM]

options: -v verbose mode

         -m receive messages only on this tty (default)

         -M receive messages on other ttys, too

example: sendmsg orakel@main01.bb.bawue.de



sendmsg verlangt nach Aufruf, die zu bertragende Nachricht einzugeben.

Als user-Name darf auch ein elm-Alias verwendet werden.

Beispiel:

sendmsg framstag@moep.bb.bawue.de

message: geiles Programm, das sendfile!



Ankommende Nachrichten werden normalerweise (sofern via Konfigurationsdatei nicht 
anders geregelt) auf allen ttys des Empfngers ausgegeben. Wird der Empfnger selbst 
zum Sender, indem er sendmsg aufruft (z.B. mit sendmsg -m), so werden ab sofort Messa-
ges nur noch auf diesem tty ausgegeben.

2.1.4  receive

Der Empfnger kann sich die Dateien mittels des receive-Clients in sein Directory kopie-
ren, wobei das Original im Spool gelscht wird.

Der Aufruf von receive -h ergibt den Output:

usage: receive [-d] file-name

   or: receive -n [-dr] file-number

   or: receive [-l] [-L]

   or: receive -a [-dr]

options: -l  short list of files

         -L  full list of files

         -n  specify a file number

         -a  specify all files

         -d  delete

         -r  rename file when receiving

examples: receive -a      ! receive all files

          receive -n 1    ! receive file with number 1

          receive blubb   ! receive file with name blubb

Im einfachsten Fall gibt der Benutzer an (Beispiel): 

receive blubb.txt

%receive-I, blubb.txt received

Dies kopiert die Datei blubb.txt ins aktuelle Directory und lscht sie aus dem Spool.

Weitere Optionen sind:

-d	lscht die Datei ohne sie vorher zu kopieren

-n	anstelle des Dateinamens wird seine Spoolnummer verwendet

-a	alle Dateien abholen bzw. lschen

-l	auflisten der Dateien

-L	auflisten der Dateien und Inhalt der Archive mit ausgeben

-r	umbenennen der Datei beim abholen

Weitere Beispiele:

receive -l

From zrxh0370@baracke.rus.uni-stuttgart.de (Ulli Horlacher)

 1) 10-Aug-1995 15:41:24      3 KB  LIESMICH

 2) 10-Aug-1995 15:41:37     30 KB  doku.txt

 3) 11-Aug-1995 16:12:09    113 KB  Sourcen (archive)



receive -n 1

LIESMICH already exists. Overwrite it (yYnN)? y

%receive-I, LIESMICH received



receive -d Sourcen

%receive-I, Sourcen deleted

Existiert eine Datei gleichen Namens bereits, so fragt receive nach, ob es sie ber-
schreiben soll. Ist die Eingabe Y oder N oder so werden bei anderen Dateien keine 
weiteren Fragen gestellt, sondern diese einfach berschrieben bzw. bergangen. Bei y 
oder n wird jedesmal neu nachgefragt.

Der Dateiname darf auch * oder ? als Wildcard-Zeichen enthalten, allerdings ist durch 
Einschliessung in '' Quote-Zeichen dafr zu sorgen, da die Shell die Metazeichen * 
und ? nicht vorher selber interpretiert.

Enthlt eine Datei besondere Zeichen, wie Unicodezeichen, Controlcodes oder Shell-
metazeichen, so frgt receive nach, in welchem Format der Dateiname abgespeichert 
werden soll.

Beispiel:

receive 'gaga*'

The next file name contains characters which may cause problems with 
your shell or may do strange things with your terminal.

These characters have been substituted with '_'.

(c)omplete file name with control code characters is not displayable

(n)ormal file name: >gaga blubb<

(s)hell file name: >gaga_blubb<

Select one of c n s (or C N S for no more questions): n

gaga blubb already exists. Overwrite it (yYnN)? y

%receive-I, gaga blubb received

Wenn Dateien bereits aus dem Spool gelscht worden sind, besteht trotzdem noch eine 
Mglichkeit herauszubekommen, wer was geschickt hatte. Mit 

more /var/spool/sendfile/$LOGNAME/log 

lt sich die sendfile-Protokolldatei anschauen.

2.2  Benutzerkonfigurationsdateien

Sowohl sendfile als auch sendmsg greifen auf diverse benutzerspezifische Konfigurations-
dateien zurck, die alle unter /var/spool/sendfile/username/config/ liegen. Diese Dateien 
werden per default vom sendfiled angelegt, sobald der entsprechende Benutzer zum ersten 
mal etwas empfangen sollen. Ihre Erzeugung kann also z.B. mit: sendmsg $LOGNAME 
erzwungen werden.

Es handelt sich bei diesen Konfigurationsdateien um:

	config

Hier knnen die globale Konfigurationsoptionen bell und notification (aus /usr/local/
etc/sendfile.cf) berschrieben werden:

  bell = on                        # Bimmel an

  bell = off                       # Bimmel aus

  notification = none              # keine Benachrichtigung fuer Files

  notification = message           # Benachrichtigung via msg

  notification = mail              # Benachrichtigung via mail

  notification = both              # Benachrichtigung via mail und msg

  notification = mail blubber@blah # Benachrichtigung via mail an ...



	aliases

Hierbei handelt es sich um ein Aliasfile, in dem oft benutzte Adressen abgekrzt wer-
den knnen. Das Format ist:

	alias address

Beispiel:

chief grmblfz@bigvax.somewhere.net

beate beate@juhu.lake.de



	restrictions

Hier drin stehen Adressen, von denen man keine Dateien oder Nachrichten bekom-
men mchte. Das Format ist:

	user@host [mfb]

Dabei steht m fr Message, f fr File und b fr both. Beispiele:



gates@microsoft.com b

*aol.com m



	msg

Hier drin steht der Name des tty auf das ankommende Nachrichten ausgegeben 
werden sollen. Wird automatisch von sendmsg gesetzt.

2.3  Installation

Es wird vorausgesetzt, da grundlegende Kenntnisse der Administration einer vernet-
zen Unix-Workstation vorhanden sind. Diese hier zu erklren, wrden bei weitem den 
Rahmen der  Dokumentation sprengen.

1.	Pfade anpassen:

Bei Bedarf knnen in config.h (und NUR da!) Default-Werte fr bestimmte Pfade 
gendert werden. Dies sind:



#define BINDIR 		"/usr/local/bin"

#define MANDIR 		"/usr/local/man/man1"

#define SERVERDIR 	"/usr/local/sbin"



#define SPOOL 		"/var/spool/sendfile"

#define NOSENDFILE 		"/usr/local/etc/nosendfile"

#define CONFIG 		"/usr/local/etc/sendfile.cf"



Bei den ersten drei Werten handelt es sich Verzeichnis, in die sendfile installiert 
wird, bei den letzten drei um den Ort des Spool bzw. der Systemkonfigurationsda-
teien.



2.	Laufzeit-Konfiguration anpassen:

Der sendfiled wertet zur Laufzeit die Systemkonfigurationsdatei sendfile.cf aus 
(wird normalerweise nach /usr/local/etc/ kopiert, siehe oben). Dies kann entweder 
jetzt oder zu jedem spteren Zeitpunkt gendert werden, falls Bedarf besteht.



3.	alles compilieren: 

	make 

Es drfen keine Fehlermeldungen auftreten. Auf manchen Systemen mit fehlerhaf-
ten System-Include-Files kann es zu Warnings kommen, die aber ignoriert werden 
knnen. Sendfile wurde bisher getestet unter AIX, BSDI, Convex-OS, Digital 
Unix, FreeBSD, HP-UX, IRIX, Linux, NeXTstep/Mach, OSF/1, SunOS 4, SunOS 
5 (Solaris 2) und Ultrix mit gcc 2.5.8.

Ultrix-ACHTUNG!  Bei Ultrix muss vor ,make all" noch ,sh5 genmake" einge-
geben werden (weil Ultrix-sh buggy ist)!





4.	alles automatisch installieren (muss root machen!):

	make install



oder von Hand installieren:

- korrekte Fileprotection einstellen:

	umask 022



- sendfiled hinkopieren, wo es Sinn macht, zB /usr/local/sbin, /usr/etc :

	cp sendfiled /usr/local/sbin/



- spool-directory anlegen (wie in config.h angegeben!):

	mkdir /var/spool/sendfile

	chmod 755 /var/spool/sendfile



 - Eintragung in /etc/services (bzw mit ,niload services ." bei NeXT):

 	saft 487/tcp # simple asychronous file transfer



 - Eintragung in /etc/inetd.conf:

 	saft stream tcp nowait root /wo/auch/immer/sendfiled

 

- inetd neu starten:

	kill -HUP <pid des inetd>

	/usr/sbin/inetd #(oder wo auch immer der inetd liegt)

 

- Userbeschrnkung aktivieren (wie in config.h angegeben!):

 	cp nosendfile /etc

 

- man-pages installieren:

	cp sendmsg.1 sendfile.1 receive.1 /usr/man/man1



- notify-script installieren:

	$ cp check_sendfile /usr/local/bin

/usr/local/bin/check_sendfile in /etc/profile aufnehmen



- Clients installieren:

	cp sendfile sendmsg receive /usr/local/bin



5.	testen:

	sendfile LIESMICH $LOGNAME

	receive -l

	receive -n 1



6.	Ich bin sehr an Kommentaren und Bugreports interessiert. Geschenke via Post 
schicken. :-)

7.	Wer mir die Adresse seines neu installierten SAFT-Servers mitteilt, bekommt zur 
Belohnung ein schnes gif zugeschickt. :-)

8.	Es gibt eine Mailingliste, die ich von Hand fhre und in der Ankndigungen zu 
updates und bugfixes geposted werden. Wer da aufgenommen werden mchte, 
sende mail an mich.

2.4  Sourcen

Das sendfile Paket besteht aus (Module und darin enthaltene Funktionen):

	sendfile.c - Das sendfile Hauptmodul.

usage : print short help usage text 

whereis : search for program name in PATH 

send_data : send file data

clean_up: delete tmp-file

	sendfiled.c - Das sendfiled Hauptmodul.

getline : get a command line 

writeheader : write one line to header spool file 

msg2tty : write a message to all ttys of the user 

mail2user : send a mail to the recipient

spoolid : get the next spool id number 

restricted : check killfile

wlock_file : write-lock a file

tlock_file : test the lock status of a file

	sendmsg.c - Das sendmsg Hauptmodul.

usage : print short help usage text 

	receive.c - Das receive Hauptmodul.

usage : print short help usage text 

receive_sf : receive a spool file 

list : list all spool files 

crlf2lf : translate NVT format file to Unix text format file 

fcopy : copy a file 

spawn : spawn a subprocess and direct output to a file

	spool.c spool.h - Funktionen zum lesen und schreiben von Spoolfiles

out : send string conforming to NVT standard

scanspool : scan the spool directory and create structure lists 

delete_sf : delete a spool file 

	reply.c reply.h - reply-codes fr sendfiled.

reply: send string conforming to NVT standard

	string.c string.h - Erweiterte Stringfunktionen.

str_trim : trim white spaces 

str_toupper : transform string to upper case 

str_tolower : transform string to lower case 

strins : insert one string in another 

simplematch : match a simple pattern 

	utf7.c utf7.h - UTF-7 und Unicode Kodierungsroutinen.

utf2iso : UTF-7 to ISO Latin-1 decoding 

iso2utf : ISO Latin-1 to UTF-7 encoding 

iso2uni : transform ISO Latin-1 to Unicode 

add_char : add a char depending on its range 

decode_mbase64 : decode mbase64 string to Unicode 

encode_mbase64 : encode Unicode pstring to mbase64 

	pstring.c pstring.h - Routinen zum Umgang mit Pascalhnliche Strings.

pstr_create : create a pstring

pstr_delete : delete a pstring 

pstr_addchar : add a char to a pstring 

pstr_assign : assign one pstring to another 

pstr_addstring : add a string to a pstring 

pstr_print : print a pstring 

	message.c message.h - VMS-like Informations und Fehlermeldungsroutine.

message : print information, warning and error messages on stderr 

	peername.c peername.h - Funktion zur Erkennung des aufrufenden Host ber stdin.

peername : returns the peername of the connecting host on stdin 

	io.c io.h - Socket read und write Funktionen.

readn : read n bytes from network socket 

writen : write n bytes to network socket 

	net.c net.h - Verschiedener Netzwerkkram.

open_connection : open socket and connect to client 

sock_getline : get a line from the network socket 

sock_putline : send a line to the network socket 

getreply : get the reply on a command from the server 

sendheader : send a headerline and check the reply code 

	destination.c destination.h - Bestimmung des Empfngers

destination: parsen von elm-aliasen und hostname-Daten.

	config.h - Verschiedene Preprozessordefinitionen.

	bsd.h - Das blde AIX hat keine eigenen include-Files fr sockets.

	genmake - Shellscript zur Bestimmung des Betriebsystems und zur Generierung 
des Makefiles.

	check_sendfile - Shellscript um zu berprfen, ob Dateien im Spool vorliegen. 
Sollte von /etc/profile aufgerufen werden.

	sf_cleanup - Shellscript zum lschen alter Files aus dem Spool.

	install - automagic install-script

	nosendfile - Liste aller Benutzer, die vom SAFT-Dienst ausgeschlossen sind.

	sendfile.cf - sendfile-Systemkonfigurationsfile.

	LIESMICH - Eine deutsche Installationsschnellhilfe.

	LIESMICH.auch - Kurzbeschreibung von sendfile/SAFT

	README - a quick installation guide

	README.too - a short description of sendfile/SAFT

	HISTORY - last changes

	sendmsg.1 - Man-page fr sendmsg.

	sendfile.1 - Man-page fr sendfile.

	receive.1 - Man-page fr receive.

	doku.ps - Diese Dokumentation hier.

	doc.ps - this documentation

2.4.1  Aufrufdiagramm

Modulbersicht 

2.4.2  Datenstrukturen

Von den Programm-Datenstrukturen, die implementiert wurden, sind 3 von Interesse 
(bei den restlichen handelt es sich um Standard C Typen wie int, char *, etc):

	pstring - Strings mit Lngeninformationen (von Pascal abgeleitet).

Die pstrings sind notwendig, um Unicode-Strings zu verarbeiten, welche 
ASCII(0) Zeichen enthalten knnen. Die normalen C-Strings vom Typ char* 
behandeln ASCII(0) als Ende des Strings und sind somit fr Unicode unbrauchbar.

In Anlehnung an Pascal wurden die pstrings implementiert, deren Lnge nicht 
durch ein Terminalzeichen definiert wird, sondern ber extra Struktureintrge.

Die pstrings haben folgende Struktur:





struct {

	int size;	/* absolute Lnge */

	int length;	/* belegte string-Lnge */

	char *string;	/* der String selber ohne Terminierungssymbol */

}



size ist dabei die Speicherkapazitt des pstrings, whrend length die tatsch-
lich belegte Lnge ist.

In *string steht der eigentlich Textstring.

Per Definition beginnt der Inhalt des pstring mit string[1] und nicht wie sonst 
blich in C mit string[0]. Dies hat zwar zur Folge, da pro pstring ein Byte ver-
schwendet wird, aber es hat gleichzeitig den Vorteil, leichter mit den Lngenange-
ben rechnen zu knnen.

In string.c sind die pstring-Funktionen definiert, die im Zusammenhang mit den 
Unicode-Strings im sendfile-Paket bentigt werden.



	filelist - Eine einfach verkettete Liste zum Speichern der Dateiattribute und deren  
Absender.

Pro Absender existiert eine Liste, pro Datei wird ein Listenelement angelegt, 
wobei die Liste nach dem Empfangsdatum aufwrts geordnet ist, d.h. die zuerst 
empfangene Datei wird als erstes Listenelement gespeichert.

Ein filelist-Element hat folgende Struktur:

struct filelist {

	int 

	id, 		/* id number */

	osize, 		/* original size */

	csize, 		/* compressed size */

	tsize, 		/* transfered size */

	flags; 		/* binary,source,text,compress and tar flag */

	char 

	rdate[30], 		/* receiving date */

	date[30], 		/* file date */

	charset[30], 		/* character set name */

	fname[MAXLEN]; 		/* UTF-7 file name */

	struct filelist *next; 		/* next list element */

};



id ist die eindeutige Dateinummer im Spool. Siehe dazu weiter unten.

osize ist die Originalgre der Datei ohne Kompression.

csize ist die Gre der Datei, wie sie (komprimiert) bertragen wird.

tsize ist die tatschlich Anzahl der bertragenen Bytes.

flags sind die Dateiattribute fr SOURCE, TEXT, COMPRESS und TAR.

rdate ist das Empfangsdatum.

date ist das Originaldatum der Datei, wie sie der Sender mit angibt.

charset ist der Name des Zeichensatzattributs.

fname ist der Dateiname, UTF-7 codiert.

*next ist der Zeiger um die Liste zu verketten.



Die Definition von filelist und den Flags befindet sich in spool.h.



	senderlist - Eine einfach verkettete Liste zum Speichern der Absender und der filelists.

Im Gegensatz zu den filelists existiert nur eine senderlist. Pro Absender wird ein 
Listenelement angelegt. 

Ein senderlist-Element hat folgende Struktur:

struct senderlist {

	char 

	from[MAXLEN],		/* sender */

	sig[MAXLEN];		/* authentification signature */

	struct filelist *flist; 	/* list of files */

	struct senderlist *next;	/* next list element */

};



from ist der Name des Absenders, UTF-7 codiert.

*flist ist der Zeiger auf die dazugehrige filelist.

*next ist der Zeiger auf das nchste Listenelement.



Die senderlist und filelists ergeben also zusammen folgende Struktur::

Diese Datenstruktur wird jedesmal neu erzeugt, wenn Informationen ber Spoolfi-
les bentigt werden. Diese verketteten Listen knnen in einem C Programm 
wesentlich einfacher ausgewertet werden, als da fr jede Information das betref-
fende Spoolheaderfile explizit ausgelesen wird



Der Spool selber wird in /var/spool/sendfile angelegt, wo jeder Empfn-
ger bei Bedarf, d.h. wenn zum ersten mal eine Datei fr ihn empfangen wird, auto-
matisch ein eigenes Spoolverzeichnis bekommt (im Source als userspool 
bezeichnet).

Im userspool befinden sich fr jede empfangene Datei zwei Spoolfiles: das 
Spoolheaderfile und das Spooldatafile. Im Spoolheaderfile sind alle Dateiattribute 
eingetragen, die der Sender bermittelt hat, im Spooldatafile ist die Datei selbst als 
Bytestrom abgelegt, so wie sie bertragen wurde.Weiterhin befindet sich in die-
sem Directory das sogenannte log-File, in dem alle bertragungen protokolliert 
werden.

Beispiel eines userspool:



baracke:~/sendfile> ll /var/spool/sendfile/zrxh0370/

-rw-------   1 zrxh0370 system     1176 Sep 13 18:03    1.d

-rw-------   1 zrxh0370 system      137 Sep 13 18:03    1.h

-rw-------   1 zrxh0370 system      994 Sep 13 18:03    2.d

-rw-------   1 zrxh0370 system      136 Sep 13 18:03    2.h

-rw-------   1 zrxh0370 system     5178 Sep 13 18:03    log



baracke:~/sendfile> cat /var/spool/sendfile/zrxh0370/1.h

FROM	gaga@linux.rus.uni-stuttgart.de 

FILE	blubb.txt

TYPE	TEXT

SIZE	5 5

DATE	1995-09-14 12:38:06

CHARSET	ISO_8859-1:1987



3  Danksagungen

Mein besonderer Dank geht an:

	Lorenz Adena - fr Featurewnsche und Betatesting

	Thomas Beisel - fr C Beratung, Postscripthexerei  und Betatesting

	Uwe Berger - fr Grundsatzdiskussion und Designhilfen

	Beate Herrmann - fr grundlegende Ideen, psychologische Betreuung und Betatesting

	Andreas Ley - fr jede Menge Hilfe bei obskuren C Problemen und fr die peername 
Funktion

	Shannon Miller - for his corrections to my english documentation

	Uwe Obermller - fr viele Vorschlge und Betatesting

	Bernd Onasch - fr C Beratung

	Ingo Wilken - fr die simplematch Funktion

ohne deren Hilfe die Realisation dieses Projekts unmglich gewesen wre.

4  Informationsverzeichnis

[1] Andrew Tanenbaum: Computer Networks

[2] Bettina Reimer, Paul Mller: Kommunikationssysteme auf der Basis des ISO-
Referenzmodells

[3] Kernighan, Ritchie: Programmieren in C

[4] Jrgen Gulbins: UNIX

[5] W. R. Stevens: Advanced Programming in the UNIX Environment

[6] W. R. Stevens: UNIX Network Programming

[7] ISO-8601 - International Time and Date Representing

[8] C-FAQ-list in news.answers

[9] Umlaute-FAQ in de.comp.standards

[10] internationalization/programming-faq in news.answers

[11] mail/mime-faq in news.answers

[12] http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-v10-spec-00.txt

[13] RFC 859 - ftp 

[14] RFC 1345 - Character Mnemonics & Character Sets

[15] RFC 1440 - SIFT/UFT: Sender-Initiated/Unsolicited File Transfer

[16] RFC 1521 - MIME

[17] RFC 1522 - MIME

[18] RFC 1543 - Instructions to RFC Authors

[19] RFC 1641 - Using Unicode with MIME

[20] RFC 1642 - UTF-7

[21] RFC 1700 - Assigned Numbers



Die RFCs sind zu finden unter ftp://ftp.uni-stuttgart.de:/pub/doc/standards/rfc/

Die FAQs sind zu finden unter ftp://ftp.uni-stuttgart.de:/pub/doc/faq/

5  Glossar

	ASCII - American Standard Code of Information Interchange		
7 bit Zeichensatzkodierung der wichtigsten im amerikanischen Sprachraum vorkom-
menden Zeichen. Siehe RFC 1345.

	Bitnet - Because It`s Time Network		
Aussterbendes weltweites Forschungsnetzwerk auf IBM RSCS Technologie. In vielen 
Belangen der Vorgnger zum Internet.

	DOS - Diskette Operating System		
Primitiver Diskettenmonitor und Interrupthandler fr i8088 PCs

	EBCDIC - Extended Binary Coded Decimals Interchange Code	
IBMs Zeichensatz fr ihre Grorechner.

	EOL - End Of Line

	FAT - File Availibility Table		
Filesystem fr DOS.

	FDL - File Definition Languange		
Filesystembeschreibungssprache fr RMS.

	ftp - file transfer protocol/program		
Standardmethode um Dateien zu transferieren (synchron). Siehe RFC 959.

	GNU - GNU`s not Unix	
Ein fortlaufendes Projekt der Free Software Foundation um qualitativ hochwertige 
und lizenzfreie Software im Sourcecode der Internetgemeinde zur Verfgung zu stel-
len.

	MIME - Multipurpose Internet Mail Extensions		
Multimediaerweiterungen fr Mail. Siehe RFC 1341.

	MUA - mail user agent		
Der Mailclient, den der Benutzer direkt verwendet.

	MTA - mail transfer agent		
Der Mailserver (daemon), der vom MUA kontaktiert wird.

	NVT - Network Virtual Terminal	
Remote login im Internet: telnet. Siehe RFC 854.

	RFC - Request for Comment		
Internet Standard und Protokoll Beschreibungen.

	RMS - Record Management System		
Das native Filesystem von VMS.

	tcp/ip - transmission control protocol / internet protocol		
Netzwerk- und Transport-Ebene (ISO Level 3+4) des Internets. Siehe RFC 791/793.

	VMS - Virtual Memory System	Das beste Betriebssystem der Welt von DEC :-)