PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GPG Subprozess



403
07-08-2006, 14:11
Hallo :D

Da ich die entsprechende GPG API noch nicht gefunden habe, möchte ich ein
Program in einem Subprozess eine Signatur mit GPG verifizieren lassen.

Das klappt folgendermassen gut:




sleep (1);
pid_t pid;

if ((pid = fork()) < 0) {
perror("fork");
exit(1);
}
if (pid == 0) {
buf = strcat(argv[1],ext); /* ext=.sig */
fprintf(stdout, "buf: %s\n", buf);
fprintf(stdout, "checking Signature for: %s\n", buf);
sleep (1); execl("/usr/local/bin/gpg", "--verify", "blumen.task.sig", NULL); /* make dynamic */
fflush(stdout);
_exit(0);
}

}


Der Versuch, das ganze dynamisch zu machen, scheitert dagegen:


execl("/usr/local/bin/gpg", "--verify", " %s", buf); /* make dynamic */


Woran könnte das liegen? Meine Vermutung, das argv[1] nicht an den
Subprozess weitergegeben wird, ist falsch.

anda_skoa
07-08-2006, 14:28
Zur GPG API
http://www.gnupg.org/related_software/gpgme/

Ciao,
_

403
07-08-2006, 15:42
gut das schaue ich mir mal an. :cool:

Der Rest interessiert mich natürlich trotzdem.

rgubatz
07-08-2006, 22:32
Hallo,
1. Die Parameterliste der execl-Funktionen muß mit einem NULL-Zeiger abgeschlossen werden.

2. Du kannst doch nicht einfach an argv[1] ein strcat() machen!


#define LEN 1024
char buf[LEN + 1];

strncpy(buf,LEN,argv[1]);
strncat(buf,LEN,".sig");

... fork(); ...

execl("/usr/local/bin/gpg", "--verify", buf, NULL); /* make dynamic */


Nach einem exec-was-auch-immer, wird nichts mehr ausgeführt, da dein kompletter Prozess mit dem Code deiner exec-Funktion überschrieben wird. Da meistens dieser Code am Ende ein exit(); ausführt, wird dein Prozess nur im Fehlerfall weiterlaufen.

Ich empfehle Dir, dich nochmal mit dem Thema auseinanderzusetzen.
Dieses (http://www.pronix.de/pronix-6.html) und für Linux dieses (http://www.pronix.de/pronix-4.html) (online)-Buch
sollten Dir weiterhelfen.

Rene

403
08-08-2006, 11:05
Hallo,
1. Die Parameterliste der execl-Funktionen muß mit einem NULL-Zeiger abgeschlossen werden.

Danke und man nimmt "%s" nicht in execl.



2. Du kannst doch nicht einfach an argv[1] ein strcat() machen!

Ich weiss :rolleyes: Es war nur temporär. Die ganze str(n).* Problematik. Nein, ich will die Security nicht vernachlässigen.




#define LEN 1024
char buf[LEN + 1];

strncpy(buf,LEN,argv[1]);
strncat(buf,LEN,".sig");

... fork(); ...

execl("/usr/local/bin/gpg", "--verify", buf, NULL); /* make dynamic */




Nach einem exec-was-auch-immer, wird nichts mehr ausgeführt, da dein kompletter Prozess mit dem Code deiner exec-Funktion überschrieben wird. Da meistens dieser Code am Ende ein exit(); ausführt, wird dein Prozess nur im Fehlerfall weiterlaufen.

Hallo, hier hatte ich gehofft mit wait(1) vorwärts zu kommen.




Ich empfehle Dir, dich nochmal mit dem Thema auseinanderzusetzen.
Dieses (http://www.pronix.de/pronix-6.html) und für Linux dieses (http://www.pronix.de/pronix-4.html) (online)-Buch
sollten Dir weiterhelfen.

Rene

Danke, eine gute Empfehlung, es war nämlich mein erster fork().

Ich lese momentan "C Kompaktreferenz" und habe mir "Programming Unix Networks"
von Stevens bestellt.

Gruss 403