STAT(2)

NOM
stat, fstat, lstat - Obtenir le statut d'un fichier (file status).

SYNOPSIS
#include <sys/stat.h>
#include <unistd.h>

int stat(const char *file_name, struct stat *buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *file_name, struct stat *buf);

DESCRIPTION

Ces fonctions renvoient des informations a propos du fichier indique. Vous n'avez besoin d'aucun droit d'acces au fichier pour obtenir les informations, mais vous devez avoir le droit de parcours de tous les repertoires mentionnes dans le chemin menant au fichier.

stat recupere le statut du fichier pointe par file_name et remplit le buffer buf. lstat est identique A stat, sauf qu'il donne le statut d'un lien lui-meme et non pas du fichier pointe par ce lien. fstat est identique a stat, sauf que le fichier ouvert est pointe par le descripteur filedes, obtenu avec open(3).

Les trois fonctions retournent une structure stat declaree ainsi

    struct stat
    {
        dev_t         st_dev;      /* Peripherique                */
        ino_t         st_ino;      /* Numero i-noeud              */
        umode_t       st_mode;     /* Protection                  */
        nlink_t       st_nlink;    /* Nb liens materiels          */
        uid_t         st_uid;      /* UID proprietaire            */
        gid_t         st_gid;      /* GID proprietaire            */
        dev_t         st_rdev;     /* Type peripherique           */
        off_t         st_size;     /* Taille totale en octets     */
        unsigned long st_blksize;  /* Taille de bloc pour E/S     */
        unsigned long st_blocks;   /* Nombre de blocs alloues     */
        time_t        st_atime;    /* Heure dernier acces         */
        time_t        st_mtime;    /* Heure derniere modification */
        time_t        st_ctime;    /* Heure dernier changement    */
    };

Remarquez que st_blocks n'est pas toujours compte en blocs de la taille st_blksize, et que st_blksize peut a la place induire une notion de taille de bloc optimale pour des entrees/sorties efficaces.

Tous les systemes de fichiers de Linux n'implementent pas tous les champs "time". Traditionnellement st_atime est modifie par mknod(2), utime(2), read(2), write(2), et truncate(2). Generalement st_mtime est modifie par mknod(2), utime(2), et write(2). mais pas en cas de modification de proprietaire, de groupe, de compte de liens physiques ou de mode. Traditionnellement st_ctime est modifie par une ecriture, une lecture, ou une modification de donnees concernant l'i-noeud (proprietaire, groupe, mode, etc...)

Les macros suivantes sont fournies pour manipuler les statuts d'un fichier

    S_ISLNK(m)
        est-ce un lien symbolique ?

    S_ISREG(m)
        un fichier regulier ?

    S_ISDIR(m)
        un repertoire ?

    S_ISCHR(m)
        un peripherique en mode caractere ?

    S_ISBLK(m)
        un peripherique en mode blocs ?

    S_ISFIFO(m)
        une FIFO ?

    S_ISSOCK(m)
        une socket ?

Les attributs suivants correspondent au champ st_mode.

    S_IFMT
        00170000 masque de l'ensemble des bits du type de fichier

    S_IFSOCK
        0140000 socket

    S_IFLNK
        0120000 lien symbolique

    S_IFREG
        0100000 fichier regulier

    S_IFBLK
        0060000 peripherique blocs

    S_IFDIR
        0040000 repertoire

    S_IFCHR
        0020000 peripherique caracteres

    S_IFIFO
        0010000 fifo

    S_ISUID
        0004000 bit Set-UID

    S_ISGID
        0002000 bit Set-Gid

    S_ISVTX
        0001000 bit "sticky"

    S_IRWXU
        00700 droits de lecture/ecriture/execution du proprietaire

    S_IRUSR (S_IREAD)
        00400 le proprietaire a le droit de lecture

    S_IWUSR (S_IWRITE)
        00200 le proprietaire a le droit d'ecriture

    S_IXUSR (S_IEXEC)
        00100 le proprietaire a le droit d'execution

    S_IRWXG
        00070 droits de lecture/ecriture/execution du groupe

    S_IRGRP
        00040 le groupe a le droit de lecture

    S_IWGRP
        00020 le groupe a le droit d'ecriture

    S_IXGRP
        00010 le groupe a le droit d'execution

    S_IRWXO
        00007 droits de lecture/ecriture/execution des autres

    S_IROTH
        00004 les autres ont le droit de lecture

    S_IWOTH
        00002 les autres ont le droit d'ecriture

    S_IXOTH
        00001 les autres ont le droit d'execution

VALEUR RENVOYEE
Ces fonctions retournent zero si elles reussissent. En cas d'echec -1 est renvoye, et errno contient le code d'erreur.

ERREURS

EBADF
    filedes est un mauvais descripteur.

ENOENT
    Le fichier n'existe pas.

EXEMPLE
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
int
main (int nb_args, char * args [])
{
	struct stat	sts;
	if (nb_args != 2) {
		fprintf (stderr, "syntaxe : %s <fichier>\n", args [0]);
		exit (1);
	}

	if ( stat (args [1], & sts) != 0) {
		fprintf (stderr, "%s : erreur %X\n", args [0], errno);
		exit (1);
	}

	fprintf (stdout,
		"Peripherique : %d\n",
		sts . st_dev);
	fprintf (stdout,
		"Noeud : %ld\n",
		sts . st_ino);
	fprintf (stdout,
		"Protection : %o\n",
		sts . st_mode);
	fprintf (stdout,
		"nb liens materiels: %d\n",
		sts . st_nlink);
	fprintf (stdout,
		"ID proprietaire : %d\n",
		sts . st_uid);
	fprintf (stdout,
		"ID groupe: %d\n",
		sts . st_gid);
	fprintf (stdout,
		"Taille : %lu octets\n",
		sts . st_size);
	fprintf (stdout,
		"Taille de bloc : %lu\n",
		sts . st_blksize);
	fprintf (stdout,
		"Nombre de blocs : %lu\n",
		sts . st_blocks);
}

CONFORMITE
Les appels stat, etfstat sont conformes aux versions SVr4, PPOSIX, X/OPEN, BSD 4.3. L'appel lstat est conforme aux versions BSD 4.3 et SVr4. SVr4 mentionne des conditions d'erreurs supplementaires pour lstat EFAUL, EINTR, ENOLINK, et EOVERFLOW. Pour stat, etlstat SVr4 indique les conditions supplementaires EACCES, EFAULT, EINTR, ELOOP, EMULTIHOP, ENAMETOOLONG, ENOTDIR, ENOLINK, et EOVERLOW.

VOIR AUSSI
chmod(2), chown(2), readlink(2), utime(2)