Newsgroup: it.comp.os.linux.development
Titolo: conoscere i permessi file

Ciao,
sto cercando di buttarmi a sviluppare in c/c++ sotto linux, volevo fare 
un programma che mi dava in output su console i permessi di un file dato 
in input come parametro da linea di comando (tipo il comando "ll").
Ho visto che ci sono librerie di I/O sia in c che in c++ per aprire, 
scrivere e etc etc file, ma non c'è nulla che mi da i permessi dei file 
(xrw --- --- utente gruppo).
Purtroppo ho sempre sviluppato in c/c++ per pocket pc e windows e sono 
totalmente newbie sotto linux, non so bene dove cercare, potrei dire una 
cavalata ma per fare quello che ho in mente mi sa che l'unica è di 
sfruttare api del filsystem dentro il kernel, giusto o mi sbaglio e c'è 
qualche funzione?
ciao
-- 
Nobuteru
Linux Registered User #368935 since 01-10-2004
Powered by Suse Linux 9.1 Professional (x86)
GPG Key fingerprint 0061 6CE8 02EB 0CAA 16E2 7ECD 1AC4 32A2 C30B A8ED

 
forse ho trovato!
http://www.linuxselfhelp.com/gnu/glibc/html_chapter/libc_14.html
ciao e scusate il distrurbo!



Ciao,
non c'è nulla di cui scusarti. L'argomento è complesso perchè non riguarda
una sola API ma devi conoscere diverse cose su come manipolare files e
directories ( se vuoi anche fare lo scan delle directories al posto di
fornire il nome del file come argomento ). Ti consiglio di prendere un buon
manuale di programmazione Unix e guardare al capitolo "filesystem".
Comunque, in breve, si usano le API della famiglia stat() (#include
<sys/stat.h>) alle quali fornire come argomenti il nome del file ed un
puntatore ad una struct stat (stesso nome della API). Al ritorno della
funzione, la struct stat sarà riempita con le informazioni che ti servono,
ma non puoi andarle a leggere come se fossero delle cstring. Ti posto un po'
di codice per darti un'idea di come muoverti se hai già un puntatore a
struct stat.
#include <sys/stat.h>
static void p_mode(const struct stat *statp)
{
    if (statp->st_mode & S_IFMT) == S_IFREG)
        putchar('-');
    else if (statp->st_mode & S_IFMT) == S_IFDIR)
        putchar('d');
    else if ( statp->st_mode & S_IFMT) == S_IFLNK))
        putchar('l');
/* così hai stampato la prima lettera che ti identifica il tipo: directory,
file regolare, link, etc. */
 /* procedi così per tutti i tipi che sono 7 in tutto */
 
 ...cut...
 putchar(statp->st_mode & S_IRUSR == S_IRUSR ? 'r' : '-');
    putchar(statp->st_mode & S_IWUSR == S_IWUSR ? 'w' : '-');
    if (statp->st_mode & S_ISUID == S_ISUID))
        statp->st_mode & S_IXUSR == S_IXUSR ? putchar('s') : putchar('S');
    else if (statp->st_mode & S_IXUSR == S_IXUSR)
        putchar('x');
    else
        putchar('-');
/* le righe precedenti ti stampano la prima tripletta di infos relative al
"proprietario" della risorsa */
/* devi andare avanti per le altre due triplette su "gruppo" e "altri" */
 
 ...cut...
}
Hai visto le complicazioni che devi conoscere per farlo funzionare? Guarda
anche solo al problema
della stampa di 's' e 'S'. Ci sono cose simili nelle altre triplette come ad
esempio la 't' al posto di 'x'
nella terza tripletta. Hai notato anche la diversa costruzione del confronto
a livello di tipi e modi?
Buon lavoro,
fabiomdf
 
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

           
p.s. un'altra domanda, sempre se puoi aiutarmi cercando le funzioni per 
visualizzarmi il nome utente e il gruppo del file ho visto che ci sono 
funzioni che dato l'uid e il gid, mi stampano il nome utente e gruppo e 
si può stampare anche la password di utente e gruppo, le ho provate, il 
nome utente e il gruppo che mi danno indietro sono OK, ma purtroppo per 
le password mi stampa fuori solo una x....
hmmmm
ho visto che ci sono funzioni che lavorino con shadow ma non mi sono 
messo a sbatterci la testa, ammettiamo che che sfrutti quelle funzioni 
per la gestione delle pasword shadow se faccio funzionare il mio 
programma da root, riesco anche a visualizzare le password di utenti e 
gruppi?
grazie ancora
ciao


 Nobuteru
Ti piace vivere pericolosamente, vero? Scherzo...
Ti stampa solo la 'x' per indicarti che la password o non esiste oppure è
crittografata su /etc/shadow. Anche se stampi il valore che trovi su
/etc/shadow
non avrai nessuna indicazione sulla reale password da digitare al login
perchè la stessa è crittografata. Quando accedi alla shell, la password che
digiti viene prima crittografata (ogni volta) e poi controllata con il
valore che c'è su /etc/shadow che nel mio caso è
"$1$DV7fYtah$9wctwGRzXo5NH44AUeE8c/" ma da questa stringa non hai nessun
modo di risalire alla reale password che io digito al login sul mio sistema.
La codifica è eseguita con una funzione di tipo "one-way" e non c'è modo
(tranne che utilizzi un supercomputer e anni di tempo e tentativi vari, ma
anche qui dipende dal metodo di codifica utilizzato dal tuo sistema) di
risalire alla stringa originale.
Mi è costato parecchio tempo rispondere alle tue domande così mi farebbe
piacere sapere se ti sono stato utile e se c'è ancora qualche dettaglio che
vuoi approfondire ti prego di scrivere ancora.
Buon divertimento,


 Inviato via 
http://arianna.libero.it/usenet/


 ciao
Grazie a te per l'attenzione. Mi dispiace ma non mi è possibile continuare
in maniera privata. Gli argomenti devono essere potenzialmente di interesse
generale e quindi discutibili insieme al Gruppo.
Buon lavoro,


 
grazie
ciao


 criptata?
No. Assolutamente no (almeno non così come pensi tu e in ogni caso con
potenze elaborative enormi e anni di lavoro). Questi algoritmi si basano su
delle funzioni matematiche dette appunto "one-way" ad una sola via. Cioè da
"a" puoi calcolare "b", ma da "b" non hai modi praticabili per calcolare
"a".
Se fosse come pensi non ci sarebbe più riservatezza. Gli algoritmi più
utilizzati (MD5, SHA, 3DES e tanti altri) sono di dominio pubblico. Tutti
possono sapere come funzionano e vedere il codice di come sono implementati.
Non si basano sul nascondere l'algoritmo e/o il codice dell'implementazione,
ma solo sulla necessità di nascondere la password originale.
Ciao,
