IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques, systèmes et outils C Discussion :

Sortie du mode ncurses


Sujet :

Bibliothèques, systèmes et outils C

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Sortie du mode ncurses
    Bonjour,

    Je cale actuellement sur un petit problème lié à l'utilisation de la bibliothèque <ncurses.h>.

    Pour simplifier l'explication, je travaille sur une implémentation de RSA qui nécessite à un moment la saisie d'un mot de passe que je ne veux pas afficher dans la console.

    J'utilise pour cela une fonction enterPassword décrite ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    int enterPassword(mot08 * passwString)
    {
    	initscr(); 		/* Initialize the ncurses library	*/
    	cbreak(); 		/* option to disable buffering	*/
    	noecho(); 		/* disable the echoing of keystrokes	*/
    	printw("Veuillez saisir la clé secrète Ksym à utiliser pour le chiffrement/déchiffrement de la clé privée\n(Max 8 caractères)\n");
    	refresh(); 				/* update the screen, so the text is displayed	*/
    	getnstr(passwString, 8); 		/* get text until newline or carriage return	*/		
     
    	endwin(); 			/* close ncurses library	*/
     
     
    	return 0;
    }
    J'utilise cette fonction à plusieurs reprises dans mon programme et elle fait ce que je lui demande.
    Mon problème se situe plus précisément au niveau de l'affichage en sortie de cette fonction. En effet, dans le cas ou mon programme se poursuit avec une interaction avec l'utilisateur via la console (getc, scanf, ...), les différents messages gérés simplement par des printf ne sont pas affichés dans la console. Je me retrouve donc en "aveugle" même si les saisies demandées fonctionnent.

    A la fin de mon programme seulement, la console me rends la main et les différents messages des appels à printf sont affichés...

    J'ai donc l'impression qu'il y a un problème lors du basculement du mode curses au retour au mode console. J'ai essayé pas mal de choses comme forcer le retour au mode console avec les fonctions def_shell_mode et res_shell_mode qui sont normalement utilisés aux appels respectifs de initscr() et endwin() mais rien n'y fait.

    Même si le code ne sera pas aussi logique, je peux éventuellement modifier mon programme principal afin d'appeler cette fonction après toute interaction avec l'utilisateur mais j'aimerai tout de même bien comprendre ce qu'il se passe.

    Pour info, je développe sur Mac OS X avec gcc 4.2.1 et la version 5.7.1 de ncurses.

    Edit: J'ai également fait le test obtenant le même résultat sur une Fedora 14

    Merci d'avance pour votre éclairage.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Déjà je trouve très bizarre d'utiliser ncurses pour juste un truc et de quitter tout de suite après.
    Soit faire tout le programme avec ncurses ... soit sans.

    J'ose croire que ces deux lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cbreak(); 		/* option to disable buffering	*/
    	noecho(); 		/* disable the echoing of keystrokes	*/
    Modifie des paramètre de la console, qui ne sont pas restauré par la suite.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci pour ta réponse.

    Je n'utilise ncurses dans mon cas que pour gérer la saisie du mot de passe car je n'en ai pas l'utilité dan le reste du programme.
    La finalité est simplement que les caractères saisi à ce moment du programme ne soient pas affichés à la console.

    Je viens d'essayer en ajoutant echo() juste avant endwin(), le problème persiste.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Si vous n'utilisez que ncurses pour la réception des mots de passe en mode caché, pourquoi ne pas éviter d'utiliser la ncurses en reproduisant le comportement de noecho / echo.

    Je crois qu'il y a les outils nécessaires dans la FAQ pour ce faire.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci LittleWhite!

    J'étais en effet parti dans une solution qui n'était pas la plus simple. Ca m'aura permis de découvrir ncurses...

    Du coup j'ai utilisé le mode console raw évoqué dans la FAQ pour faire ma saisie de mot de passe masquée.

    Du coup ca donne ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    int enterPassword(mot08 * passwString)
    {
    	int i=0;
    	char c;	
     
    	printf("\nVeuillez saisir la clé secrète Ksym à utiliser pour le chiffrement/déchiffrement de la clé privée\t(Max 8 caractères)\n");
     
    	mode_raw(1);	/*	Passage du terminal en mode brut*/
     
    	/*	Saisie caractère par caractère par caractère pour éviter les débordement	*/
    	/*	La fonction fgets n'étant pas la plus adaptée lors de son utilisation en mode raw	*/
    	while (((c = getchar()) != '\r')&&(i<8))	/* la touche Entrée recoit '\r' en mode raw	*/
    	{
    		passwString[i] = c;
    		i++;
    	}
     
    	mode_raw(0);	/*	Passage du terminal en mode cooked	*/
     
    	return 0;
    }
    Il y a peut être une façon plus jolie de faire mais cette fonction répond tout à fait à mes attentes.

    Merci encore!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/08/2010, 14h05
  2. [Aide] Faire un calendrier en Perl mode console ou sorti web! [ Recherche Parrain Perl]
    Par kevinn dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 24/01/2010, 13h03
  3. [Easy Peasy] Erreur sortie mode veille
    Par fanf64 dans le forum Ubuntu
    Réponses: 0
    Dernier message: 06/10/2009, 18h19
  4. sortie du mode texte d'une shape
    Par potili2 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 30/06/2008, 20h22
  5. Réponses: 9
    Dernier message: 27/05/2008, 10h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo