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

Other related posts: