[FLUG] Ottimizziamo insieme
- From: Simon <simon@xxxxxxxxx>
- To: fanolug@xxxxxxxxxxxxx
- Date: Thu, 21 Feb 2002 18:21:02 +0100
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...
- Follow-Ups:
- [FLUG] Re: Ottimizziamo insieme
- From: Gecco under VNC
- [FLUG] Re: Ottimizziamo insieme
- From: Romano Romano
Other related posts:
- » [FLUG] Ottimizziamo insieme
- » [FLUG] Re: Ottimizziamo insieme
- » [FLUG] Re: Ottimizziamo insieme
- » [FLUG] Re: Ottimizziamo insieme
- » [FLUG] Re: Ottimizziamo insieme
- » [FLUG] Re: Ottimizziamo insieme
- » [FLUG] Re: Ottimizziamo insieme
- » [FLUG] Re: Ottimizziamo insieme
- » [FLUG] Re: Ottimizziamo insieme
- [FLUG] Re: Ottimizziamo insieme
- From: Gecco under VNC
- [FLUG] Re: Ottimizziamo insieme
- From: Romano Romano