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