Das Zeilenende-Problem bei Avanti
Martin Butkus
m.butkus at tu-bs.de
Fr Sep 26 14:44:44 CEST 2003
Liebe Frau Koczian, liebe Liste,
ich habe die Problematik des "\r\r\n"-Zeilenendes inzwischen analysiert,
und hätte gerne Rückmeldungen zu der Lösung, die ich implementieren möchte.
1. Das Zeilenende wurde bislang in den alten Versionen von Avanti-W
und Avanti-X unterschiedlich gehandhabt. Avanti-X verwendete "\n",
Avanti-W "\r\n". [ In den Parameterdateien wurde dagegen der
"ze"-Parameter ausgewertet und unverändert übernommen. ]
Das allein ist schon unschön, weil ein Client ja nicht wissen kann,
ob er mit einem Unix- oder einem Windows-Avanti-Server spricht.
2. Avanti-CL gibt seine Daten über den Standardausgabekanal aus,
der normalerweise im sog. Text-Modus geöffnet ist. Damit wird
automatisch eine Übersetzung \n -> \r\n vorgenommen, und zwar
für *jede* Ausgabe. Entsprechend wird \r\n nach \r\r\n übersetzt,
auf diese Weise kommt das von Frau Koczian geschilderte Problem
zustande.
Eine ähnliche Problematik betrifft übrigens die Standardeingabe und
den Standardfehlerkanal.
[ Die Binär- vs. Textmodus-Problematik ist übrigens uralt, und
verursacht regelmäßig Bauchschmerzen bei allen, die damit zu tun
haben. Das liegt in der Natur der Sache: die Einführung des
Textmodus war ein Hack, der notwendig wurde, als sich Microsoft
dazu entschieden hatte, in DOS "\r\n" als Zeilenende zu verwenden,
statt "\n", wie damals (und unter Unix noch heute) üblich. ]
Sinnvoll wäre es m.E. in jedem Fall, wenn sich Unix- und Windows-Variante
des Servers identisch verhalten würden.
Lösungsvorschlag:
- avanti-cl betreibt alle seine Ein- und Ausgabekanäle nicht im Text-,
sondern im Binärmodus, wo es keinerlei Übersetzung gibt. (Dies ist
auch die einzige unter Unix verfügbare Betriebsart).
Das hätte zur Konsequenz, daß für die "internen" Ausgaben, also
z.B. das Ergebnis eines "list"-Befehls, unter Windows
nicht mehr "\r\n" sondern "\n" als Zeilenende-Marker verwendet wird.
Die Zeilenende-Markierung in den Parameterdateien richtet sich nach
dem "ze"-Parameter, und wird dann unverfälscht übernommen.
- Um mit den "anderen Zeilenenden" konsistent zu bleiben, wäre die
Einstellung "ze = 10" sinnvoll (sowohl unter Unix als auch unter Windows).
- Als "einheitlicher Zeilenendemarker" würde also "\n" gelten.
Vorteil:
- identisches und konsistentes Verhalten des Servers unter Unix und Windows
Nachteil:
- Skripte und Programme, die zwingend ein Zeilenende der Form "\r\n"
erwarten, müssen angepaßt werden.
Solche Programme wären aber sowieso nicht portabel, denn sie würden
schon mit der bisherigen Unix-Version (avanti-x) nicht funktionieren.
Die Webfrontends acphp und acwww sowie das z39.50-Modul müßten
jedenfalls nicht angepaßt werden, eventuell aber manche
selbstentwickelten Skripte.
Ich bitte um Meinungen.
Freundliche Grüße,
Martin Butkus
Mehr Informationen über die Mailingliste Allegro