Newsgroup: it.comp.os.linux.development
Titolo: direcory corrente?

Scusatemi ma e' da poco (praticamente da ora) che programmo per Linux,
dovrei creare in C++ un eseguibile che scriva un file di testo nella stessa
DIR in cui viene posto il programma.
Come faccio ad avere tale parametro?
Devo catturare l'OUTPUT di qualche comando?
Grazie a tutti e scusate ancora per la domanda.

 Devo catturare l'OUTPUT di qualche comando?
non so se fa al caso tuo, c'e' il comando 'pwd':
pwd - print name of current/working directory
-- 
Marco

 Come faccio ad avere tale parametro?
no, c'e' la funzione getcwd
occhio pero' che non e' garantito che ti trovi nella dir dell'eseguibile
se ad esempio e' nel PATH, e lo chiami da shell, la WD sara' quella 
della shell, non quella del prog
ti conviene usare  /var, /usr/tmp o /tmp, che sono sempre li'
-- 
Se l'appetito vien mangiando,
Figuriamoci a digiuno...
BW2K+2


Il programma che sto scrivendo in pratica e' un CGI e la funzione di base
dovrebbe achiviare sia richieste sia altri dati dopo averli criptti. Il mio
problema e' che tale programma deve creare file solo nella dir di tali siti
e siccome  deve funzionare anche in caso di cambio di hosting senza
ricompilazine, getcwd da la dir giusta (quella dell'eseguibile) se invocato
in un programma tramite un telnet.
Mi spiego meglio, se in una pagina web invoco il mio CGI per memorizare una
richiesta, in pratica ho un collegamento telnet che invia dati al mio CGI
ora se ho capito bene la funzione getcwd in questo caso da di ritorno il
percorso dell'eseguibile.
Giusto?
Grazie

 Giusto?
mai provato, ma puoi testarlo tu


 Giusto?
No.
getcwd() restituisce la directoty da cui e' stato lanciato il programma,
a meno che questa non sia stata cambiata dopo l'avvio dello stesso
mediante chdir().
Questo significa che se ti trovi in /home/nomeUser e lanci il programma
pippo, getcwd() restituisce "/home/nomeUser".
Se ti interessa sapere la directory, c'e' stato un thread non molto
tempo
fa. Se usi Linux il path dell'eseguibile dovrebbe trovarsi in
/proc/pid/exe (dove pid e quello che ti restituisce getpid()), ma questo
e' un metodo assolutamente non standard che probabilmente non funziona
nemmeno con tutti i kernel di Linux (se non sbaglio funziona solo con
kernel > 2.0).
In ogni caso cercare la directory dove si trova l'eseguibile per
scriverci, non e' una cosa furba: nessuno ti garantisce che tu abbia
i diritti per farlo.
A mio avviso ti conviene creare una directory dove il programma ha il
diritto di scrivere ed usare sempre lo stesso nome qualunque sia il
server su cui il cgi gira.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 i diritti per farlo.
appunto


 tra l'altro leggibile solo da root
No, e' leggibile almeno da root e da chi ha lanciato l'eseguibile,
sul "da chiunque" non ne sono troppo sicuro :-)
C:\>iao Angelo.



Il mio programma come ripeto e' un CGI e funziona nella dir CGI-BIN di un
sito quindi a meno di restrizioni il programma creato da me dovrebbe avere i
permessi di scrittura in tale dir, ora il mio prblema e' che nella creazione
di file di testo serve il percorso completo della dir (questo solo per
compilatori Unix).
Ora chiariamo:
un utente clikka su di un pulsante di una pagina WEB ed esegue il CGI ora e'
il programma a chimare la funzione
 getcwd e quindi dovrebbe ottenere il percorso corretto.
Es (lo scrivo al volo non siate troppo pignoli)
main()
{
char *p= new char;  // alloca una stringa dinamica
p=getcwd();   //chiama getcwd ed insrisce il valore in p
cout <<p;   // visiona il percorso
return 0;
}
ora cout visulizera' il percorso dell' eseguibile?
Se si, tutto OK,
Se no, esiste un comando che mi restituisce il percorso della dir in modo
che catturando l'OUTPUT lo possa utilizzare con un system(comando):
Grazie a tutti.

 ora cout visulizera' il percorso dell' eseguibile?
dipende dal CGI: se ha cambiato la dir, si, altrimenti no
comunque, il codice sotto funziona
#include <sys/types.h>
#include <unistd.h>
#include <limits.h>
#include <iostream>
#include <string>
#include <strstream>
int main() {
  pid_t mypid;
  char buffer[16]; 
  char percorso[PATH_MAX];
  std::string nomefile="/proc/";
  /*ricava il pid del programma */
  mypid = getpid();
 
  /* lo aggiunge alla stringa che conterra' il percorso del link */
  std::ostrstream os(buffer, 16);
  os << mypid << std::ends;
  std::string pid (os.str());
  os.rdbuf()->freeze(0);
  nomefile += pid + "/exe";
 
  /* risolve il link */
  readlink(nomefile.c_str(), percorso, PATH_MAX);  
 
  /* stampa */
  std::cout << percorso << std::endl;  
  return 0;
}
ah, se mai ti pagassero per questo CGI, mi devi almeno una birra ;)


 dipende dal CGI: se ha cambiato la dir, si, altrimenti no
ehm volevo dire: dipende dal server HTTP, se ha cambiato la dir a 
quella del CGI, allora si, altrimenti no. dipende quindi da una 
variabile che non puoi controllare, percio' non e' un metodo affidabile


 ora cout visulizera' il percorso dell' eseguibile?
dipende dal CGI: se ha cambiato la dir, si, altrimenti no
comunque, il codice sotto funziona



  return 0;
}
ti resta da togliere il nome dell'eseguibile, ma e' facile
ah, se mai ti pagassero per questo CGI, mi devi almeno una birra ;)
-- 



Come minimo ti offro una cena (dipende dal quanto... )
Grazie.

 Se si, tutto OK,
Non ne sono tanto sicuro. In ogni caso hai a disposizione
la variabile d'ambiente
   SCRIPT_FILENAME
accessibile mediante getenv("SCRIPT_FILENAME")
che ti dovrebbe dire il percorso completo dello script CGI attualmente
in esecuzione.
ATTENZIONE! Controlla quello che ho detto. Infatti Apache da la
            possibilita' di definire uno ScriptAlias per i CGI e
            non ricordo cosa succede in questo caso (e' un po'
            che non gioco con Apache :-)).
In ogni caso, a mio avviso, sarebbe meglio crearsi una directory,
ad es., /var/log/nomeCGI e scrivere la dentro.
Sicuramente sarebbe una soluzione piu' pulita.
C:\>iao Angelo



Ma non posso farlo perche' mi e' permesso operare solo nella dir del sito.
Grazie.