--- rpl/src/instructions_o1.c 2020/04/06 14:24:00 1.103 +++ rpl/src/instructions_o1.c 2020/05/20 15:26:53 1.104 @@ -1265,7 +1265,7 @@ instruction_open(struct_processus *s_eta printf(" IMAXBEL, OPOST, ONLCR, OCRNL, ONOCR, ONLRET,\n"); printf(" OFILL, HUPCL, CLOCAL, CRTSCTS, ISIG, ICANON,\n"); printf(" ECHO, ECHOE, ECHOK, ECHONL, NOFLSH, TOSTOP,\n"); - printf(" IEXTEN\n"); + printf(" IEXTEN, RAW\n"); printf(" Address : { \"ADDRESS\" [ 127 0 0 1 ] }\n"); printf(" { \"HOST\" \"hostname\" }\n"); @@ -4219,7 +4219,11 @@ instruction_open(struct_processus *s_eta "CRTSCTS", #endif "ISIG", "ICANON", "ECHO", "ECHOE", "ECHOK", - "ECHONL", "NOFLSH", "TOSTOP", "IEXTEN", NULL }; + "ECHONL", "NOFLSH", "TOSTOP", "IEXTEN", + + "RAW", + + NULL }; tcflag_t fonctions_constantes[] = { /* c_iflag */ 1, IGNBRK, 1, BRKINT, 1, IGNPAR, 1, PARMRK, @@ -4240,9 +4244,12 @@ instruction_open(struct_processus *s_eta #ifdef CRTSCTS 3, CRTSCTS, #endif - /* c_lfkag */ + /* c_lflag */ 4, ISIG, 4, ICANON, 4, ECHO, 4, ECHOE, 4, ECHOK, - 4, ECHONL, 4, NOFLSH, 4, TOSTOP, 4, IEXTEN }; + 4, ECHONL, 4, NOFLSH, 4, TOSTOP, 4, IEXTEN, + + /* RAW */ + 5, 0 }; unsigned int fonction_courante; // On vient de trouver quelque chose à interpréter. @@ -4292,6 +4299,12 @@ instruction_open(struct_processus *s_eta [(fonction_courante * 2) + 1]; break; } + + case 5: + { + // RAW ne peut être négatif + break; + } } } else @@ -4326,15 +4339,64 @@ instruction_open(struct_processus *s_eta [(fonction_courante * 2) + 1]; break; } + + case 5: + { + // no ignbrk + tc.c_iflag &= ~(tcflag_t) IGNBRK; + // no brkint + tc.c_iflag &= ~(tcflag_t) BRKINT; + // no ignpar + tc.c_iflag &= ~(tcflag_t) IGNPAR; + // no parmrk + tc.c_iflag &= ~(tcflag_t) PARMRK; + // no inpck + tc.c_iflag &= ~(tcflag_t) INPCK; + // no istrip + tc.c_iflag &= ~(tcflag_t) ISTRIP; + // no inlcr + tc.c_iflag &= ~(tcflag_t) INLCR; + // no icrnl + tc.c_iflag &= ~(tcflag_t) ICRNL; + // no ixon + tc.c_iflag &= ~(tcflag_t) IXON; + // no ixoff + tc.c_iflag &= ~(tcflag_t) IXOFF; +#ifdef IXANY + // no ixany + tc.c_iflag &= ~(tcflag_t) IXANY; +#endif + // no opost + tc.c_oflag &= ~(tcflag_t) OPOST; + // no isig + tc.c_lflag &= ~(tcflag_t) ISIG; + // no icanon + tc.c_lflag &= ~(tcflag_t) ICANON; + // no echo + tc.c_lflag &= ~(tcflag_t) ECHO; + // no echoe + tc.c_lflag &= ~(tcflag_t) ECHOE; + // no echok + tc.c_lflag &= ~(tcflag_t) ECHOK; + } } } - break; + // On sort si on a trouvé un paramètre + // correct et donc différent de "NO RAW". + + if (!((negation == d_vrai) && + (fonctions_constantes[fonction_courante * 2] + == 5))) + { + break; + } } } if (fonctions[fonction_courante] == NULL) { + // Paramètre inconnu free(parametre_courant_majuscule); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat);