Comment obtenir le format octal chmod à partir de stat () en c

J’ai besoin de savoir comment obtenir les permissions de fichier au format octal et l’enregistrer dans un fichier int. J’ai essayé quelque chose comme ça:

struct stat buf; stat(filename, &buf); int statchmod = buf.st_mode; printf("chmod: %i\n", statchmod); 

Mais sa sortie était:

 chmod: 33279 

et devrait être 777.

33279 est la représentation décimale de l’octal 100777. Vous obtenez une représentation décimale car vous avez demandé que le nombre soit imprimé sous forme décimale, via l’identificateur de format %i . %o l’imprimera sous forme octale.

Cependant, st_mode vous apportera beaucoup plus d’informations. (D’ici le 100 au début.) Vous voudrez utiliser les S_IRWXU (informations rwx de “l’utilisateur”), S_IRWXG (groupe) et S_IRWXO (autre) pour obtenir les permissions pour le propriétaire, le groupe et les autres . Celles-ci sont respectivement définies en 700, 070 et 007, toutes en représentation octale. Si vous les combinez et que vous filtrez les bits spécifiés à l’aide de AND, vous obtiendrez uniquement les données souhaitées.

Le programme final devient alors quelque chose comme ceci:

 struct stat buf; stat(filename, &buf); int statchmod = buf.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO); printf("chmod: %o\n", statchmod); 

Ressources:

  1. Plus d’informations sur les identifiants de format
  2. Constantes connexes

J’aime @ilias répondre. Cependant, si vous êtes comme moi et que vous voulez réellement la valeur chmod complète (par exemple, pour enregistrer et restaurer complètement les permissions de fichiers d’origine), cette routine le fera et garantira que les zéros non clairs ne sont pas non plus supprimés.

 static std::ssortingng getChmodPerms(std::ssortingng sFile) { struct stat buf; stat(sFile.c_str(),&buf); int statchmod = buf.st_mode; char mybuff[50]; sprintf(mybuff,"%#o",statchmod); std::ssortingng sResult(mybuff); return sResult; } 

C’est du C ++, mais il est facile de convertir en C si vous voulez.