[Pascal] Aus Ausgabeumleitung ausbrechen

15/10/2013 - 15:15 von groundsel | Report spam
Hallo!

Ich möchte auf einem Drucker, der an ein einfaches Textterminal
angeschlossen ist, ab und an etwas ausdrucken. Dafür habe ich mir ein
kleines Pascal-Programm geschrieben ("tprint"), das nicht viel mehr
macht, als vor dem zu druckenden Text einen String einzufügen, der das
Terminal in den Pass-Through-Modus zum Drucker schaltet. Am Ende wird
das Terminal wieder zurückgesetzt. Der Ausdruck wird also quasi an den
Bildschirm gesendet, aber nicht angezeigt, sondern an den Drucker
weitergeleitet. Klappt auch eigentlich einwandfrei.

Nun habe ich ein Programm (den Newsreader tin). Der ruft das als
Drucker definierte Programm so auf: "tprint > /dev/null 2>&1". Eine
evtl. Ausgabe wird also ins Nirwana geschickt.

Ich habe nun folgendes testhalber probiert: Ich schreibe die zu
druckenden Daten in ein temporàres File und setze den eigentlichen
Druckauftrag innerhalb des Pascal-Programmes am Schluß ab (Code siehe
unten). Ändert aber nichts, die Ausgabe verschwindet im Nirwana.

Gibt es irgend eine Chance, aus der Ausgabeumleitung, die beim Aufruf
gesetzt wird, zu "entkommen"? Außer, den Source von tin zu hacken...

V*


program t;

uses sysutils, classes, process;

var Dateiname: string;
user: string[8];
zufall: integer;
z: string[5];
Datei: text;
c: char;
EDatei: text;
EName: string;

procedure filename;
begin
randomize;
zufall := random(10000) + 10000;
str(zufall, z);
user := getenvironmentvariable('USER');
Dateiname := CONCAT('/tmp/', user, '.TIN.', z);
end;

procedure drucken;
var AProcess: TProcess;
begin
AProcess := TProcess.Create(nil);
AProcess.Commandline := CONCAT('tprint ', Dateiname);
AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.Execute;
AProcess.Free;
end;

begin
if paramcount = 1 then EName := paramstr(1) else EName := '';
filename;
assign(Datei, Dateiname);
rewrite(Datei);
if EName <> '' then begin
assign(EDatei, EName);
reset(EDatei);
while not eof(EDatei) do begin
read(EDatei, c);
write(Datei, c);
end;
close(EDatei);
end else begin
while not eof do begin
read(c);
write(Datei, c);
end;
end;
close(Datei);
drucken;
erase(Datei);
end.
 

Lesen sie die antworten

#1 Juergen Ilse
15/10/2013 - 15:36 | Warnen spam
Hallo,

Volker Englisch wrote:
Ich möchte auf einem Drucker, der an ein einfaches Textterminal
angeschlossen ist, ab und an etwas ausdrucken. Dafür habe ich mir ein
kleines Pascal-Programm geschrieben ("tprint"), das nicht viel mehr
macht, als vor dem zu druckenden Text einen String einzufügen, der das
Terminal in den Pass-Through-Modus zum Drucker schaltet. Am Ende wird
das Terminal wieder zurückgesetzt. Der Ausdruck wird also quasi an den
Bildschirm gesendet, aber nicht angezeigt, sondern an den Drucker
weitergeleitet. Klappt auch eigentlich einwandfrei.

Nun habe ich ein Programm (den Newsreader tin). Der ruft das als
Drucker definierte Programm so auf: "tprint > /dev/null 2>&1". Eine
evtl. Ausgabe wird also ins Nirwana geschickt.

Ich habe nun folgendes testhalber probiert: Ich schreibe die zu
druckenden Daten in ein temporàres File und setze den eigentlichen
Druckauftrag innerhalb des Pascal-Programmes am Schluß ab (Code siehe
unten). Ändert aber nichts, die Ausgabe verschwindet im Nirwana.

Gibt es irgend eine Chance, aus der Ausgabeumleitung, die beim Aufruf
gesetzt wird, zu "entkommen"? Außer, den Source von tin zu hacken...



Auch wenn stdout und stderr umgeleitet siond, sollte das "kontrollierende
Terminal" noch unveraendert sein. Du koenntest also versuchen, deine
Control-Sequenz auf /dev/tty auszugeben (oeffnen, ausgeben, schliessen).
Einen Versuch waere es zumindest wert ...

Tschuess,
Juergen Ilse ()
Ein Domainname ist nur ein Name, nicht mehr und nicht weniger.
Wer mehr hineininterpretiert, hat das Domain-Name-System nicht
verstanden.

Ähnliche fragen