[Linux-bruxelles] fonction en C sous Linux

Stanislas Rusinsky rusinskystanislas at yahoo.fr
Ven 10 Jan 19:29:24 CET 2003


Merci à tous,

pour la GPL pas de prb c'est un devoir, l'école n'aura pas besoin de
mettre un brevet sur les sources fort heureusement! la methode python
est fort sympa! 

J'ai trouvé le code ( en cherchant dur ) de celle de berkeley qui a
l'air rapide, un test bit à bit avec les constantes symboliques, mais je
ne pense pas qu'elle soit incluse de facto dans les sources POSIX... 

David, vois avec ton avocat si tu ne peux pas gagner qques $ sur le dos
de Berkeley...

La voici :

void getStrMode(mode_t mode, char *p)
{       
/*      
 -       regular file
           b     block special
           c     character special
           d     directory
           l     symbolic link
           p     fifo
           s     socket
           w     whiteout
           ?     unknown inode type
*/
        
         /* print type */
        switch (mode & S_IFMT) {
        case S_IFDIR:                   /* directory */
                *p++ = 'd';
                break;
        case S_IFCHR:                   /* character special */
                *p++ = 'c';
                break;
        case S_IFBLK:                   /* block special */
                *p++ = 'b';
                break;
        case S_IFREG:                   /* regular */
                *p++ = '-';
                break;
        case S_IFLNK:                   /* symbolic link */
                *p++ = 'l';
                break;
        case S_IFSOCK:                  /* socket */
                *p++ = 's';
                break;
#ifdef S_IFIFO
        case S_IFIFO:                   /* fifo */
                *p++ = 'p';
                break;
#endif
#ifdef S_IFWHT
        case S_IFWHT:                   /* whiteout */
                *p++ = 'w';
                break;
#endif
        default:                        /* unknown */
                *p++ = '?';
                break;
        }
        /* usr */
        if (mode & S_IRUSR)
                *p++ = 'r';
        else
                *p++ = '-';
        if (mode & S_IWUSR)
                *p++ = 'w';
        else
                *p++ = '-';
        switch (mode & (S_IXUSR | S_ISUID)) {
        case 0:
                *p++ = '-';
                break;
        case S_IXUSR:
                *p++ = 'x';
                break;
        case S_ISUID:
                *p++ = 'S';
                break;
        case S_IXUSR | S_ISUID:
                *p++ = 's';
                break;
        }
        /* group */
        if (mode & S_IRGRP)
                *p++ = 'r';
        else
                *p++ = '-';
        if (mode & S_IWGRP)
                *p++ = 'w';
        else
                *p++ = '-';
        switch (mode & (S_IXGRP | S_ISGID)) {
        case 0:
                *p++ = '-';
                break;
        case S_IXGRP:
                *p++ = 'x';
                break;
        case S_ISGID:
                *p++ = 'S';
                break;
        case S_IXGRP | S_ISGID:
                *p++ = 's';
                break;
        }
        /* other */
        if (mode & S_IROTH)
                *p++ = 'r';
        else
                *p++ = '-';
        if (mode & S_IWOTH)
                *p++ = 'w';
        else
                *p++ = '-';
        switch (mode & (S_IXOTH | S_ISVTX)) {
        case 0:
                *p++ = '-';
                break;
        case S_IXOTH:
                *p++ = 'x';
                break;
        case S_ISVTX:
                *p++ = 'T';
                break;
        case S_IXOTH | S_ISVTX:
                *p++ = 't';
                break;
        }
        *p++ = ' ';             /* will be a '+' if ACL's implemented */
        *p = '\0';
        /*

S_IRUSR (S_IREAD)
          00400 read by owner

S_IWUSR (S_IWRITE)
          00200 write by owner

S_IXUSR (S_IEXEC)
          00100 execute/search by owner

S_IRGRP   00040 read by group

S_IWGRP   00020 write by group

S_IXGRP   00010 execute/search by group

S_IROTH   00004 read by others

S_IWOTH   00002 write by others

S_IXOTH   00001 execute/search by others
        */
        
        
}



le ven 10-01-2003 à 17:00, Alexandre Dulaunoy a écrit :
> On Fri, 10 Jan 2003, David GLAUDE Mailing wrote:
> 
> > Christophe Schockaert wrote:
> > > Non, je crois qu'il veut une fonction qui convertit 0555 en r-xr-xr-x...
> > 
> > Cela doit se trouver dans les sources GNU de "ls".
> > Evidemment il faut faire du code GPL pour pouvoir copier ce petit bout 
> > de code. ;-)
> 
> Tu  peux  très  bien  t'en  inspirer  et  réimplementer  une  nouvelle
> version. ;-)
> 
> Pour l'info  dans 'ls',  ce n'est pas  si simple... ls  est disponible
> dans  fileutils (encore  un projet  GNU ;-).  'ls' ne  possède  pas de
> fonction directe mais utilise filemode (cf. lib dans fileutils). 
> 
> Donc, il  peut reprendre  fileutils (disponible sur  le mirror  gnu le
> plus proche). et ensuite regarder : 
> 
> ./fileutils-XY/lib/filemode.c (et ensuite mode_string p.ex.)
> 
> Je  crois que notre  ami possède  maintenant assez  d'information pour
> faire ses devoirs ;-)
> 
> adulau
> 
> 
> -- 
> --			      Alexandre Dulaunoy -- http://www.foo.be/
> --         http://pgp.ael.be:11371/pks/lookup?op=get&search=0x44E6CBCD
> "People who fight may lose.People who do not fight have already lost." 
> 							Bertolt Brecht
> 
> 
> 
> 
> 
> _______________________________________________
> Linux-bruxelles mailing list
> Linux-bruxelles at lists.bxlug.be
> http://lists.bxlug.be/mailman/listinfo/linux-bruxelles


__________________________________________________
Do you Yahoo!?
Yahoo! Mail Plus - Powerful. Affordable. Sign up now.
http://mailplus.yahoo.com




Plus d'informations sur la liste de diffusion Linux-bruxelles