Mailing List del Fortunae LUG ============================= Introduzione. ============= Ho scritto questa piccola funzioncina che, dato un intero (int o mode_t, nella funzione viene passato con la variabile 'mode') rappresentante i permessi su un file, crea una stringa simile a quella che produce il comunissimo 'ls -l'. drwxr-xr-x 2 root bin 2256 Dec 26 13:34 bin/ (mi sto riferendo solo alla parte iniziale riguardante i permessi) Visto che la utilizzerò in un mio futuro programmino, e non ho voglia più di tanto di mettermi ad ottimizzarla vi pasto qui il codice... sperando che qualcuno di voi abbia validi consigli per migliorarla. Attuali punti deboli. ===================== Per il momento funziona abbastanza bene direi, anche se a dire il vero non l'ho provata molto. Così a prima vista direi che i problemi si presenterebbero se su alcune piattaforme a me sconosciute in cui i permessi di scrittura e lettura riservati a tutti non sono ottenuti shiftando di 3 bit a destra i permessi del gruppo e quelli del gruppo ottenuti shiftando di 3 bit a destra quelli dell'owner. Per farla breve: S_IRUSR 00400 owner has read permission S_IWUSR 00200 owner has write permission S_IRGRP 00040 group has read permission S_IWGRP 00020 group has write permission S_IROTH 00004 others have read permission S_IWOTH 00002 others have write permisson (PS. i permessi sono in formato ottale) Come vedete S_IRGRP è ottenuto dallo shift verso destra di 3 bit di S_IRUSR, e S_IROTH è ottenuto dallo shift verso destra di 6 bit di S_IRUSR. Stessa cosa per i permessi di scrittura. Questo principio viene sfruttato dai 'for' presenti verso metà della funzione. Ove però queste relazione ci fosse, tutto andrebbe a quel paese:) Informazioni e Consigli ======================= Vi consiglio: 'man fstat' Per compilare senza problemi tra gli altri include dovete mettere anche: #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> Contengono infatti le macro che vengono usate nella funzione. Finalmente la Funzione ====================== /* ***** BEGIN ***** */ char *file_perm(int mode) { int cx; static char str[12]; memset(str, '-', 10); str[10] = 0x00; switch(mode & S_IFMT) { case(S_IFSOCK): str[0] = 's'; break; case(S_IFLNK): str[0] = 'l'; break; case(S_IFBLK): str[0] = 'b'; break; case(S_IFDIR): str[0] = 'd'; break; case(S_IFCHR): str[0] = 'c'; break; case(S_IFIFO): str[0] = 'p'; break; } for(cx = 0; cx < 9; cx += 3) if(mode & (S_IRUSR >> cx)) str[cx+1] = 'r'; for(cx = 0; cx < 9; cx += 3) if(mode & (S_IWUSR >> cx)) str[cx+2] = 'w'; if((mode & S_IXUSR) && !(mode & S_ISUID)) str[3] = 'x'; else if((mode & S_IXUSR) && (mode & S_ISUID)) str[3] = 's'; else if(!(mode & S_IXUSR) && (mode & S_ISUID)) str[3] = 'S'; if((mode & S_IXGRP) && !(mode & S_ISGID)) str[6] = 'x'; else if((mode & S_IXGRP) && (mode & S_ISGID)) str[6] = 's'; else if(!(mode & S_IXGRP) && (mode & S_ISGID)) str[6] = 'S'; if((mode & S_IXOTH) && !(mode & S_ISVTX)) str[9] = 'x'; else if((mode & S_IXOTH) && (mode & S_ISVTX)) str[9] = 't'; else if(!(mode & S_IXOTH) && (mode & S_ISVTX)) str[9] = 'T'; return str; } /* ***** END ***** */ -- /* Federico 's1m0n' Simoncelli <f.simon@xxxxxxxx> http://www.jkcal.org/simon */ int main(){unsigned int g,h=0;while(++h){for(g=(h>1)?2:1;g< h/2+1&&h%g!=0;g++);if(g==h/2+1)printf("%i\n",h);}return 0;} -- apt-get... un presidente operaio...