Pagina 1 di 1
ricavare l'utente... in c, ovvio!!!
Inviato: mar 16 ago 2005, 22:00
da sir_alex
Ennesima questione in c... ammetto di aver preso questo forum un po' come forum di developers... d'altronde noi linuxiani conosciamo un po' tutti il c...
However, volevo salvare le impostazioni di un programma in una directory nascosta della home dell'(ignaro)utente, come faccio a ricavarne il nome per comporre la directory home? Funziona anche la tilde? Perchè volevo ad esempio sul GtkFileChooser delle gtk impostare la home come directory mostrata per prima, e la tilde non gli va, gli serve il percorso completo...
Inviato: mar 16 ago 2005, 22:04
da zzt
man getlogin
Mai usata, ma può essere quello che cerchi...
Inviato: mar 16 ago 2005, 22:16
da sir_alex
Parrebbe in effetti... provo poi ti dirò! Grazie!
Inviato: mer 17 ago 2005, 0:35
da zzt
Avevo una soluzione più sensata sulla punta della lingua... ora mi sono ricordato:
puoi accedere alle variabili di environment
man getenv
così ti puoi ricavare la home...
Inviato: mer 17 ago 2005, 0:50
da gallows
Codice: Seleziona tutto
#include <stdlib.h>
int main() {
system("whoami");
return 0;
}
ma è molto piú elegante la soluzione di zzt

Inviato: mer 17 ago 2005, 1:47
da useless
non è correttissimo cercare il nome utente e assumere che la home sia /home/nomeutente, dato che le home potrebbero benissimo stare da un'altra parte (ad esempio mi pare che in bsd stiano in /usr/local/home). come diceve zzt la cosa migliore dovrebbe essere leggere la variabile d'ambiente $HOME oppure ancora meglio leggere la home dal db degli utenti di sistema (conosciuto anche come /etc/passwd

) mediante le system call preposte a tale scopo (come parlo bene quando voglio!): man getpwent.
@gallows: quel che hai scritto tu scrive su stdout il nome utente, ma di fatto dal tuo programma non puoi catturarlo

. dovresti usare popen, ma ovviamente tra tutti i metodi proposti è il peggiore

.
Inviato: mer 17 ago 2005, 1:53
da gallows
verissimo
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
int main() {
char *homedir = getenv("HOME");
puts(homedir);
return 0;
}
questa va meglio, no?
Inviato: mer 17 ago 2005, 3:08
da useless
yeah, oppure:
Codice: Seleziona tutto
#include <sys/types.h>
#include <pwd.h>
#include <unistd.h>
struct passwd *pwent;
pwent = getpwuid (getuid ());
printf ("%s", pwent -> pw_dir);
se ho capito bene NON ci vuole nessuna free. inoltre tutto ciò non è thread-safe, eventualmente bisogna usare getpwnam_r, ma la cosa si complica un po'.
Inviato: mer 17 ago 2005, 19:56
da sir_alex
In conclusione (useless's been useful

):
king@casa:~$ cd workspace
king@casa:~/workspace$ cat home.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <pwd.h>
int main(int argc, char *argv[])
{
struct passwd *pass;
char *user=getenv("LOGNAME");
if(user==NULL)
return 1;
do
{
pass=getpwent();
} while(strcmp(pass->pw_name, user)!=0);
fprintf(stdout, "%s %s\n", pass->pw_name, pass->pw_dir);
return 0;
}
king@casa:~/workspace$ ./home
king /home/king
king@casa:~/workspace$
No comment sul mio nome utente please...

Inviato: mer 17 ago 2005, 21:58
da useless
scus ma come ho scritto io non è + sintetico?

mi sembra anche meglio prendere lo uid con getuid ().
se vuoi fare come hai scritto tu... ti manca un endpwent ()

.
Inviato: gio 18 ago 2005, 18:31
da sir_alex
Bè a me sembrava meglio usare LOGNAME, consiglio letto sul man di uno di quei comandi lì... cos'è endpwent()? Ah... google ha rivelato (al momento sono su win (ok non uccidetemi vi prego!!!)), quindi bisgna anche chiudere il file... e che cavolo pensavo che getpwent aprisse e chiudesse... bè grazie!
p.s. 100mo post!!!
