PDA

Visualizza la versione completa : [C] Execv con passaggio variabili di ambiente


marklenders
30-10-2007, 16:28
Salve a tutti,
devo scrivere un software in C standard su piattaforma linux che, dopo aver eseguito una fork, esegue un comando esterno avviandolo con una nuova shell. Questo mi serve per caricare un particolare profilo utente (che viene impersonificato dal mio programmino) e far s che il comando che viene lanciato sia eseguito nell'ambiente shell dell'utente corretto. Fin qui tutto bene e vi posto il pezzetto di codice che effettua questa semplice operazione:



char * cmdArray[5]; // questo e' vettore che viene passato alla execv
cmdArray[0] = "/bin/bash";
cmdArray[1] = "-bash";
cmdArray[2] = "-c";
cmdArray[3] = "printenv";//comando di esempio che stampa l'ambiente
cmdArray[4] = NULL; //l'ultimo elemento deve essere sempre NULL altrimenti la execv schianta

execv(cmdArray[0],&cmdArray[0]);



Il problema che devo aggiungere altre variabili a quelle gi definite nel profilo e dovrei riuscire a fare un "merge" tra le 2 in quanto il comando che vado a lanciare le puo' usare entrambe. Avevo quindi pensato di esare la "execve()" al posto della "execv()" che mi prende in ingresso anche il vettore degli environment ma in questo modo il profilo non viene caricato e mi ritrovo solo le variabili che passo alla execve();
Un' altra soluzione che ho trovato quella di fare delle export prima di invocare il comando vero e proprio ovvero e di usare comunque la execv() normale in questo modo:



char * cmdArray[5]; // questo e' vettore che viene passato alla execv
cmdArray[0] = "/bin/bash";
cmdArray[1] = "-bash";
cmdArray[2] = "-c";
cmdArray[3] = "export VAR1=\"prova\"; printenv"; //comando di esempio che stampa l'ambiente
cmdArray[4] = NULL; //l'ultimo elemento deve essere sempre NULL altrimenti la execv schianta

execv(cmdArray[0],&cmdArray[0]);



Questa soluzione "funzionicchia" ma avro' problemi in caso di variabili di ambiente di tipo numerico in quanto dal mio programmino devo trattare tutto come stringhe (non riesco a distinguere i parametri che mi vengono passati!!!)

Qualcuno ha una qualche soluzione da suggerirmi? Ho cercato in rete ma niente purtroppo...

Grazie Anticipatamente

Loading