[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[linux] [devel] code d'erreur de getpwent()



Bonsoir,

Toujours dans ma saga : le C sous Linux, j'ai une petite question concernant 
la fonction 'getpwent()'.

Cette fonction permet de lire les lignes de /etc/passwd et retourne un 
pointeur vers une structure contenant les champs de chaque ligne.
Quand le fichier est lu la valeur de retour est NULL.
Cette valeur de retour est egalement NULL lorsqu'une erreur se produit (le 
code d'erreur se trouvant alors dans 'errno').

Je me suis dit que le bout de code suivant devrait faire l'affaire :

errno = 0;
passp = getpwent();
if ( !passp )
{
    if ( errno !=0 )
    {
        perror("getpwent() a échoué!");
        abort();
    }
    else
    /* Fin du fichier /etc/passwd */
}

Ben non, quand on arrive a la fin du fichier, errno vaut 2, ce qui signifie :
"No such file or directory".

Est-ce normal ou me suis-je encore completement plante?

Merci

Philippe


Voici un exemple de programme affichant le fichier "/etc/passwd" :

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <pwd.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
    struct passwd *passp;

    errno = 0;
    while ( (passp = getpwent()) != NULL )
    {
        printf("pw_name = %s\n", passp->pw_name);
        printf("pw_passwd = %s\n", passp->pw_passwd);
        printf("pw_uid = %d\n", passp->pw_uid);
        printf("pw_gid = %d\n", passp->pw_gid);
        printf("pw_gecos = %s\n", passp->pw_gecos);
        printf("pw_dir = %s\n", passp->pw_dir);
        printf("pw_shell = %s\n", passp->pw_shell);
        printf("------------------------------------\n");
    }

    if ( errno != 0 )
    {
        perror("getpwent() failed!\n");
        endpwent();
        abort();
    }
    else
    {
        printf("File /etc/passwd browsed.\n");
        endpwent();
    }

    return 0;
}

[ Soyez précis dans vos sujets svp afin de déterminer directement  ]
[ le type de demande...                                            ]
[ Pour vous (dés)inscrire, aller sur http://linuxbe.org/ml.php     ]
[ http://LinuxBe.org              Contact: listmaster@linuxbe.org  ]