version 1.45, 2012/02/23 13:05:08
|
version 1.46, 2012/02/23 15:38:29
|
Line 926 instruction_open(struct_processus *s_eta
|
Line 926 instruction_open(struct_processus *s_eta
|
|
|
struct_liste_chainee *l_element_courant; |
struct_liste_chainee *l_element_courant; |
struct_liste_chainee *l_element_courant_sous_objet; |
struct_liste_chainee *l_element_courant_sous_objet; |
|
struct_liste_chainee *parametre_courant; |
|
|
struct flock lock; |
struct flock lock; |
|
|
Line 955 instruction_open(struct_processus *s_eta
|
Line 956 instruction_open(struct_processus *s_eta
|
unsigned char *nom; |
unsigned char *nom; |
unsigned char *nom_temporaire; |
unsigned char *nom_temporaire; |
unsigned char options[12]; |
unsigned char options[12]; |
|
unsigned char *parametre_courant_majuscule; |
unsigned char *peripherique; |
unsigned char *peripherique; |
unsigned char *pointeur; |
unsigned char *pointeur; |
|
unsigned char *position; |
unsigned char protection; |
unsigned char protection; |
unsigned char protocole[16 + 1]; |
unsigned char protocole[16 + 1]; |
unsigned char *protocole_socket; |
unsigned char *protocole_socket; |
Line 3533 instruction_open(struct_processus *s_eta
|
Line 3536 instruction_open(struct_processus *s_eta
|
d_ex_erreur_fichier; |
d_ex_erreur_fichier; |
return; |
return; |
} |
} |
|
|
|
parametre_courant = (*s_parametres_tty).objet; |
|
|
|
// Le premier paramètre concerne la vitesse du port. Il doit |
|
// toujours être présent. |
|
|
|
if (parametre_courant == NULL) |
|
{ |
|
liberation(s_etat_processus, s_objet_argument); |
|
liberation(s_etat_processus, s_objet_resultat); |
|
|
|
(*s_etat_processus).erreur_execution = |
|
d_ex_erreur_parametre_fichier; |
|
return; |
|
} |
|
|
|
if ((*(*parametre_courant).donnee).type != CHN) |
|
{ |
|
liberation(s_etat_processus, s_objet_argument); |
|
liberation(s_etat_processus, s_objet_resultat); |
|
|
|
(*s_etat_processus).erreur_execution = |
|
d_ex_erreur_parametre_fichier; |
|
return; |
|
} |
|
|
|
if ((parametre_courant_majuscule = conversion_majuscule( |
|
(*(*parametre_courant).donnee).objet)) == NULL) |
|
{ |
|
liberation(s_etat_processus, s_objet_argument); |
|
liberation(s_etat_processus, s_objet_resultat); |
|
|
|
(*s_etat_processus).erreur_systeme = |
|
d_es_allocation_memoire; |
|
return; |
|
} |
|
|
|
position = parametre_courant_majuscule; |
|
|
|
while((*position) != d_code_fin_chaine) |
|
{ |
|
if ((*position) == ',') |
|
{ |
|
(*position) = ' '; |
|
} |
|
|
|
position++; |
|
} |
|
|
|
position = parametre_courant_majuscule; |
|
|
|
while((*position) != d_code_fin_chaine) |
|
{ |
|
if (isalnum((*position)) != 0) |
|
{ |
|
break; |
|
} |
|
|
|
position++; |
|
} |
|
|
|
// Vitesse |
|
|
|
unsigned char *vitesses[] = |
|
{ "B0", "B50", "B75", "B110", "B134", "B150", |
|
"B200", "B300", "B600", "B1200", "B1800", "B2400", |
|
"B4800", "B9600", "B19200", "B38400", "B57600", |
|
"B115200", "B230400", NULL }; |
|
int vitesses_constantes[] = |
|
{ B0, B50, B75, B110, B134, B150, B200, B300, B600, |
|
B1200, B1800, B2400, B4800, B9600, B19200, B38400, |
|
B57600, B115200, B230400, 0 }; |
|
unsigned int vitesse_courante; |
|
|
|
vitesse_courante = 0; |
|
|
|
while(vitesses[vitesse_courante] != NULL) |
|
{ |
|
if (strncmp(position, vitesses[vitesse_courante], |
|
strlen(vitesses[vitesse_courante])) == 0) |
|
{ |
|
if (position[strlen(vitesses[vitesse_courante])] == |
|
d_code_espace) |
|
{ |
|
tc.c_cflag &= ~CBAUD; |
|
tc.c_cflag |= vitesses_constantes[vitesse_courante]; |
|
position += strlen(vitesses[vitesse_courante]); |
|
|
|
break; |
|
} |
|
} |
|
|
|
vitesse_courante++; |
|
} |
|
|
|
if (vitesses[vitesse_courante] == NULL) |
|
{ |
|
// La vitesse indiquée n'est pas une vitesse autorisée. |
|
|
|
free(parametre_courant_majuscule); |
|
liberation(s_etat_processus, s_objet_argument); |
|
liberation(s_etat_processus, s_objet_resultat); |
|
|
|
(*s_etat_processus).erreur_execution = |
|
d_ex_erreur_parametre_fichier; |
|
return; |
|
} |
|
|
|
// Nombre de bits par caractère. |
|
|
|
while((*position) != d_code_fin_chaine) |
|
{ |
|
if (isalnum((*position)) != 0) |
|
{ |
|
break; |
|
} |
|
|
|
position++; |
|
} |
|
|
|
switch((*position)) |
|
{ |
|
case '5': |
|
{ |
|
tc.c_cflag &= ~CSIZE; |
|
tc.c_cflag |= CS5; |
|
break; |
|
} |
|
|
|
case '6': |
|
{ |
|
tc.c_cflag &= ~CSIZE; |
|
tc.c_cflag |= CS6; |
|
break; |
|
} |
|
|
|
case '7': |
|
{ |
|
tc.c_cflag &= ~CSIZE; |
|
tc.c_cflag |= CS7; |
|
break; |
|
} |
|
|
|
case '8': |
|
{ |
|
tc.c_cflag &= ~CSIZE; |
|
tc.c_cflag |= CS8; |
|
break; |
|
} |
|
|
|
default: |
|
{ |
|
free(parametre_courant_majuscule); |
|
liberation(s_etat_processus, s_objet_argument); |
|
liberation(s_etat_processus, s_objet_resultat); |
|
|
|
(*s_etat_processus).erreur_execution = |
|
d_ex_erreur_parametre_fichier; |
|
return; |
|
} |
|
} |
|
|
|
position++; |
|
|
|
if ((*position) != d_code_espace) |
|
{ |
|
free(parametre_courant_majuscule); |
|
liberation(s_etat_processus, s_objet_argument); |
|
liberation(s_etat_processus, s_objet_resultat); |
|
|
|
(*s_etat_processus).erreur_execution = |
|
d_ex_erreur_parametre_fichier; |
|
return; |
|
} |
|
|
|
// Parité |
|
|
|
while((*position) != d_code_fin_chaine) |
|
{ |
|
if (isalnum((*position)) != 0) |
|
{ |
|
break; |
|
} |
|
|
|
position++; |
|
} |
|
|
|
switch((*position)) |
|
{ |
|
case 'N': |
|
{ |
|
tc.c_cflag &= ~PARENB; |
|
break; |
|
} |
|
|
|
case 'O': |
|
{ |
|
tc.c_cflag |= PARENB; |
|
tc.c_cflag |= PARODD; |
|
break; |
|
} |
|
|
|
case 'E': |
|
{ |
|
tc.c_cflag |= PARENB; |
|
tc.c_cflag &= ~PARODD; |
|
break; |
|
} |
|
|
|
default: |
|
{ |
|
free(parametre_courant_majuscule); |
|
liberation(s_etat_processus, s_objet_argument); |
|
liberation(s_etat_processus, s_objet_resultat); |
|
|
|
(*s_etat_processus).erreur_execution = |
|
d_ex_erreur_parametre_fichier; |
|
return; |
|
} |
|
} |
|
|
|
if ((*position) != d_code_espace) |
|
{ |
|
free(parametre_courant_majuscule); |
|
liberation(s_etat_processus, s_objet_argument); |
|
liberation(s_etat_processus, s_objet_resultat); |
|
|
|
(*s_etat_processus).erreur_execution = |
|
d_ex_erreur_parametre_fichier; |
|
return; |
|
} |
|
|
|
// Bits de stop |
|
|
|
while((*position) != d_code_fin_chaine) |
|
{ |
|
if (isalnum((*position)) != 0) |
|
{ |
|
break; |
|
} |
|
|
|
position++; |
|
} |
|
|
|
switch((*position)) |
|
{ |
|
case '1': |
|
{ |
|
tc.c_cflag &= ~CSTOPB; |
|
break; |
|
} |
|
|
|
case '2': |
|
{ |
|
tc.c_cflag |= CSTOPB; |
|
break; |
|
} |
|
|
|
default: |
|
{ |
|
free(parametre_courant_majuscule); |
|
liberation(s_etat_processus, s_objet_argument); |
|
liberation(s_etat_processus, s_objet_resultat); |
|
|
|
(*s_etat_processus).erreur_execution = |
|
d_ex_erreur_parametre_fichier; |
|
return; |
|
} |
|
} |
|
|
|
// S'il reste autre chose que des espaces, il y a un |
|
// problème de paramètres. |
|
|
|
while((*position) != d_code_fin_chaine) |
|
{ |
|
if ((*position) != d_code_espace) |
|
{ |
|
free(parametre_courant_majuscule); |
|
liberation(s_etat_processus, s_objet_argument); |
|
liberation(s_etat_processus, s_objet_resultat); |
|
|
|
(*s_etat_processus).erreur_execution = |
|
d_ex_erreur_parametre_fichier; |
|
return; |
|
} |
|
|
|
position++; |
|
} |
|
|
|
// Autres paramètres |
|
|
|
free(parametre_courant_majuscule); |
|
|
|
while(parametre_courant != NULL) |
|
{ |
|
parametre_courant = (*parametre_courant).suivant; |
|
} |
} |
} |
|
|
strcpy((*((struct_fichier *) (*s_objet_resultat).objet)).nom, nom); |
strcpy((*((struct_fichier *) (*s_objet_resultat).objet)).nom, nom); |