ricavare l'utente... in c, ovvio!!!

Area di discussione libera.

Moderatore: Staff

Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
sir_alex
Linux 3.x
Linux 3.x
Messaggi: 735
Iscritto il: lun 21 mar 2005, 0:00
Kernel: 2.6.35-22
Desktop: KDE4
Distribuzione: Ubuntu
Località: Milano - Corbola (RO)
Contatta:

ricavare l'utente... in c, ovvio!!!

Messaggio 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... :lol:
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...

Avatar utente
zzt
Linux 2.x
Linux 2.x
Messaggi: 249
Iscritto il: lun 7 mar 2005, 0:00

Messaggio da zzt »

man getlogin
Mai usata, ma può essere quello che cerchi...

sir_alex
Linux 3.x
Linux 3.x
Messaggi: 735
Iscritto il: lun 21 mar 2005, 0:00
Kernel: 2.6.35-22
Desktop: KDE4
Distribuzione: Ubuntu
Località: Milano - Corbola (RO)
Contatta:

Messaggio da sir_alex »

Parrebbe in effetti... provo poi ti dirò! Grazie!

Avatar utente
zzt
Linux 2.x
Linux 2.x
Messaggi: 249
Iscritto il: lun 7 mar 2005, 0:00

Messaggio 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...

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio da gallows »

Codice: Seleziona tutto

#include <stdlib.h>

int main() {

      system("whoami");
      return 0;
}
ma è molto piú elegante la soluzione di zzt :)

Avatar utente
useless
Staff
Staff
Messaggi: 3896
Iscritto il: dom 12 ott 2003, 0:00
Località: A place where the streets have no name
Contatta:

Messaggio 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 :).

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio da gallows »

verissimo :roll: :oops:

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>

int main() {

	char *homedir = getenv("HOME");
	puts(homedir);
	return 0;
}
questa va meglio, no?

Avatar utente
useless
Staff
Staff
Messaggi: 3896
Iscritto il: dom 12 ott 2003, 0:00
Località: A place where the streets have no name
Contatta:

Messaggio 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'.

sir_alex
Linux 3.x
Linux 3.x
Messaggi: 735
Iscritto il: lun 21 mar 2005, 0:00
Kernel: 2.6.35-22
Desktop: KDE4
Distribuzione: Ubuntu
Località: Milano - Corbola (RO)
Contatta:

Messaggio da sir_alex »

In conclusione (useless's been useful :lol: ):

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... 8)

Avatar utente
useless
Staff
Staff
Messaggi: 3896
Iscritto il: dom 12 ott 2003, 0:00
Località: A place where the streets have no name
Contatta:

Messaggio 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 () :).

sir_alex
Linux 3.x
Linux 3.x
Messaggi: 735
Iscritto il: lun 21 mar 2005, 0:00
Kernel: 2.6.35-22
Desktop: KDE4
Distribuzione: Ubuntu
Località: Milano - Corbola (RO)
Contatta:

Messaggio 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!!! :lol: :lol: :lol:

Rispondi