Im BS2000 ist die Länge einer PAM-Datei unabhängig von ihrem Inhalt immer ein ganzzahliges Vielfaches eines PAM-Blocks. Ab BS2000 OSD/BC V10.0 enthält der Katalogeintrag für PAM-Dateien den Eintrag Last Byte Pointer (LBP), in dem die echte Länge der Datei in Bytes hinterlegt werden kann. Dadurch können insbesondere auch Dateien, die auf einem Netzwerkserver (NAS) abgelegt sind, von allen darauf zugreifenden Systemen (auch UNIX) bytegenau gelesen und geschrieben werden.
Diese Funktionalität steht ggf. auch ab BS2000/OSD V8.0 zur Verfügung.
Bisher wurde die Länge einer PAM-Datei mit einer Hilfskonstruktion ermittelt, indem das eigentliche Ende der Datei durch einen speziellen Marker gekennzeichnet wurde. Auf diese Hilfskonstruktion kann bei Nutzung des LBP verzichtet werden.
Von dieser Schnittstelle sind alle C-Laufzeitfunktionen betroffen, die PAM-Dateien öffnen.
Die Funktionen fopen
, fopen64
, freopen
, freopen64
, open
, open64
und creat
, creat64
werden daher um den lbp-Schalter erweitert. Näheres finden Sie in den Beschreibungen der entsprechenden Funktionen.
Beim Öffnen oder Lesen bestehender Dateien verhalten sich diese Funktionen unabhängig vom lbp-Schalter folgendermaßen:
Ist der LBP der Datei ungleich 0, wird er ausgewertet. Ein eventuell vorhandener Marker wird ignoriert.
Ist der LBP = 0, wird nach einem Marker gesucht und die Dateilänge daraus ermittelt. Falls kein Marker gefunden wird, wird das Ende des letzten vollständigen Blocks als Dateiende betrachtet.
Beim Schließen von Dateien, die verändert oder neu erstellt wurden, hängt das Verhalten vom lbp-Schalter beim Öffnen der Datei bzw. von der Umgebungsvariablen LAST_BYTE_POINTER ab.
Umgebungsvariable LAST_BYTE_POINTER
Die Umgebungsvariable LAST_BYTE_POINTER hat den Zweck, dass bestehende Programme den LBP nutzen können, ohne dass in sie eingegriffen werden muss. Festgebundene Programme müssen dann lediglich mit dem aktuellen CRTE neu gebunden werden. Für Programme, die mit PARTIAL-BIND oder CRTE-BASYS gebunden sind, genügt es, wenn das aktuelle CRTE bzw. CRTE-BASYS installiert ist.
Falls eine der betroffenen Funktionen ohne lbp-Schalter aufgerufen wird, hängt ihr Verhalten vom Inhalt der Umgebungsvariablen LAST_BYTE_POINTER ab:
LAST_BYTE_POINTER=YES
Die Funktionen fopen
, fopen64
und freopen
, freopen64
verhalten sich so, als ob im Parameter art lbp=yes
angegeben wäre.
Die Funktionen open
, open64
und creat
, creat64
verhalten sich so, als ob im Parameter modus
O_LBP angegeben wäre.
Beim Öffnen wird geprüft, ob LBP-Unterstützung möglich ist. Ist dies nicht der Fall, so schlägt die betroffene Funktion fehl und errno
wird auf ENOSYS gesetzt.
Beim Schließen einer Datei, die verändert oder neu erstellt wurde, wird kein Marker geschrieben (auch wenn einer vorhanden war) und ein gültiger LBP gesetzt. Auf diese Weise können Dateien mit Marker auf LBP ohne Marker umgestellt werden.
Bei NK-Dateien wird der letzte logische Block mit binären Nullen aufgefüllt, bei K-Dateien wird die Datei bis zum physikalischen Dateiende aufgefüllt.
LAST_BYTE_POINTER=NO
Die Funktionen fopen
, fopen64
und freopen
, freopen64
verhalten sich so, als ob im Parameter art lbp=no
angegeben wäre.
Die Funktionen open
, open64
und creat
, creat64
verhalten sich so, als ob im Parameter modus
O_NOLBP angegeben wäre.
Beim Schließen einer Datei, die neu erstellt wurde, wird der LBP auf Null (=ungültig) gesetzt. Es wird ein Marker geschrieben. Bei NK-Dateien wird der letzte logische Block mit binären Nullen aufgefüllt, bei K-Dateien wird die Datei bis zum physikalischen Dateiende aufgefüllt.
Beim Schließen einer Datei, die verändert wurde, wird der LBP auf Null (=ungültig) gesetzt. Ein Marker wird nur dann geschrieben, wenn vorher bereits ein Marker vorhanden war. Falls die Datei beim Öffnen einen gültigen LBP besaß, wird kein Marker geschrieben, da in diesem Fall davon ausgegangen wird, dass kein Marker vorhanden ist. Bei NK-Dateien wird der letzte logische Block mit binären Nullen aufgefüllt, bei K-Dateien wird die Datei bis zum physikalischen Dateiende aufgefüllt.
Ist die Umgebungsvariable nicht gesetzt, verhalten sich die Funktionen so, als ob sie den Wert NO
hätte.
Näheres zur Verwendung von Umgebungsvariablen im BS2000 finden Sie im Abschnitt "Umgebungsvariablen“).