C-Wrapper um ein Perl-Script

Datum: 2003-05-12
Quelle: suse-linux

Worum ging es?

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.

Code
#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;
}
Beschreibung

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.