Newsgroup: it.comp.os.linux.development
Titolo: Funzione per sapere che programma sono ...

Salve,
un quesito di programmazione in ambiente unix.
Mettiamo di scrivere una funzione di libreria, e all'interno del
codice
volessi sapere esattamente quale programma mi sta invocando , ovvero
nome e path completo di esecuzione, per limitarne l'uso a programmi
specifici. Ci sono funzioni che permettono di ricavare queste
informazioni ?
Aggiungo qualche informazione, la questione e' legata alla sicurezza
software e non voglio utilizzare il discorso dell'argv[0], inoltre
l'argv[0] non da informazione da quale path e' stato invocato il
programma. L'intenzione e' di permettere l'esecuzione della libreria
in oggetto solo ad alcuni programmi certificati e certificabili ed
evitare che qualcuno si possa linkare la libreria ed invocarla in modo
fraudolento.
Thanks

 ......
Ok, non sei pratico di Usenet. Giusto?
Per questa domanda hai gia' un thread aperto, piu' sotto, in questo 
newsgroup (leggilo: hai gia' qualche risposta).
Ho impostato io il f/up alla tua domanda da i.c.l.c a qui (... mannaggia 
a me! :) )
Ciao
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

a me! :) )
E vabbe' .. dai .. ho aggiunto qualche altra informazione .. e poi i
messaggi che iniziano con RE: sembrano sempre thread incompleti :D

 fraudolento.
Non credo che sia un'ottima soluzione di sicurezza (ma puo' essere che 
non abbia ben capito cosa vuoi fare...)
Comunque, per avere una stringa del tipo "/path/completo/nomeprogramma" 
si puo' utilizzare il 'classico' metodo descritto sotto.
Come gia' avevo accennato nell'altro thread, ti serve di recuperare:
(A) la stringa presente nel parametro argv[0] della funz. main() del C. 
Siccome devi averla disponibile all'interno di funzioni di libreria, 
potresti volerla ottenere con un altro metodo, e non passata o 
globalizzata da dentro la stessa main() (eg. su Linux potresti estrarla 
da /proc/[pid]/cmdline o /proc/self/cmdline - purtroppo non ricordo se 
esistono specifiche funzioni che recuperano argomenti della linea di 
comando)
(B) la stringa con la dir. corrente "al momento dell'esecuzione del 
programma". In Linux la puoi trovare anche dentro /proc/[pid]/environ (o 
/proc/self/environ), oppure - piu' semplicemente - si puo' recuperare 
con getenv("PWD"). Non e' affidabile recuperarla con un getcwd() (o 
equivalente) all'interno di una funz. di libreria: il path corrente, nel 
frattempo, potrebbe essere cambiato.
Quindi, una volta ottenuto (A) e (B):
- se in (A) c'e' una stringa che inizia con '/': allora, 
presumibilmente, in (A) hai gia' il nome del programma completo di path 
assoluto.
- altrimenti va concatenato il contenuto di (B) con quello di (A), 
separati da uno '/'. La stringa risultante, va quindi 'normalizzata' con 
una funzione tipo la realpath() (eg. '/./' diventa '/'; '/nomedir/../' 
diventa '/', ecc...). Se non hai una funzione del genere nel tuo 
sistema, devi trovarla altrove o fartela da solo.


 si puo' utilizzare il 'classico' metodo descritto sotto.
(dimenticavo)
...ovviamente, se nel tuo sistema unix ti funziona il metodo suggerito 
precedentemente da Max M., allora e' tutto molto piu' semplice...
In C puoi risolvere con un paio di righe di codice:
...
char sProgName[PATH_MAX];
if(readlink("/proc/self/exe", sProgName, sizeof(sProgName)) > 0)
	printf("path+progname: %s\n", sProgName);
...


precedentemente da Max M., allora e' tutto molto piu' semplice...
Non vedo il messaggio di max M .. comunque mi baso su quello che hai
scritto dopo. Vedo se esiste sul sistema che uso, che e' AIX.
Per quanto riguarda il metodo descritto, ovviamente come sai la
working directory puo' essere facilmente modificata e volevo evitare,
visto che facilmente aggirabile, di farmi passare un parametro con il
nome del programma dentro. Dopodomani do un occhiata ai manuali di aix
su questa readlink .. vediamo che salta fuori.
Grazie a tutti