1
#include "FireGPGCall.h"
10
#include <sys/socket.h>
13
char** split(char* chaine,const char* delim,int vide) {
15
char** tab = NULL; //tableau de chaine, tableau resultat
16
char *ptr; //pointeur sur une partie de
17
int sizeStr; //taille de la chaine à recupérer
18
int sizeTab = 0; //taille du tableau de chaine
19
char* largestring; //chaine à traiter
21
int sizeDelim=strlen(delim); //taille du delimiteur
23
largestring = chaine; //comme ca on ne modifie pas le pointeur d'origine
25
while( (ptr=strstr(largestring, delim))!=NULL ){
26
sizeStr=ptr-largestring;
28
//si la chaine trouvé n'est pas vide ou si on accepte les chaine vide
29
if (vide == 1 || sizeStr != 0) {
30
//on alloue une case en plus au tableau de chaines
33
tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
35
//on alloue la chaine du tableau
36
tab[sizeTab- 1]=(char*) malloc( sizeof(char)*(sizeStr + 1) );
37
strncpy(tab[sizeTab-1],largestring,sizeStr);
38
tab[sizeTab-1][sizeStr] = '\0';
41
//on decale le pointeur largestring pour continuer la boucle apres le premier elément traiter
42
ptr = ptr + sizeDelim;
46
//si la chaine n'est pas vide, on recupere le dernier "morceau"
47
if (strlen(largestring) != 0) {
49
sizeStr=strlen(largestring);
51
tab = (char**) realloc(tab,sizeof(char*)*sizeTab);
52
tab[sizeTab-1]=(char*) malloc( sizeof(char)*(sizeStr+1) );
53
strncpy(tab[sizeTab-1],largestring,sizeStr);
54
tab[sizeTab-1][sizeStr] = '\0';
56
else if (vide == 1) { //si on fini sur un delimiteur et si on accepte les mots vides,on ajoute un mot vide
58
tab = (char**) realloc(tab,sizeof(char*)*sizeTab);
59
tab[sizeTab-1] = (char*) malloc( sizeof(char)*1 );
60
tab[sizeTab-1][0] = '\0';
64
//on ajoute une case à null pour finir le tableau
66
tab = (char**) realloc(tab,sizeof(char*)*sizeTab);
67
tab[sizeTab-1] = NULL;
72
NS_IMPL_ISUPPORTS1(FireGPGCall, IFireGPGCall)
74
FireGPGCall::FireGPGCall() {
75
/* member initializers and constructor code */
78
FireGPGCall::~FireGPGCall() {
82
/* long Add (in long a, in long b); */
83
NS_IMETHODIMP FireGPGCall::Call(const char *path, const char *parameters, const char *sdin, char **_retval) {
85
char c[1]; /* declare a char array */
94
//We create a pair of socket (input and ouput)
95
rc = socketpair( AF_UNIX, SOCK_STREAM, 0, fd );
97
perror("Cannot open socketpair");
101
//We create a child of ourself
104
perror("Cannot fork");
108
if (child == 0) { /* child - it uses fd[1] */
110
if (fd[1] != STDIN_FILENO) { /*Redirect standard input to socketpair*/
111
if (dup2(fd[1], STDIN_FILENO) != STDIN_FILENO) {
112
perror("Cannot dup2 stdin");
117
if (fd[1] != STDOUT_FILENO) { /*Redirect standard output to socketpair*/
118
if (dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO) {
119
perror("Cannot dup2 stdout");
124
//We call the process
125
char *const *argv = split((char*)parameters," ",0);
127
if (execvp(path, argv) < 0) {
128
perror("Cannot exec");
136
write(fd[0], sdin, strlen(sdin));
138
//We wait for the end of the subprocess
140
waitpid( child, &status, 0 );
142
fcntl(fd[0], F_SETFL, O_NONBLOCK | fcntl(fd[0], F_GETFL));
144
//We read byte by byte the output
148
if(c[0]!=-74 && n < 10240) {
152
else { //If it's the end of the buffer is full
158
buffer[n] = (char)'\0';
160
//We copy the ouput to the return variable
161
* _retval = (char*) nsMemory::Alloc(PL_strlen(buffer) + 1);
163
return NS_ERROR_NULL_POINTER;
165
PL_strcpy(*_retval, buffer);