• # pas la bonne méthode

    Posté par . En réponse au message Masquer stdout puis réafficher.. Évalué à 3.

    Tu ne peux pas car en fait stdin et stdout correspondent plus ou moins au même fichier, l'un étant ouvert en lecture, l'autre en écriture. Le fait de voir ce que tu écris dans le terminal, ca ne signifie en aucun cas que tout est envoyé sur stdout. Ce n'est en fait pas du tout le cas.

    De plus, printf équivaut à un fprintf sur stdout, celui-ci étant bufferisé. Donc pour être sûr qu'on voit le prompt qui demande le mot de passe, il faut flusher avant de demander le mot de passe.

    Enfin la méthode classique pour demander des mots de passe, quand on est sur un terminal, c'est d'utiliser les fonctions déclarées dans le fichier termios.h. Je la fais courte dans un petit programme d'exemple (sans malloc, toussa ...):



    #include <stdio.h>
    #include <unistd.h>
    #include <termios.h>

    char password[1000];

    char* passwd ()
    {
    int fail;
    char *p;
    struct termios termio;

    fail = tcgetattr (1, &termio);
    if (fail) {
    perror ("tcgetattr");
    return 0;
    }

    termio.c_lflag &= ~ECHO;
    fail = tcsetattr (1, TCSANOW, &termio);
    if (fail) {
    perror ("tcsetattr");
    return 0;
    }

    p = fgets (password, -1+sizeof password, stdin);
    termio.c_lflag |= ECHO;
    tcsetattr (1, TCSANOW, &termio);

    return p;
    }

    int main ()
    {
    *password = 0;
    fprintf (stdout, "Password (ne s'affiche pas): ");
    fflush (stdout);

    passwd ();
    if (!*password)
    return 1;

    password[-1+sizeof password] = 0;
    printf ("\npassword: %s", password);
    return 0;
    }