Datum: 2003-05-12
Quelle: suse-linux
Perl-Scripts sind sehr beliebt. Leider ist es normalerweise so, dass der Script-Code für alle lesbar vorliegt.
Das ist in manchen Umgebungen nicht erwünscht. Um das Problem zu umgehen, schreibt man sich einen C-Wrapper
(also ein ausführbares Programm), der das Perl-Script entschlüsselt und anschließend zum Ablauf bringt. Soweit ist
alles klar. Was aber, wenn das Perl-Script Daten über die Standardeingabe empfangen muss?
Eine Variante ist, im Perl-Script die Daten nicht von stdin, sondern über den
Perl-eigenen DATA-Kanal zu holen. Dieser Kanal kann dann vom Wrapper aus seiner
Standardeingabe gefüllt werden.
#include <stdio.h>
const char *pcode[] = {"while (<DATA>) {\n",
"print 'marvin says: ', $_;\n",
";}\n",
"__DATA__\n",
""};
int main (int argc, char **argv) {
FILE *p = NULL;
int i = 0;
char s[81];
if ((p = popen ("/usr/bin/perl -", "w")) == NULL) return 1;
while (*pcode[i] != 0) fputs (pcode[i++], p);
while (fgets (s, 80, stdin) != NULL) fputs (s, p);
pclose (p);
return 0;
}
Im Normalfall würde man natürlich den Perl-Code nicht direkt im Programm parken, sondern aus einer (ggf. verschlüsselten)
Datei einlesen - der Schnipsel oben dient nur der Demonstration des Prinzips. Startet man das kompilierte C-Programm und
übergibt ihm z. B. per Pipe Daten, werden diese an den __DATA__-Abschnitt des Perl-Codes angehängt
und von diesem bei der Ausführung des Scripts gelesen.
Eine andere Möglichkeit besteht darin, im Wrapper-Programm die Standardausgabe des eigenen Prozesses mit der Standardeingabe
des Perl-Scripts per Pipe zu verknüpfen.