![]() ![]() | ![]() |
1.1 bertrand 1: /*
2: ================================================================================
1.55 ! bertrand 3: RPL/2 (R) version 4.1.9
1.43 bertrand 4: Copyright (C) 1989-2012 Dr. BERTRAND Joël
1.1 bertrand 5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
1.17 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 24:
25:
26: /*
27: ================================================================================
28: Fonction 'oct'
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_oct(struct_processus *s_etat_processus)
40: {
41: (*s_etat_processus).erreur_execution = d_ex;
42:
43: if ((*s_etat_processus).affichage_arguments == 'Y')
44: {
45: printf("\n OCT ");
46:
47: if ((*s_etat_processus).langue == 'F')
48: {
49: printf("(base octale)\n\n");
50: printf(" Aucun argument\n");
51: }
52: else
53: {
54: printf("(octal base)\n\n");
55: printf(" No argument\n");
56: }
57:
58: return;
59: }
60: else if ((*s_etat_processus).test_instruction == 'Y')
61: {
62: (*s_etat_processus).nombre_arguments = -1;
63: return;
64: }
65:
66: if (test_cfsf(s_etat_processus, 31) == d_vrai)
67: {
68: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
69: {
70: return;
71: }
72: }
73:
74: sf(s_etat_processus, 43);
75: cf(s_etat_processus, 44);
76:
77: return;
78: }
79:
80:
81: /*
82: ================================================================================
83: Fonction 'over'
84: ================================================================================
85: Entrées :
86: --------------------------------------------------------------------------------
87: Sorties :
88: --------------------------------------------------------------------------------
89: Effets de bord : néant
90: ================================================================================
91: */
92:
93: void
94: instruction_over(struct_processus *s_etat_processus)
95: {
96: struct_objet *s_objet;
97:
98: (*s_etat_processus).erreur_execution = d_ex;
99:
100: if ((*s_etat_processus).affichage_arguments == 'Y')
101: {
102: printf("\n OVER ");
103:
104: if ((*s_etat_processus).langue == 'F')
105: {
106: printf("(duplication de l'objet de niveau 2)\n\n");
107: }
108: else
109: {
110: printf("(duplication of level 2 object)\n\n");
111: }
112:
113: printf(" 2: %s, %s, %s, %s, %s, %s,\n"
114: " %s, %s, %s, %s, %s,\n"
115: " %s, %s, %s, %s, %s,\n"
116: " %s, %s, %s, %s,\n"
117: " %s, %s\n",
118: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
119: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
120: d_SQL, d_SLB, d_PRC, d_MTX);
121: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
122: " %s, %s, %s, %s, %s,\n"
123: " %s, %s, %s, %s, %s,\n"
124: " %s, %s, %s, %s,\n"
125: " %s, %s\n",
126: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
127: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
128: d_SQL, d_SLB, d_PRC, d_MTX);
129: printf("-> 3: %s, %s, %s, %s, %s, %s,\n"
130: " %s, %s, %s, %s, %s,\n"
131: " %s, %s, %s, %s, %s,\n"
132: " %s, %s, %s, %s,\n"
133: " %s, %s\n",
134: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
135: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
136: d_SQL, d_SLB, d_PRC, d_MTX);
137: printf(" ...\n");
138: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
139: " %s, %s, %s, %s, %s,\n"
140: " %s, %s, %s, %s, %s,\n"
141: " %s, %s, %s, %s,\n"
142: " %s, %s\n",
143: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
144: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
145: d_SQL, d_SLB, d_PRC, d_MTX);
146:
147: return;
148: }
149: else if ((*s_etat_processus).test_instruction == 'Y')
150: {
151: (*s_etat_processus).nombre_arguments = -1;
152: return;
153: }
154:
155: if (test_cfsf(s_etat_processus, 31) == d_vrai)
156: {
157: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
158: {
159: return;
160: }
161: }
162:
163: if ((*s_etat_processus).hauteur_pile_operationnelle < 2)
164: {
165: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
166: return;
167: }
168:
169: s_objet = copie_objet(s_etat_processus,
170: (*(*(*s_etat_processus).l_base_pile).suivant).donnee, 'P');
171:
172: if (s_objet == NULL)
173: {
174: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
175: return;
176: }
177:
178: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
179: s_objet) == d_erreur)
180: {
181: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
182: return;
183: }
184:
185: return;
186: }
187:
188:
189: /*
190: ================================================================================
191: Fonction 'or'
192: ================================================================================
193: Entrées : pointeur sur une structure struct_processus
194: --------------------------------------------------------------------------------
195: Sorties :
196: --------------------------------------------------------------------------------
197: Effets de bord : néant
198: ================================================================================
199: */
200:
201: void
202: instruction_or(struct_processus *s_etat_processus)
203: {
204: struct_liste_chainee *l_element_courant;
205: struct_liste_chainee *l_element_precedent;
206:
207: struct_objet *s_copie_argument_1;
208: struct_objet *s_copie_argument_2;
209: struct_objet *s_objet_argument_1;
210: struct_objet *s_objet_argument_2;
211: struct_objet *s_objet_resultat;
212:
213: unsigned long nombre_elements;
214:
215: (*s_etat_processus).erreur_execution = d_ex;
216:
217: if ((*s_etat_processus).affichage_arguments == 'Y')
218: {
219: printf("\n OR ");
220:
221: if ((*s_etat_processus).langue == 'F')
222: {
223: printf("(opérateur ou)\n\n");
224: }
225: else
226: {
227: printf("(or operator)\n\n");
228: }
229:
230: printf(" 2: %s, %s\n", d_INT, d_REL);
231: printf(" 1: %s, %s\n", d_INT, d_REL);
232: printf("-> 1: %s\n\n", d_INT);
233:
234: printf(" 2: %s\n", d_BIN);
235: printf(" 1: %s\n", d_BIN);
236: printf("-> 1: %s\n\n", d_BIN);
237:
238: printf(" 2: %s\n", d_NOM);
239: printf(" 1: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
240: printf("-> 1: %s\n\n", d_ALG);
241:
242: printf(" 2: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
243: printf(" 1: %s\n", d_NOM);
244: printf("-> 1: %s\n\n", d_ALG);
245:
246: printf(" 2: %s\n", d_ALG);
247: printf(" 1: %s\n", d_ALG);
248: printf("-> 1: %s\n\n", d_ALG);
249:
250: printf(" 2: %s\n", d_RPN);
251: printf(" 1: %s\n", d_RPN);
252: printf("-> 1: %s\n", d_RPN);
253:
254: return;
255: }
256: else if ((*s_etat_processus).test_instruction == 'Y')
257: {
258: (*s_etat_processus).nombre_arguments = 0;
259: return;
260: }
261:
262: if (test_cfsf(s_etat_processus, 31) == d_vrai)
263: {
264: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
265: {
266: return;
267: }
268: }
269:
270: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
271: &s_objet_argument_1) == d_erreur)
272: {
273: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
274: return;
275: }
276:
277: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
278: &s_objet_argument_2) == d_erreur)
279: {
280: liberation(s_etat_processus, s_objet_argument_1);
281:
282: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
283: return;
284: }
285:
286: /*
287: --------------------------------------------------------------------------------
288: OR logique
289: --------------------------------------------------------------------------------
290: */
291:
292: if ((((*s_objet_argument_1).type == INT) ||
293: ((*s_objet_argument_1).type == REL)) &&
294: (((*s_objet_argument_2).type == INT) ||
295: ((*s_objet_argument_2).type == REL)))
296: {
297: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
298: {
299: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
300: return;
301: }
302:
303: if ((*s_objet_argument_1).type == INT)
304: {
305: if ((*s_objet_argument_2).type == INT)
306: {
307: if (((*((integer8 *) (*s_objet_argument_1).objet)) != 0) ||
308: ((*((integer8 *) (*s_objet_argument_2).objet)) != 0))
309: {
310: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
311: }
312: else
313: {
314: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
315: }
316: }
317: else
318: {
319: if (((*((integer8 *) (*s_objet_argument_1).objet)) != 0) ||
320: ((*((real8 *) (*s_objet_argument_2).objet)) != 0))
321: {
322: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
323: }
324: else
325: {
326: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
327: }
328: }
329: }
330: else
331: {
332: if ((*s_objet_argument_2).type == INT)
333: {
334: if (((*((real8 *) (*s_objet_argument_1).objet)) != 0) ||
335: ((*((integer8 *) (*s_objet_argument_2).objet)) != 0))
336: {
337: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
338: }
339: else
340: {
341: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
342: }
343: }
344: else
345: {
346: if (((*((real8 *) (*s_objet_argument_1).objet)) != 0) ||
347: ((*((real8 *) (*s_objet_argument_2).objet)) != 0))
348: {
349: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
350: }
351: else
352: {
353: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
354: }
355: }
356: }
357: }
358:
359: /*
360: --------------------------------------------------------------------------------
361: OR binaire
362: --------------------------------------------------------------------------------
363: */
364:
365: else if (((*s_objet_argument_1).type == BIN) &&
366: ((*s_objet_argument_2).type == BIN))
367: {
368: if ((s_objet_resultat = allocation(s_etat_processus, BIN)) == NULL)
369: {
370: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
371: return;
372: }
373:
374: (*((logical8 *) (*s_objet_resultat).objet)) =
375: (*((logical8 *) (*s_objet_argument_1).objet)) |
376: (*((logical8 *) (*s_objet_argument_2).objet));
377: }
378:
379: /*
380: --------------------------------------------------------------------------------
381: OR entre des arguments complexes
382: --------------------------------------------------------------------------------
383: */
384:
385: /*
386: * Nom ou valeur numérique / Nom ou valeur numérique
387: */
388:
389: else if ((((*s_objet_argument_1).type == NOM) &&
390: (((*s_objet_argument_2).type == NOM) ||
391: ((*s_objet_argument_2).type == INT) ||
392: ((*s_objet_argument_2).type == REL))) ||
393: (((*s_objet_argument_2).type == NOM) &&
394: (((*s_objet_argument_1).type == INT) ||
395: ((*s_objet_argument_1).type == REL))))
396: {
397: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
398: {
399: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
400: return;
401: }
402:
403: if (((*s_objet_resultat).objet =
404: allocation_maillon(s_etat_processus)) == NULL)
405: {
406: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
407: return;
408: }
409:
410: l_element_courant = (*s_objet_resultat).objet;
411:
412: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
413: == NULL)
414: {
415: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
416: return;
417: }
418:
419: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
420: .nombre_arguments = 0;
421: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
422: .fonction = instruction_vers_niveau_superieur;
423:
424: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
425: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
426: {
427: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
428: return;
429: }
430:
431: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
432: .nom_fonction, "<<");
433:
434: if (((*l_element_courant).suivant =
435: allocation_maillon(s_etat_processus)) == NULL)
436: {
437: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
438: return;
439: }
440:
441: l_element_courant = (*l_element_courant).suivant;
442: (*l_element_courant).donnee = s_objet_argument_2;
443:
444: if (((*l_element_courant).suivant =
445: allocation_maillon(s_etat_processus)) == NULL)
446: {
447: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
448: return;
449: }
450:
451: l_element_courant = (*l_element_courant).suivant;
452: (*l_element_courant).donnee = s_objet_argument_1;
453:
454: if (((*l_element_courant).suivant =
455: allocation_maillon(s_etat_processus)) == NULL)
456: {
457: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
458: return;
459: }
460:
461: l_element_courant = (*l_element_courant).suivant;
462:
463: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
464: == NULL)
465: {
466: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
467: return;
468: }
469:
470: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
471: .nombre_arguments = 0;
472: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
473: .fonction = instruction_or;
474:
475: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
476: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
477: {
478: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
479: return;
480: }
481:
482: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
483: .nom_fonction, "OR");
484:
485: if (((*l_element_courant).suivant =
486: allocation_maillon(s_etat_processus)) == NULL)
487: {
488: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
489: return;
490: }
491:
492: l_element_courant = (*l_element_courant).suivant;
493:
494: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
495: == NULL)
496: {
497: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
498: return;
499: }
500:
501: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
502: .nombre_arguments = 0;
503: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
504: .fonction = instruction_vers_niveau_inferieur;
505:
506: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
507: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
508: {
509: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
510: return;
511: }
512:
513: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
514: .nom_fonction, ">>");
515:
516: (*l_element_courant).suivant = NULL;
517:
518: s_objet_argument_1 = NULL;
519: s_objet_argument_2 = NULL;
520: }
521:
522: /*
523: * Nom ou valeur numérique / Expression
524: */
525:
526: else if ((((*s_objet_argument_1).type == ALG) ||
527: ((*s_objet_argument_1).type == RPN)) &&
528: (((*s_objet_argument_2).type == NOM) ||
529: ((*s_objet_argument_2).type == INT) ||
530: ((*s_objet_argument_2).type == REL)))
531: {
532: nombre_elements = 0;
533: l_element_courant = (struct_liste_chainee *)
534: (*s_objet_argument_1).objet;
535:
536: while(l_element_courant != NULL)
537: {
538: nombre_elements++;
539: l_element_courant = (*l_element_courant).suivant;
540: }
541:
542: if (nombre_elements == 2)
543: {
544: liberation(s_etat_processus, s_objet_argument_1);
545: liberation(s_etat_processus, s_objet_argument_2);
546:
547: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
548: return;
549: }
550:
551: if ((s_objet_resultat = copie_objet(s_etat_processus,
552: s_objet_argument_1, 'N')) == NULL)
553: {
554: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
555: return;
556: }
557:
558: l_element_courant = (struct_liste_chainee *)
559: (*s_objet_resultat).objet;
560: l_element_precedent = l_element_courant;
561: l_element_courant = (*l_element_courant).suivant;
562:
563: if (((*l_element_precedent).suivant =
564: allocation_maillon(s_etat_processus)) == NULL)
565: {
566: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
567: return;
568: }
569:
570: (*(*l_element_precedent).suivant).donnee = s_objet_argument_2;
571: (*(*l_element_precedent).suivant).suivant = l_element_courant;
572:
573: while((*l_element_courant).suivant != NULL)
574: {
575: l_element_precedent = l_element_courant;
576: l_element_courant = (*l_element_courant).suivant;
577: }
578:
579: if (((*l_element_precedent).suivant =
580: allocation_maillon(s_etat_processus)) == NULL)
581: {
582: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
583: return;
584: }
585:
586: if (((*(*l_element_precedent).suivant).donnee =
587: allocation(s_etat_processus, FCT)) == NULL)
588: {
589: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
590: return;
591: }
592:
593: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
594: .donnee).objet)).nombre_arguments = 0;
595: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
596: .donnee).objet)).fonction = instruction_or;
597:
598: if (((*((struct_fonction *) (*(*(*l_element_precedent)
599: .suivant).donnee).objet)).nom_fonction =
600: malloc(3 * sizeof(unsigned char))) == NULL)
601: {
602: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
603: return;
604: }
605:
606: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
607: .suivant).donnee).objet)).nom_fonction, "OR");
608:
609: (*(*l_element_precedent).suivant).suivant = l_element_courant;
610:
611: s_objet_argument_2 = NULL;
612: }
613:
614: /*
615: * Expression / Nom ou valeur numérique
616: */
617:
618: else if ((((*s_objet_argument_1).type == NOM) ||
619: ((*s_objet_argument_1).type == INT) ||
620: ((*s_objet_argument_1).type == REL)) &&
621: (((*s_objet_argument_2).type == ALG) ||
622: ((*s_objet_argument_2).type == RPN)))
623: {
624: nombre_elements = 0;
625: l_element_courant = (struct_liste_chainee *)
626: (*s_objet_argument_2).objet;
627:
628: while(l_element_courant != NULL)
629: {
630: nombre_elements++;
631: l_element_courant = (*l_element_courant).suivant;
632: }
633:
634: if (nombre_elements == 2)
635: {
636: liberation(s_etat_processus, s_objet_argument_1);
637: liberation(s_etat_processus, s_objet_argument_2);
638:
639: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
640: return;
641: }
642:
643: if ((s_objet_resultat = copie_objet(s_etat_processus,
644: s_objet_argument_2, 'N')) == NULL)
645: {
646: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
647: return;
648: }
649:
650: l_element_courant = (struct_liste_chainee *)
651: (*s_objet_resultat).objet;
652: l_element_precedent = l_element_courant;
653:
654: while((*l_element_courant).suivant != NULL)
655: {
656: l_element_precedent = l_element_courant;
657: l_element_courant = (*l_element_courant).suivant;
658: }
659:
660: if (((*l_element_precedent).suivant =
661: allocation_maillon(s_etat_processus)) == NULL)
662: {
663: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
664: return;
665: }
666:
667: (*(*l_element_precedent).suivant).donnee = s_objet_argument_1;
668: l_element_precedent = (*l_element_precedent).suivant;
669:
670: if (((*l_element_precedent).suivant =
671: allocation_maillon(s_etat_processus)) == NULL)
672: {
673: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
674: return;
675: }
676:
677: if (((*(*l_element_precedent).suivant).donnee =
678: allocation(s_etat_processus, FCT)) == NULL)
679: {
680: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
681: return;
682: }
683:
684: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
685: .donnee).objet)).nombre_arguments = 0;
686: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
687: .donnee).objet)).fonction = instruction_or;
688:
689: if (((*((struct_fonction *) (*(*(*l_element_precedent)
690: .suivant).donnee).objet)).nom_fonction =
691: malloc(3 * sizeof(unsigned char))) == NULL)
692: {
693: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
694: return;
695: }
696:
697: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
698: .suivant).donnee).objet)).nom_fonction, "OR");
699:
700: (*(*l_element_precedent).suivant).suivant = l_element_courant;
701:
702: s_objet_argument_1 = NULL;
703: }
704:
705: /*
706: * Expression / Expression
707: */
708:
709: else if ((((*s_objet_argument_1).type == ALG) &&
710: ((*s_objet_argument_2).type == ALG)) ||
711: (((*s_objet_argument_1).type == RPN) &&
712: ((*s_objet_argument_2).type == RPN)))
713: {
714: nombre_elements = 0;
715: l_element_courant = (struct_liste_chainee *)
716: (*s_objet_argument_1).objet;
717:
718: while(l_element_courant != NULL)
719: {
720: nombre_elements++;
721: l_element_courant = (*l_element_courant).suivant;
722: }
723:
724: if (nombre_elements == 2)
725: {
726: liberation(s_etat_processus, s_objet_argument_1);
727: liberation(s_etat_processus, s_objet_argument_2);
728:
729: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
730: return;
731: }
732:
733: nombre_elements = 0;
734: l_element_courant = (struct_liste_chainee *)
735: (*s_objet_argument_2).objet;
736:
737: while(l_element_courant != NULL)
738: {
739: nombre_elements++;
740: l_element_courant = (*l_element_courant).suivant;
741: }
742:
743: if (nombre_elements == 2)
744: {
745: liberation(s_etat_processus, s_objet_argument_1);
746: liberation(s_etat_processus, s_objet_argument_2);
747:
748: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
749: return;
750: }
751:
752: if ((s_copie_argument_1 = copie_objet(s_etat_processus,
753: s_objet_argument_1, 'N')) == NULL)
754: {
755: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
756: return;
757: }
758:
759: if ((s_copie_argument_2 = copie_objet(s_etat_processus,
760: s_objet_argument_2, 'N')) == NULL)
761: {
762: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
763: return;
764: }
765:
766: l_element_courant = (struct_liste_chainee *)
767: (*s_copie_argument_1).objet;
768: (*s_copie_argument_1).objet = (void *) (*((struct_liste_chainee *)
769: (*s_copie_argument_1).objet)).suivant;
770:
771: liberation(s_etat_processus, (*l_element_courant).donnee);
772: free(l_element_courant);
773:
774: l_element_courant = (struct_liste_chainee *)
775: (*s_copie_argument_2).objet;
776: l_element_precedent = l_element_courant;
777: s_objet_resultat = s_copie_argument_2;
778:
779: while((*l_element_courant).suivant != NULL)
780: {
781: l_element_precedent = l_element_courant;
782: l_element_courant = (*l_element_courant).suivant;
783: }
784:
785: liberation(s_etat_processus, (*l_element_courant).donnee);
786: free(l_element_courant);
787:
788: (*l_element_precedent).suivant = (struct_liste_chainee *)
789: (*s_copie_argument_1).objet;
790: free(s_copie_argument_1);
791:
792: l_element_courant = (*l_element_precedent).suivant;
793: while((*l_element_courant).suivant != NULL)
794: {
795: l_element_precedent = l_element_courant;
796: l_element_courant = (*l_element_courant).suivant;
797: }
798:
799: if (((*l_element_precedent).suivant =
800: allocation_maillon(s_etat_processus)) == NULL)
801: {
802: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
803: return;
804: }
805:
806: (*(*l_element_precedent).suivant).suivant = l_element_courant;
807: l_element_courant = (*l_element_precedent).suivant;
808:
809: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
810: == NULL)
811: {
812: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
813: return;
814: }
815:
816: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
817: .nombre_arguments = 0;
818: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
819: .fonction = instruction_or;
820:
821: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
822: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
823: {
824: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
825: return;
826: }
827:
828: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
829: .nom_fonction, "OR");
830: }
831:
832: /*
833: --------------------------------------------------------------------------------
834: OR impossible
835: --------------------------------------------------------------------------------
836: */
837:
838: else
839: {
840: liberation(s_etat_processus, s_objet_argument_1);
841: liberation(s_etat_processus, s_objet_argument_2);
842:
843: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
844: return;
845: }
846:
847: liberation(s_etat_processus, s_objet_argument_1);
848: liberation(s_etat_processus, s_objet_argument_2);
849:
850: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
851: s_objet_resultat) == d_erreur)
852: {
853: return;
854: }
855:
856: return;
857: }
858:
859:
860: /*
861: ================================================================================
862: Fonction 'open'
863: ================================================================================
864: Entrées : pointeur sur une structure struct_processus
865: --------------------------------------------------------------------------------
866: Sorties :
867: --------------------------------------------------------------------------------
868: Effets de bord : néant
869: ================================================================================
870: */
871:
872: void
873: instruction_open(struct_processus *s_etat_processus)
874: {
875: /*
876: * Type d'ouverture :
877: * NEW : crée un nouveau fichier, retourne une erreur si un fichier
878: * préexiste ;
879: * OLD : ouvre un fichier existant, retourne une erreur si le fichier
880: * n'existe pas ;
881: * REPLACE : remplace un fichier existant, retourne une erreur s'il n'y
882: * a aucun fichier à effacer ;
883: * UNKNOWN : ouvre un fichier existant ou crée un nouveau fichier ;
884: * SCRATCH : crée un fichier temporaire automatiquement effacé lors
885: * de sa fermeture (protection automatique 'readwrite');
886: *
887: * Type d'accès :
888: * SEQUENTIAL : accès séquentiel ;
889: * DIRECT : accès direct ;
890: * KEYED : accès indexé.
891: *
892: * Protection :
893: * READONLY : lecture seule ;
894: * WRITEONLY : écriture seule ;
895: * READWRITE : lecture et écriture autorisées.
896: *
897: * Format :
898: * FORMATTED : fichier texte ;
899: * UNFORMATTED : fichier binaire.
1.27 bertrand 900: * FLOW : chaîne de caractères sans format (en tant qu'objet
901: * binaire comme "\x00avz\xFD")
1.1 bertrand 902: */
903:
904: file *descripteur;
905:
906: int buffer_emission;
907: int buffer_reception;
908: int drapeau;
909: int priorite;
910: int protocole_numerique;
911: int timeout_emission;
912: int timeout_reception;
913: int type;
914:
915: integer8 adresse[16];
916: integer8 nombre_maximal_connexions;
917: integer8 port;
918: integer8 position_clef;
919:
920: logical1 erreur;
921: logical1 existence;
1.48 bertrand 922: logical1 negation;
1.1 bertrand 923: logical1 ouverture;
924: logical1 presence_port;
925:
1.6 bertrand 926: sqlite3 *sqlite;
927:
1.1 bertrand 928: struct_liste_chainee *l_element_courant;
929: struct_liste_chainee *l_element_courant_sous_objet;
1.46 bertrand 930: struct_liste_chainee *parametre_courant;
1.1 bertrand 931:
932: struct flock lock;
933:
934: struct addrinfo *resolution;
935: struct addrinfo *resolution_courante;
936:
937: struct protoent *s_protocole;
938:
939: struct sockaddr_un socket_unix;
940: struct sockaddr_in socket_ipv4;
1.17 bertrand 941: # ifdef IPV6
1.1 bertrand 942: struct sockaddr_in6 socket_ipv6;
1.17 bertrand 943: # endif
1.1 bertrand 944:
945: struct_objet *s_objet_argument;
946: struct_objet *s_objet_resultat;
1.45 bertrand 947: struct_objet *s_parametres_tty;
948:
949: struct termios tc;
1.1 bertrand 950:
951: uint32_t adresse_ipv4;
952:
953: unsigned char *argument_majuscule;
954: unsigned char *chaine_descripteurs;
955: unsigned char format;
956: unsigned char *hote;
957: unsigned char *nom;
958: unsigned char *nom_temporaire;
959: unsigned char options[12];
1.46 bertrand 960: unsigned char *parametre_courant_majuscule;
1.1 bertrand 961: unsigned char *peripherique;
962: unsigned char *pointeur;
1.46 bertrand 963: unsigned char *position;
1.1 bertrand 964: unsigned char protection;
965: unsigned char protocole[16 + 1];
966: unsigned char *protocole_socket;
967: unsigned char type_acces;
968: unsigned char type_adresse;
969: unsigned char type_arguments;
970: unsigned char type_domaine;
971: unsigned char type_ouverture;
972: unsigned char type_socket;
973:
974: unsigned long i;
975: unsigned long nombre_elements;
976: unsigned long prochain_descripteur;
977: unsigned long unite;
978:
979: # define d_BIND_TO_DEVICE 0
980: # define d_BROADCAST 1
981: # define d_DONT_ROUTE 2
982: # define d_KEEP_ALIVE 3
983: # define d_PRIORITY 4
984: # define d_RECEIVE_BUFFER 5
985: # define d_FORCE_RECEIVE_BUFFER 6
986: # define d_SEND_BUFFER 7
987: # define d_FORCE_SEND_BUFFER 8
988: # define d_RECEIVING_TIMEOUT 9
989: # define d_SENDING_TIMEOUT 10
990: # define d_REUSE_ADDRESS 11
991:
992: /*
993: * Argument : { "ouverture" "accès" "format" [ { "nom" } 'protection' ] }
994: */
995:
996: (*s_etat_processus).erreur_execution = d_ex;
997:
998: if ((*s_etat_processus).affichage_arguments == 'Y')
999: {
1000: printf("\n OPEN ");
1001:
1002: if ((*s_etat_processus).langue == 'F')
1003: {
1004: printf("(ouverture d'un fichier, d'une socket ou d'un sémaphore)"
1005: "\n\n");
1006: }
1007: else
1008: {
1009: printf("(open file, socket or semaphore)\n\n");
1010: }
1011:
1012: printf(" 1: %s\n", d_LST);
1013: printf("-> 1: %s, %s\n\n", d_FCH, d_SCK);
1014:
1015: printf(" 1: %s\n", d_CHN);
1016: printf("-> 1: %s\n\n", d_SPH);
1017:
1018: if ((*s_etat_processus).langue == 'F')
1019: {
1020: printf(" Utilisation :\n\n");
1021: }
1022: else
1023: {
1024: printf(" Usage:\n\n");
1025: }
1026:
1027: printf(" { \"filetype\" \"access\" \"format\" { \"name\" "
1028: "\"file name\" } \"protection\" } OPEN\n");
1.45 bertrand 1029: printf(" { \"filetype\" \"access\" \"format\" { \"name\" "
1030: "\"file name\" } \n"
1031: " { \"stty\" { \"stty parameters\" ... } } } OPEN\n");
1.1 bertrand 1032: printf(" { \"sockettype\" { \"name\" \"local name\" } } OPEN\n");
1033: printf(" { \"sockettype\" \"socketdomain\" \"protection\" } OPEN\n");
1.54 bertrand 1034: printf(" \"/semaphore\" OPEN\n\n");
1.1 bertrand 1035:
1036: printf(" File type : NEW/OLD/REPLACE/UNKNOWN/SCRATCH\n");
1037: printf(" File access : SEQUENTIAL/DIRECT/KEYED\n");
1038: printf(" Socket type : STREAM/DATAGRAM/RAW/"
1039: "ROBUST DATAGRAM/SEQUENTIAL DATAGRAM\n");
1040: printf(" Socket domain : LOCAL/FOREIGN\n");
1041: printf(" Socket protocol : IPV4/IPV6/UNIX\n");
1042: printf(" Format : FORMATTED/UNFORMATTED/FLOW\n");
1043: printf(" Protection : READONLY/WRITEONLY/READWRITE\n\n");
1.45 bertrand 1044: printf(" Stty parameters : can be prefixed by 'NO'\n");
1045: printf(" IGNBRK, BRKINT, IGNPAR, PARMRK, INPCK, ISTRIP\n");
1046: printf(" INLCR, IGNCR, ICRNL, IXON, IXANY, IXOFF,\n");
1047: printf(" IMAXBEL, OPOST, ONLCR, OCRNL, ONOCR, ONLRET,\n");
1048: printf(" OFILL, HUPCL, CLOCAL, CRTSCTS, ISIG, ICANON,\n");
1049: printf(" ECHO, ECHOE, ECHOK, ECHONL, NOFLSH, TOSTOP,\n");
1.48 bertrand 1050: printf(" IEXTEN\n");
1.1 bertrand 1051:
1052: printf(" Address : { \"ADDRESS\" [ 127 0 0 1 ] }\n");
1053: printf(" { \"HOST\" \"hostname\" }\n");
1054: printf(" Connections : { \"LISTEN\" amount of connections }\n");
1055: printf(" Name : { \"NAME\" \"filename\" }\n");
1056: printf(" Options : { \"OPTION\" \"option\" argument }\n");
1057: printf(" \"BIND TO DEVICE\" \"device\"\n");
1058: printf(" \"BROADCAST\"\n");
1059: printf(" \"DO NOT ROUTE\"\n");
1060: printf(" \"KEEP ALIVE\"\n");
1061: printf(" \"PRIORITY\" integer\n");
1062: printf(" \"RECEIVE BUFFER\" integer\n");
1063: printf(" \"FORCE RECEIVE BUFFER\" integer\n");
1064: printf(" \"SEND BUFFER\" integer\n");
1065: printf(" \"FORCE SEND BUFFER\" integer\n");
1066: printf(" \"RECEIVING TIMEOUT\" integer\n");
1067: printf(" \"SENDING TIMEOUT\" integer\n");
1068: printf(" \"REUSE ADDRESS\"\n");
1069: printf(" Port : { \"PORT\" port number }\n");
1070: printf(" Protocol : { \"PROTOCOL\" \"protocol\" }\n\n");
1071:
1.53 bertrand 1072: printf(" { { \"NAME\" \"filename\" } \"SEQUENTIAL\" } OPEN\n");
1.1 bertrand 1073: printf(" { \"SCRATCH\" } OPEN\n");
1074: printf(" { { \"NAME\" \"filename\" } \"UNKNOWN\" \"FORMATTED\" "
1075: "\"DIRECT\" } OPEN\n");
1076: printf(" { { \"NAME\" \"filename\" } \"OLD\" \"FORMATTED\" "
1077: "\"KEYED\" { \"KEY\" 2 } } OPEN\n");
1078: printf(" { \"STREAM\" \"READWRITE\" } OPEN\n");
1079: printf(" { \"FOREIGN\" \"DATAGRAM\" } OPEN\n");
1080: printf(" { \"LOCAL\" { \"NAME\" \"socket.sock\" } } OPEN\n");
1.49 bertrand 1081: printf(" { { \"NAME\" \"/dev/ttyS1\" } { \"STTY\" { \"9600,8,N,1\" "
1082: "\n { \"NO ICANON\" \"IGNBRK\" } } } OPEN\n");
1.1 bertrand 1083:
1084: return;
1085: }
1086: else if ((*s_etat_processus).test_instruction == 'Y')
1087: {
1088: (*s_etat_processus).nombre_arguments = -1;
1089: return;
1090: }
1091:
1092: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1093: {
1094: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1095: {
1096: return;
1097: }
1098: }
1099:
1100: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1101: &s_objet_argument) == d_erreur)
1102: {
1103: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1104: return;
1105: }
1106:
1107: if ((*s_objet_argument).type == LST)
1108: {
1109: l_element_courant = (struct_liste_chainee *) (*s_objet_argument).objet;
1110:
1111: if (l_element_courant == NULL)
1112: {
1113: liberation(s_etat_processus, s_objet_argument);
1114:
1115: (*s_etat_processus).erreur_execution =
1116: d_ex_erreur_parametre_fichier;
1117: return;
1118: }
1119:
1120: format = ' ';
1121: type_domaine = ' ';
1122: type_ouverture = ' ';
1123: protection = ' ';
1124: type_acces = ' ';
1125: type_socket = ' ';
1126: nom = NULL;
1127: position_clef = 0;
1128: port = 0;
1129: type_arguments = ' ';
1130: nombre_maximal_connexions = 0;
1131: hote = NULL;
1132: type_adresse = ' ';
1133: protocole[0] = d_code_fin_chaine;
1134: protocole_socket = NULL;
1135: presence_port = d_faux;
1136: peripherique = NULL;
1137: priorite = 0;
1138: buffer_emission = 0;
1139: buffer_reception = 0;
1140: timeout_emission = 0;
1141: timeout_reception = 0;
1142: drapeau = -1;
1.45 bertrand 1143: s_parametres_tty = NULL;
1.1 bertrand 1144:
1145: for(i = 0; i < 12; options[i++] = 'N');
1146:
1147: while(l_element_courant != NULL)
1148: {
1149: if ((*(*l_element_courant).donnee).type == CHN)
1150: {
1151: if ((argument_majuscule = conversion_majuscule((unsigned char *)
1152: (*(*l_element_courant).donnee).objet)) == NULL)
1153: {
1154: (*s_etat_processus).erreur_systeme =
1155: d_es_allocation_memoire;
1156: return;
1157: }
1158:
1159: if (strcmp(argument_majuscule, "NEW") == 0)
1160: {
1161: if (type_ouverture != ' ')
1162: {
1163: liberation(s_etat_processus, s_objet_argument);
1164: free(argument_majuscule);
1165:
1166: (*s_etat_processus).erreur_execution =
1167: d_ex_erreur_parametre_fichier;
1168: return;
1169: }
1170:
1171: if (type_arguments == ' ')
1172: {
1173: type_arguments = 'F';
1174: }
1175: else if (type_arguments == 'S')
1176: {
1177: liberation(s_etat_processus, s_objet_argument);
1178: free(argument_majuscule);
1179:
1180: (*s_etat_processus).erreur_execution =
1181: d_ex_erreur_parametre_fichier;
1182: return;
1183: }
1184:
1185: type_ouverture = 'N';
1186: }
1187: else if (strcmp(argument_majuscule, "REPLACE") == 0)
1188: {
1189: if (type_ouverture != ' ')
1190: {
1191: liberation(s_etat_processus, s_objet_argument);
1192: free(argument_majuscule);
1193:
1194: (*s_etat_processus).erreur_execution =
1195: d_ex_erreur_parametre_fichier;
1196: return;
1197: }
1198:
1199: if (type_arguments == ' ')
1200: {
1201: type_arguments = 'F';
1202: }
1203: else if (type_arguments == 'S')
1204: {
1205: liberation(s_etat_processus, s_objet_argument);
1206: free(argument_majuscule);
1207:
1208: (*s_etat_processus).erreur_execution =
1209: d_ex_erreur_parametre_fichier;
1210: return;
1211: }
1212:
1213: type_ouverture = 'R';
1214: }
1.27 bertrand 1215: else if (strcmp(argument_majuscule, "OLD") == 0)
1216: {
1217: if (type_ouverture != ' ')
1218: {
1219: liberation(s_etat_processus, s_objet_argument);
1220: free(argument_majuscule);
1221:
1222: (*s_etat_processus).erreur_execution =
1223: d_ex_erreur_parametre_fichier;
1224: return;
1225: }
1226:
1227: if (type_arguments == ' ')
1228: {
1229: type_arguments = 'F';
1230: }
1231: else if (type_arguments == 'S')
1232: {
1233: liberation(s_etat_processus, s_objet_argument);
1234: free(argument_majuscule);
1235:
1236: (*s_etat_processus).erreur_execution =
1237: d_ex_erreur_parametre_fichier;
1238: return;
1239: }
1240:
1241: type_ouverture = 'O';
1242: }
1.1 bertrand 1243: else if (strcmp(argument_majuscule, "UNKNOWN") == 0)
1244: {
1245: if (type_ouverture != ' ')
1246: {
1247: liberation(s_etat_processus, s_objet_argument);
1248: free(argument_majuscule);
1249:
1250: (*s_etat_processus).erreur_execution =
1251: d_ex_erreur_parametre_fichier;
1252: return;
1253: }
1254:
1255: if (type_arguments == ' ')
1256: {
1257: type_arguments = 'F';
1258: }
1259: else if (type_arguments == 'S')
1260: {
1261: liberation(s_etat_processus, s_objet_argument);
1262: free(argument_majuscule);
1263:
1264: (*s_etat_processus).erreur_execution =
1265: d_ex_erreur_parametre_fichier;
1266: return;
1267: }
1268:
1269: type_ouverture = 'U';
1270: }
1271: else if (strcmp(argument_majuscule, "SCRATCH") == 0)
1272: {
1273: if (type_ouverture != ' ')
1274: {
1275: liberation(s_etat_processus, s_objet_argument);
1276: free(argument_majuscule);
1277:
1278: (*s_etat_processus).erreur_execution =
1279: d_ex_erreur_parametre_fichier;
1280: return;
1281: }
1282:
1283: if (type_arguments == ' ')
1284: {
1285: type_arguments = 'F';
1286: }
1287: else if (type_arguments == 'S')
1288: {
1289: liberation(s_etat_processus, s_objet_argument);
1290: free(argument_majuscule);
1291:
1292: (*s_etat_processus).erreur_execution =
1293: d_ex_erreur_parametre_fichier;
1294: return;
1295: }
1296:
1297: type_ouverture = 'S';
1298: }
1299: else if (strcmp(argument_majuscule, "SEQUENTIAL") == 0)
1300: {
1301: if (type_acces != ' ')
1302: {
1303: liberation(s_etat_processus, s_objet_argument);
1304: free(argument_majuscule);
1305:
1306: (*s_etat_processus).erreur_execution =
1307: d_ex_erreur_parametre_fichier;
1308: return;
1309: }
1310:
1311: if (type_arguments == ' ')
1312: {
1313: type_arguments = 'F';
1314: }
1315: else if (type_arguments == 'S')
1316: {
1317: liberation(s_etat_processus, s_objet_argument);
1318: free(argument_majuscule);
1319:
1320: (*s_etat_processus).erreur_execution =
1321: d_ex_erreur_parametre_fichier;
1322: return;
1323: }
1324:
1325: type_acces = 'S';
1326: }
1327: else if (strcmp(argument_majuscule, "DIRECT") == 0)
1328: {
1329: if (type_acces != ' ')
1330: {
1331: liberation(s_etat_processus, s_objet_argument);
1332: free(argument_majuscule);
1333:
1334: (*s_etat_processus).erreur_execution =
1335: d_ex_erreur_parametre_fichier;
1336: return;
1337: }
1338:
1339: if (type_arguments == ' ')
1340: {
1341: type_arguments = 'F';
1342: }
1343: else if (type_arguments == 'S')
1344: {
1345: liberation(s_etat_processus, s_objet_argument);
1346: free(argument_majuscule);
1347:
1348: (*s_etat_processus).erreur_execution =
1349: d_ex_erreur_parametre_fichier;
1350: return;
1351: }
1352:
1353: type_acces = 'D';
1354: }
1355: else if (strcmp(argument_majuscule, "KEYED") == 0)
1356: {
1357: if (type_acces != ' ')
1358: {
1359: liberation(s_etat_processus, s_objet_argument);
1360: free(argument_majuscule);
1361:
1362: (*s_etat_processus).erreur_execution =
1363: d_ex_erreur_parametre_fichier;
1364: return;
1365: }
1366:
1367: if (type_arguments == ' ')
1368: {
1369: type_arguments = 'F';
1370: }
1371: else if (type_arguments == 'S')
1372: {
1373: liberation(s_etat_processus, s_objet_argument);
1374: free(argument_majuscule);
1375:
1376: (*s_etat_processus).erreur_execution =
1377: d_ex_erreur_parametre_fichier;
1378: return;
1379: }
1380:
1381: type_acces = 'I';
1382: }
1383: else if (strcmp(argument_majuscule, "READONLY") == 0)
1384: {
1385: if (protection != ' ')
1386: {
1387: liberation(s_etat_processus, s_objet_argument);
1388: free(argument_majuscule);
1389:
1390: (*s_etat_processus).erreur_execution =
1391: d_ex_erreur_parametre_fichier;
1392: return;
1393: }
1394:
1395: protection = 'R';
1396: }
1397: else if (strcmp(argument_majuscule, "WRITEONLY") == 0)
1398: {
1399: if (protection != ' ')
1400: {
1401: liberation(s_etat_processus, s_objet_argument);
1402: free(argument_majuscule);
1403:
1404: (*s_etat_processus).erreur_execution =
1405: d_ex_erreur_parametre_fichier;
1406: return;
1407: }
1408:
1409: protection = 'W';
1410: }
1411: else if (strcmp(argument_majuscule, "READWRITE") == 0)
1412: {
1413: if (protection != ' ')
1414: {
1415: liberation(s_etat_processus, s_objet_argument);
1416: free(argument_majuscule);
1417:
1418: (*s_etat_processus).erreur_execution =
1419: d_ex_erreur_parametre_fichier;
1420: return;
1421: }
1422:
1423: protection = 'N';
1424: }
1425: else if (strcmp(argument_majuscule, "FORMATTED") == 0)
1426: {
1427: if (format != ' ')
1428: {
1429: liberation(s_etat_processus, s_objet_argument);
1430: free(argument_majuscule);
1431:
1432: (*s_etat_processus).erreur_execution =
1433: d_ex_erreur_parametre_fichier;
1434: return;
1435: }
1436:
1437: format = 'N';
1438: }
1439: else if (strcmp(argument_majuscule, "UNFORMATTED") == 0)
1440: {
1441: if (format != ' ')
1442: {
1443: liberation(s_etat_processus, s_objet_argument);
1444: free(argument_majuscule);
1445:
1446: (*s_etat_processus).erreur_execution =
1447: d_ex_erreur_parametre_fichier;
1448: return;
1449: }
1450:
1451: format = 'Y';
1452: }
1453: else if (strcmp(argument_majuscule, "FLOW") == 0)
1454: {
1455: if (format != ' ')
1456: {
1457: liberation(s_etat_processus, s_objet_argument);
1458: free(argument_majuscule);
1459:
1460: (*s_etat_processus).erreur_execution =
1461: d_ex_erreur_parametre_fichier;
1462: return;
1463: }
1464:
1465: format = 'F';
1466: }
1467: else if (strcmp(argument_majuscule, "STREAM") == 0)
1468: {
1469: if (type_socket != ' ')
1470: {
1471: liberation(s_etat_processus, s_objet_argument);
1472: free(argument_majuscule);
1473:
1474: (*s_etat_processus).erreur_execution =
1475: d_ex_erreur_parametre_fichier;
1476: return;
1477: }
1478:
1479: if (type_arguments == ' ')
1480: {
1481: type_arguments = 'S';
1482: }
1483: else if (type_arguments == 'F')
1484: {
1485: liberation(s_etat_processus, s_objet_argument);
1486: free(argument_majuscule);
1487:
1488: (*s_etat_processus).erreur_execution =
1489: d_ex_erreur_parametre_fichier;
1490: return;
1491: }
1492:
1493: type_socket = 'S';
1494: }
1495: else if (strcmp(argument_majuscule, "DATAGRAM") == 0)
1496: {
1497: if (type_socket != ' ')
1498: {
1499: liberation(s_etat_processus, s_objet_argument);
1500: free(argument_majuscule);
1501:
1502: (*s_etat_processus).erreur_execution =
1503: d_ex_erreur_parametre_fichier;
1504: return;
1505: }
1506:
1507: type_socket = 'D';
1508: }
1509: else if (strcmp(argument_majuscule, "SEQUENTIAL DATAGRAM") == 0)
1510: {
1511: if (type_socket != ' ')
1512: {
1513: liberation(s_etat_processus, s_objet_argument);
1514: free(argument_majuscule);
1515:
1516: (*s_etat_processus).erreur_execution =
1517: d_ex_erreur_parametre_fichier;
1518: return;
1519: }
1520:
1521: if (type_arguments == ' ')
1522: {
1523: type_arguments = 'S';
1524: }
1525: else if (type_arguments == 'F')
1526: {
1527: liberation(s_etat_processus, s_objet_argument);
1528: free(argument_majuscule);
1529:
1530: (*s_etat_processus).erreur_execution =
1531: d_ex_erreur_parametre_fichier;
1532: return;
1533: }
1534:
1535: type_socket = 'Q';
1536: }
1537: else if (strcmp(argument_majuscule, "RAW") == 0)
1538: {
1539: if (type_socket != ' ')
1540: {
1541: liberation(s_etat_processus, s_objet_argument);
1542: free(argument_majuscule);
1543:
1544: (*s_etat_processus).erreur_execution =
1545: d_ex_erreur_parametre_fichier;
1546: return;
1547: }
1548:
1549: if (type_arguments == ' ')
1550: {
1551: type_arguments = 'S';
1552: }
1553: else if (type_arguments == 'F')
1554: {
1555: liberation(s_etat_processus, s_objet_argument);
1556: free(argument_majuscule);
1557:
1558: (*s_etat_processus).erreur_execution =
1559: d_ex_erreur_parametre_fichier;
1560: return;
1561: }
1562:
1563: type_socket = 'R';
1564: }
1565: else if (strcmp(argument_majuscule, "ROBUST DATAGRAM") == 0)
1566: {
1567: if (type_socket != ' ')
1568: {
1569: liberation(s_etat_processus, s_objet_argument);
1570: free(argument_majuscule);
1571:
1572: (*s_etat_processus).erreur_execution =
1573: d_ex_erreur_parametre_fichier;
1574: return;
1575: }
1576:
1577: if (type_arguments == ' ')
1578: {
1579: type_arguments = 'S';
1580: }
1581: else if (type_arguments == 'F')
1582: {
1583: liberation(s_etat_processus, s_objet_argument);
1584: free(argument_majuscule);
1585:
1586: (*s_etat_processus).erreur_execution =
1587: d_ex_erreur_parametre_fichier;
1588: return;
1589: }
1590:
1591: type_socket = 'M';
1592: }
1593: else if (strcmp(argument_majuscule, "LOCAL") == 0)
1594: {
1595: if (type_domaine != ' ')
1596: {
1597: liberation(s_etat_processus, s_objet_argument);
1598: free(argument_majuscule);
1599:
1600: (*s_etat_processus).erreur_execution =
1601: d_ex_erreur_parametre_fichier;
1602: return;
1603: }
1604:
1605: if (type_arguments == ' ')
1606: {
1607: type_arguments = 'S';
1608: }
1609: else if (type_arguments == 'F')
1610: {
1611: liberation(s_etat_processus, s_objet_argument);
1612: free(argument_majuscule);
1613:
1614: (*s_etat_processus).erreur_execution =
1615: d_ex_erreur_parametre_fichier;
1616: return;
1617: }
1618:
1619: type_domaine = 'L';
1620: }
1621: else if (strcmp(argument_majuscule, "FOREIGN") == 0)
1622: {
1623: if (type_domaine != ' ')
1624: {
1625: liberation(s_etat_processus, s_objet_argument);
1626: free(argument_majuscule);
1627:
1628: (*s_etat_processus).erreur_execution =
1629: d_ex_erreur_parametre_fichier;
1630: return;
1631: }
1632:
1633: if (type_arguments == ' ')
1634: {
1635: type_arguments = 'S';
1636: }
1637: else if (type_arguments == 'F')
1638: {
1639: liberation(s_etat_processus, s_objet_argument);
1640: free(argument_majuscule);
1641:
1642: (*s_etat_processus).erreur_execution =
1643: d_ex_erreur_parametre_fichier;
1644: return;
1645: }
1646:
1647: type_domaine = 'F';
1648: }
1649: else if (strcmp(argument_majuscule, "IPV4") == 0)
1650: {
1651: if (strcmp(protocole, "") != 0)
1652: {
1653: liberation(s_etat_processus, s_objet_argument);
1654: free(argument_majuscule);
1655:
1656: (*s_etat_processus).erreur_execution =
1657: d_ex_erreur_parametre_fichier;
1658: return;
1659: }
1660:
1661: if (type_arguments == ' ')
1662: {
1663: type_arguments = 'S';
1664: }
1665: else if (type_arguments == 'F')
1666: {
1667: liberation(s_etat_processus, s_objet_argument);
1668: free(argument_majuscule);
1669:
1670: (*s_etat_processus).erreur_execution =
1671: d_ex_erreur_parametre_fichier;
1672: return;
1673: }
1674:
1675: strcpy(protocole, "IPV4");
1676: }
1677: else if (strcmp(argument_majuscule, "IPV6") == 0)
1678: {
1679: if (strcmp(protocole, "") != 0)
1680: {
1681: liberation(s_etat_processus, s_objet_argument);
1682: free(argument_majuscule);
1683:
1684: (*s_etat_processus).erreur_execution =
1685: d_ex_erreur_parametre_fichier;
1686: return;
1687: }
1688:
1689: if (type_arguments == ' ')
1690: {
1691: type_arguments = 'S';
1692: }
1693: else if (type_arguments == 'F')
1694: {
1695: liberation(s_etat_processus, s_objet_argument);
1696: free(argument_majuscule);
1697:
1698: (*s_etat_processus).erreur_execution =
1699: d_ex_erreur_parametre_fichier;
1700: return;
1701: }
1702:
1703: strcpy(protocole, "IPV6");
1704: }
1705: else if (strcmp(argument_majuscule, "UNIX") == 0)
1706: {
1707: if (strcmp(protocole, "") != 0)
1708: {
1709: liberation(s_etat_processus, s_objet_argument);
1710: free(argument_majuscule);
1711:
1712: (*s_etat_processus).erreur_execution =
1713: d_ex_erreur_parametre_fichier;
1714: return;
1715: }
1716:
1717: if (type_arguments == ' ')
1718: {
1719: type_arguments = 'S';
1720: }
1721: else if (type_arguments == 'F')
1722: {
1723: liberation(s_etat_processus, s_objet_argument);
1724: free(argument_majuscule);
1725:
1726: (*s_etat_processus).erreur_execution =
1727: d_ex_erreur_parametre_fichier;
1728: return;
1729: }
1730:
1731: strcpy(protocole, "UNIX");
1732: }
1733: else
1734: {
1735: liberation(s_etat_processus, s_objet_argument);
1736: free(argument_majuscule);
1737:
1738: (*s_etat_processus).erreur_execution =
1739: d_ex_erreur_parametre_fichier;
1740: return;
1741: }
1742:
1743: free(argument_majuscule);
1744: }
1745: else if ((*(*l_element_courant).donnee).type == LST)
1746: {
1747: l_element_courant_sous_objet =
1748: (*(*l_element_courant).donnee).objet;
1749:
1750: nombre_elements = 0;
1751: while(l_element_courant_sous_objet != NULL)
1752: {
1753: nombre_elements++;
1754: l_element_courant_sous_objet =
1755: (*l_element_courant_sous_objet).suivant;
1756: }
1757:
1758: l_element_courant_sous_objet =
1759: (*(*l_element_courant).donnee).objet;
1760:
1761: if (nombre_elements == 2)
1762: {
1763: if ((*(*l_element_courant_sous_objet).donnee).type == CHN)
1764: {
1765: if ((argument_majuscule = conversion_majuscule(
1766: (unsigned char *)
1767: (*(*l_element_courant_sous_objet)
1768: .donnee).objet)) == NULL)
1769: {
1770: (*s_etat_processus).erreur_systeme =
1771: d_es_allocation_memoire;
1772: return;
1773: }
1774:
1775: l_element_courant_sous_objet =
1776: (*l_element_courant_sous_objet).suivant;
1777:
1778: if (strcmp(argument_majuscule, "NAME") == 0)
1779: {
1780: if ((*(*l_element_courant_sous_objet).donnee).type
1781: == CHN)
1782: {
1783: if (nom != NULL)
1784: {
1785: liberation(s_etat_processus,
1786: s_objet_argument);
1787: free(argument_majuscule);
1788:
1789: (*s_etat_processus).erreur_execution =
1790: d_ex_erreur_parametre_fichier;
1791: return;
1792: }
1793:
1794: nom = (unsigned char *)
1795: (*(*l_element_courant_sous_objet)
1796: .donnee).objet;
1797: }
1798: else
1799: {
1800: liberation(s_etat_processus, s_objet_argument);
1801: free(argument_majuscule);
1802:
1803: (*s_etat_processus).erreur_execution =
1804: d_ex_erreur_parametre_fichier;
1805: return;
1806: }
1807: }
1808: else if (strcmp(argument_majuscule, "OPTION") == 0)
1809: {
1810: if ((*(*l_element_courant_sous_objet).donnee).type
1811: == CHN)
1812: {
1813: if (type_arguments == ' ')
1814: {
1815: type_arguments = 'S';
1816: }
1817: else if (type_arguments == 'F')
1818: {
1819: liberation(s_etat_processus,
1820: s_objet_argument);
1821: free(argument_majuscule);
1822:
1823: (*s_etat_processus).erreur_execution =
1824: d_ex_erreur_parametre_fichier;
1825: return;
1826: }
1827: }
1828:
1829: free(argument_majuscule);
1830:
1831: if ((argument_majuscule = conversion_majuscule(
1832: (unsigned char *)
1833: (*(*l_element_courant_sous_objet)
1834: .donnee).objet)) == NULL)
1835: {
1836: (*s_etat_processus).erreur_systeme =
1837: d_es_allocation_memoire;
1838: return;
1839: }
1840:
1841: if (strcmp(argument_majuscule, "BROADCAST") == 0)
1842: {
1843: if (options[d_BROADCAST] == 'Y')
1844: {
1845: liberation(s_etat_processus,
1846: s_objet_argument);
1847: free(argument_majuscule);
1848:
1849: (*s_etat_processus).erreur_execution =
1850: d_ex_erreur_parametre_fichier;
1851: return;
1852: }
1853:
1854: options[d_BROADCAST] = 'Y';
1855: }
1856: else if (strcmp(argument_majuscule, "DO NOT ROUTE")
1857: == 0)
1858: {
1859: if (options[d_DONT_ROUTE] == 'Y')
1860: {
1861: liberation(s_etat_processus,
1862: s_objet_argument);
1863: free(argument_majuscule);
1864:
1865: (*s_etat_processus).erreur_execution =
1866: d_ex_erreur_parametre_fichier;
1867: return;
1868: }
1869:
1870: options[d_DONT_ROUTE] = 'Y';
1871: }
1872: else if (strcmp(argument_majuscule, "KEEP ALIVE")
1873: == 0)
1874: {
1875: if (options[d_KEEP_ALIVE] == 'Y')
1876: {
1877: liberation(s_etat_processus,
1878: s_objet_argument);
1879: free(argument_majuscule);
1880:
1881: (*s_etat_processus).erreur_execution =
1882: d_ex_erreur_parametre_fichier;
1883: return;
1884: }
1885:
1886: options[d_KEEP_ALIVE] = 'Y';
1887: }
1888: else if (strcmp(argument_majuscule, "REUSE ADDRESS")
1889: == 0)
1890: {
1891: if (options[d_REUSE_ADDRESS] == 'Y')
1892: {
1893: liberation(s_etat_processus,
1894: s_objet_argument);
1895: free(argument_majuscule);
1896:
1897: (*s_etat_processus).erreur_execution =
1898: d_ex_erreur_parametre_fichier;
1899: return;
1900: }
1901:
1902: options[d_REUSE_ADDRESS] = 'Y';
1903: }
1904: else
1905: {
1906: liberation(s_etat_processus,
1907: s_objet_argument);
1908: free(argument_majuscule);
1909:
1910: (*s_etat_processus).erreur_execution =
1911: d_ex_erreur_parametre_fichier;
1912: return;
1913: }
1914: }
1915: else if (strcmp(argument_majuscule, "HOST") == 0)
1916: {
1917: if ((*(*l_element_courant_sous_objet).donnee).type
1918: == CHN)
1919: {
1920: if (type_arguments == ' ')
1921: {
1922: type_arguments = 'S';
1923: }
1924: else if (type_arguments == 'F')
1925: {
1926: liberation(s_etat_processus,
1927: s_objet_argument);
1928: free(argument_majuscule);
1929:
1930: (*s_etat_processus).erreur_execution =
1931: d_ex_erreur_parametre_fichier;
1932: return;
1933: }
1934:
1935: if (hote != NULL)
1936: {
1937: liberation(s_etat_processus,
1938: s_objet_argument);
1939: free(argument_majuscule);
1940:
1941: (*s_etat_processus).erreur_execution =
1942: d_ex_erreur_parametre_fichier;
1943: return;
1944: }
1945:
1946: hote = (unsigned char *)
1947: (*(*l_element_courant_sous_objet)
1948: .donnee).objet;
1949: }
1950: else
1951: {
1952: liberation(s_etat_processus,
1953: s_objet_argument);
1954: free(argument_majuscule);
1955:
1956: (*s_etat_processus).erreur_execution =
1957: d_ex_erreur_parametre_fichier;
1958: return;
1959: }
1960: }
1961: else if (strcmp(argument_majuscule, "PROTOCOL") == 0)
1962: {
1963: if ((*(*l_element_courant_sous_objet).donnee).type
1964: == CHN)
1965: {
1966: if (type_arguments == ' ')
1967: {
1968: type_arguments = 'S';
1969: }
1970: else if (type_arguments == 'F')
1971: {
1972: liberation(s_etat_processus,
1973: s_objet_argument);
1974: free(argument_majuscule);
1975:
1976: (*s_etat_processus).erreur_execution =
1977: d_ex_erreur_parametre_fichier;
1978: return;
1979: }
1980:
1981: if (protocole_socket != NULL)
1982: {
1983: liberation(s_etat_processus,
1984: s_objet_argument);
1985: free(argument_majuscule);
1986:
1987: (*s_etat_processus).erreur_execution =
1988: d_ex_erreur_parametre_fichier;
1989: return;
1990: }
1991:
1992: protocole_socket = (unsigned char *)
1993: (*(*l_element_courant_sous_objet)
1994: .donnee).objet;
1.42 bertrand 1995:
1.45 bertrand 1996: for(i = 0; i < strlen(protocole_socket); i++)
1997: {
1998: if ((protocole_socket[i] >= 'a') &&
1999: (protocole_socket[i] <= 'z'))
2000: {
2001: protocole_socket[i] -= 'a' - 'A';
2002: }
2003: }
1.1 bertrand 2004: }
2005: else
2006: {
2007: liberation(s_etat_processus, s_objet_argument);
2008: free(argument_majuscule);
2009:
2010: (*s_etat_processus).erreur_execution =
2011: d_ex_erreur_parametre_fichier;
2012: return;
2013: }
2014: }
2015: else if (strcmp(argument_majuscule, "KEY") == 0)
2016: {
2017: if ((*(*l_element_courant_sous_objet).donnee).type
2018: == INT)
2019: {
2020: if (type_arguments == ' ')
2021: {
2022: type_arguments = 'F';
2023: }
2024: else if (type_arguments == 'S')
2025: {
2026: liberation(s_etat_processus,
2027: s_objet_argument);
2028: free(argument_majuscule);
2029:
2030: (*s_etat_processus).erreur_execution =
2031: d_ex_erreur_parametre_fichier;
2032: return;
2033: }
2034:
2035: if (position_clef != 0)
2036: {
2037: liberation(s_etat_processus,
2038: s_objet_argument);
2039:
2040: (*s_etat_processus).erreur_execution =
2041: d_ex_erreur_parametre_fichier;
2042: return;
2043: }
2044: else
2045: {
2046: if ((position_clef = (*((integer8 *)
2047: (*(*l_element_courant_sous_objet)
2048: .donnee).objet))) <= 0)
2049: {
2050: liberation(s_etat_processus,
2051: s_objet_argument);
2052:
2053: (*s_etat_processus).erreur_execution =
2054: d_ex_erreur_parametre_fichier;
2055: return;
2056: }
2057: }
2058: }
2059: else
2060: {
2061: liberation(s_etat_processus, s_objet_argument);
2062: free(argument_majuscule);
2063:
2064: (*s_etat_processus).erreur_execution =
2065: d_ex_erreur_parametre_fichier;
2066: return;
2067: }
2068: }
2069: else if (strcmp(argument_majuscule, "PORT") == 0)
2070: {
2071: if ((*(*l_element_courant_sous_objet)
2072: .donnee).type == INT)
2073: {
2074: if (type_arguments == ' ')
2075: {
2076: type_arguments = 'S';
2077: }
2078: else if (type_arguments == 'F')
2079: {
2080: liberation(s_etat_processus,
2081: s_objet_argument);
2082: free(argument_majuscule);
2083:
2084: (*s_etat_processus).erreur_execution =
2085: d_ex_erreur_parametre_fichier;
2086: return;
2087: }
2088:
2089: if (presence_port == d_vrai)
2090: {
2091: liberation(s_etat_processus,
2092: s_objet_argument);
2093:
2094: (*s_etat_processus).erreur_execution =
2095: d_ex_erreur_parametre_fichier;
2096: return;
2097: }
2098: else
2099: {
2100: presence_port = d_vrai;
2101:
2102: if ((port = (*((integer8 *)
2103: (*(*l_element_courant_sous_objet)
2104: .donnee).objet))) < 0)
2105: {
2106: liberation(s_etat_processus,
2107: s_objet_argument);
2108:
2109: (*s_etat_processus).erreur_execution =
2110: d_ex_erreur_parametre_fichier;
2111: return;
2112: }
2113:
2114: if (port > 65535)
2115: {
2116: liberation(s_etat_processus,
2117: s_objet_argument);
2118:
2119: (*s_etat_processus).erreur_execution =
2120: d_ex_erreur_parametre_fichier;
2121: return;
2122: }
2123: }
2124: }
2125: else
2126: {
2127: liberation(s_etat_processus, s_objet_argument);
2128: free(argument_majuscule);
2129:
2130: (*s_etat_processus).erreur_execution =
2131: d_ex_erreur_parametre_fichier;
2132: return;
2133: }
2134: }
2135: else if (strcmp(argument_majuscule, "LISTEN") == 0)
2136: {
2137: if ((*(*l_element_courant_sous_objet).donnee).type
2138: == INT)
2139: {
2140: if (type_arguments == ' ')
2141: {
2142: type_arguments = 'S';
2143: }
2144: else if (type_arguments == 'F')
2145: {
2146: liberation(s_etat_processus,
2147: s_objet_argument);
2148: free(argument_majuscule);
2149:
2150: (*s_etat_processus).erreur_execution =
2151: d_ex_erreur_parametre_fichier;
2152: return;
2153: }
2154:
2155: if (nombre_maximal_connexions != 0)
2156: {
2157: liberation(s_etat_processus,
2158: s_objet_argument);
2159:
2160: (*s_etat_processus).erreur_execution =
2161: d_ex_erreur_parametre_fichier;
2162: return;
2163: }
2164: else
2165: {
2166: if ((nombre_maximal_connexions =
2167: (*((integer8 *)
2168: (*(*l_element_courant_sous_objet)
2169: .donnee).objet))) <= 0)
2170: {
2171: liberation(s_etat_processus,
2172: s_objet_argument);
2173:
2174: (*s_etat_processus).erreur_execution =
2175: d_ex_erreur_parametre_fichier;
2176: return;
2177: }
2178: }
2179: }
2180: }
2181: else if (strcmp(argument_majuscule, "ADDRESS") == 0)
2182: {
2183: if ((*(*l_element_courant_sous_objet)
2184: .donnee).type == VIN)
2185: {
2186: if (type_arguments == ' ')
2187: {
2188: type_arguments = 'S';
2189: }
2190: else if (type_arguments == 'F')
2191: {
2192: liberation(s_etat_processus,
2193: s_objet_argument);
2194: free(argument_majuscule);
2195:
2196: (*s_etat_processus).erreur_execution =
2197: d_ex_erreur_parametre_fichier;
2198: return;
2199: }
2200:
2201: if (type_adresse != ' ')
2202: {
2203: liberation(s_etat_processus,
2204: s_objet_argument);
2205:
2206: (*s_etat_processus).erreur_execution =
2207: d_ex_erreur_parametre_fichier;
2208: return;
2209: }
2210:
2211: if ((*((struct_vecteur *)
2212: (*(*l_element_courant_sous_objet)
2213: .donnee).objet)).taille == 4)
2214: { // Adresse IPv4
2215: type_adresse = '4';
2216:
2217: for(i = 0; i < 4; i++)
2218: {
2219: adresse[i] = ((integer8 *)
2220: (*((struct_vecteur *) (*
2221: (*l_element_courant_sous_objet)
2222: .donnee).objet)).tableau)[i];
2223:
2224: if ((adresse[i] < 0) || (adresse[i] >
2225: 255))
2226: {
2227: liberation(s_etat_processus,
2228: s_objet_argument);
2229:
2230: (*s_etat_processus).erreur_execution
2231: = d_ex_erreur_parametre_fichier;
2232: return;
2233: }
2234: }
2235: }
2236: else if ((*((struct_vecteur *)
2237: (*(*l_element_courant_sous_objet)
2238: .donnee).objet)).taille == 16)
2239: { // Adresse IPv6
2240: type_adresse = '6';
2241:
2242: for(i = 0; i < 16; i++)
2243: {
2244: adresse[i] = ((integer8 *)
2245: (*((struct_vecteur *) (*
2246: (*l_element_courant_sous_objet)
2247: .donnee).objet)).tableau)[i];
2248:
2249: if ((adresse[i] < 0) || (adresse[i] >
2250: 255))
2251: {
2252: liberation(s_etat_processus,
2253: s_objet_argument);
2254:
2255: (*s_etat_processus).erreur_execution
2256: = d_ex_erreur_parametre_fichier;
2257: return;
2258: }
2259: }
2260: }
2261: else
2262: { // Adresse non supportée
2263: liberation(s_etat_processus,
2264: s_objet_argument);
2265:
2266: (*s_etat_processus).erreur_execution =
2267: d_ex_erreur_parametre_fichier;
2268: return;
2269: }
2270: }
2271: }
1.45 bertrand 2272: else if (strcmp(argument_majuscule, "STTY") == 0)
2273: {
2274: if ((*(*l_element_courant_sous_objet)
1.49 bertrand 2275: .donnee).type == CHN)
1.45 bertrand 2276: {
2277: if (type_arguments == ' ')
2278: {
2279: type_arguments = 'F';
2280: }
2281: else if (type_arguments == 'S')
2282: {
2283: liberation(s_etat_processus,
2284: s_objet_argument);
2285: free(argument_majuscule);
2286:
2287: (*s_etat_processus).erreur_execution =
2288: d_ex_erreur_parametre_fichier;
2289: return;
2290: }
2291:
1.49 bertrand 2292: s_parametres_tty = (*l_element_courant).donnee;
1.45 bertrand 2293: }
2294: }
1.1 bertrand 2295: else
2296: {
2297: liberation(s_etat_processus, s_objet_argument);
2298: free(argument_majuscule);
2299:
2300: (*s_etat_processus).erreur_execution =
2301: d_ex_erreur_parametre_fichier;
2302: return;
2303: }
2304:
2305: free(argument_majuscule);
2306: }
2307: else
2308: {
2309: liberation(s_etat_processus, s_objet_argument);
2310: (*s_etat_processus).erreur_execution =
2311: d_ex_erreur_parametre_fichier;
2312:
2313: return;
2314: }
2315: }
2316: else if (nombre_elements == 3)
2317: {
2318: if ((*(*l_element_courant_sous_objet).donnee).type == CHN)
2319: {
2320: if ((argument_majuscule = conversion_majuscule(
2321: (unsigned char *)
2322: (*(*l_element_courant_sous_objet)
2323: .donnee).objet)) == NULL)
2324: {
2325: (*s_etat_processus).erreur_systeme =
2326: d_es_allocation_memoire;
2327: return;
2328: }
2329:
2330: if (strcmp(argument_majuscule, "OPTION") == 0)
2331: {
2332: if (type_arguments == ' ')
2333: {
2334: type_arguments = 'S';
2335: }
2336: else if (type_arguments == 'F')
2337: {
2338: liberation(s_etat_processus, s_objet_argument);
2339: free(argument_majuscule);
2340:
2341: (*s_etat_processus).erreur_execution =
2342: d_ex_erreur_parametre_fichier;
2343: return;
2344: }
2345:
2346: free(argument_majuscule);
2347:
2348: l_element_courant_sous_objet =
2349: (*l_element_courant_sous_objet).suivant;
2350:
2351: if ((*(*l_element_courant_sous_objet)
2352: .donnee).type != CHN)
2353: {
2354: liberation(s_etat_processus, s_objet_argument);
2355:
2356: (*s_etat_processus).erreur_execution =
2357: d_ex_erreur_parametre_fichier;
2358: return;
2359: }
2360:
2361: if ((argument_majuscule = conversion_majuscule(
2362: (unsigned char *)
2363: (*(*l_element_courant_sous_objet)
2364: .donnee).objet)) == NULL)
2365: {
2366: (*s_etat_processus).erreur_systeme =
2367: d_es_allocation_memoire;
2368: return;
2369: }
2370:
2371: l_element_courant_sous_objet =
2372: (*l_element_courant_sous_objet).suivant;
2373:
2374: if (strcmp(argument_majuscule, "BIND TO DEVICE")
2375: == 0)
2376: {
2377: if ((*(*l_element_courant_sous_objet)
2378: .donnee).type != CHN)
2379: {
2380: liberation(s_etat_processus,
2381: s_objet_argument);
2382: free(argument_majuscule);
2383:
2384: (*s_etat_processus).erreur_execution =
2385: d_ex_erreur_parametre_fichier;
2386: return;
2387: }
2388:
2389: if (options[d_BIND_TO_DEVICE] == 'Y')
2390: {
2391: liberation(s_etat_processus,
2392: s_objet_argument);
2393: free(argument_majuscule);
2394:
2395: (*s_etat_processus).erreur_execution =
2396: d_ex_erreur_parametre_fichier;
2397: return;
2398: }
2399:
2400: options[d_BIND_TO_DEVICE] = 'Y';
2401:
2402: peripherique = (unsigned char *)
2403: (*(*l_element_courant_sous_objet)
2404: .donnee).objet;
2405: }
2406: else if (strcmp(argument_majuscule, "PRIORITY")
2407: == 0)
2408: {
2409: if ((*(*l_element_courant_sous_objet)
2410: .donnee).type != INT)
2411: {
2412: liberation(s_etat_processus,
2413: s_objet_argument);
2414: free(argument_majuscule);
2415:
2416: (*s_etat_processus).erreur_execution =
2417: d_ex_erreur_parametre_fichier;
2418: return;
2419: }
2420:
2421: if (options[d_PRIORITY] == 'Y')
2422: {
2423: liberation(s_etat_processus,
2424: s_objet_argument);
2425: free(argument_majuscule);
2426:
2427: (*s_etat_processus).erreur_execution =
2428: d_ex_erreur_parametre_fichier;
2429: return;
2430: }
2431:
2432: options[d_PRIORITY] = 'Y';
2433:
2434: priorite = (int) (*((integer8 *)
2435: (*(*l_element_courant_sous_objet)
2436: .donnee).objet));
2437: }
2438: else if (strcmp(argument_majuscule,
2439: "RECEIVE BUFFER") == 0)
2440: {
2441: if ((*(*l_element_courant_sous_objet)
2442: .donnee).type != INT)
2443: {
2444: liberation(s_etat_processus,
2445: s_objet_argument);
2446: free(argument_majuscule);
2447:
2448: (*s_etat_processus).erreur_execution =
2449: d_ex_erreur_parametre_fichier;
2450: return;
2451: }
2452:
2453: if ((options[d_RECEIVE_BUFFER] == 'Y') ||
2454: (options[d_FORCE_RECEIVE_BUFFER]
2455: == 'Y'))
2456: {
2457: liberation(s_etat_processus,
2458: s_objet_argument);
2459: free(argument_majuscule);
2460:
2461: (*s_etat_processus).erreur_execution =
2462: d_ex_erreur_parametre_fichier;
2463: return;
2464: }
2465:
2466: options[d_RECEIVE_BUFFER] = 'Y';
2467:
2468: buffer_reception = (int) (*((integer8 *)
2469: (*(*l_element_courant_sous_objet)
2470: .donnee).objet));
2471: }
2472: else if (strcmp(argument_majuscule,
2473: "FORCE RECEIVE BUFFER") == 0)
2474: {
2475: if ((*(*l_element_courant_sous_objet)
2476: .donnee).type != INT)
2477: {
2478: liberation(s_etat_processus,
2479: s_objet_argument);
2480: free(argument_majuscule);
2481:
2482: (*s_etat_processus).erreur_execution =
2483: d_ex_erreur_parametre_fichier;
2484: return;
2485: }
2486:
2487: if ((options[d_RECEIVE_BUFFER] == 'Y') ||
2488: (options[d_FORCE_RECEIVE_BUFFER]
2489: == 'Y'))
2490: {
2491: liberation(s_etat_processus,
2492: s_objet_argument);
2493: free(argument_majuscule);
2494:
2495: (*s_etat_processus).erreur_execution =
2496: d_ex_erreur_parametre_fichier;
2497: return;
2498: }
2499:
2500: options[d_FORCE_RECEIVE_BUFFER] = 'Y';
2501:
2502: buffer_reception = (int) (*((integer8 *)
2503: (*(*l_element_courant_sous_objet)
2504: .donnee).objet));
2505: }
2506: else if (strcmp(argument_majuscule,
2507: "SEND BUFFER") == 0)
2508: {
2509: if ((*(*l_element_courant_sous_objet)
2510: .donnee).type != INT)
2511: {
2512: liberation(s_etat_processus,
2513: s_objet_argument);
2514: free(argument_majuscule);
2515:
2516: (*s_etat_processus).erreur_execution =
2517: d_ex_erreur_parametre_fichier;
2518: return;
2519: }
2520:
2521: if ((options[d_SEND_BUFFER] == 'Y') ||
2522: (options[d_FORCE_SEND_BUFFER] == 'Y'))
2523: {
2524: liberation(s_etat_processus,
2525: s_objet_argument);
2526: free(argument_majuscule);
2527:
2528: (*s_etat_processus).erreur_execution =
2529: d_ex_erreur_parametre_fichier;
2530: return;
2531: }
2532:
2533: options[d_SEND_BUFFER] = 'Y';
2534:
2535: buffer_emission = (int) (*((integer8 *)
2536: (*(*l_element_courant_sous_objet)
2537: .donnee).objet));
2538: }
2539: else if (strcmp(argument_majuscule,
2540: "FORCE SEND BUFFER") == 0)
2541: {
2542: if ((*(*l_element_courant_sous_objet)
2543: .donnee).type != INT)
2544: {
2545: liberation(s_etat_processus,
2546: s_objet_argument);
2547: free(argument_majuscule);
2548:
2549: (*s_etat_processus).erreur_execution =
2550: d_ex_erreur_parametre_fichier;
2551: return;
2552: }
2553:
2554: if ((options[d_SEND_BUFFER] == 'Y') ||
2555: (options[d_FORCE_SEND_BUFFER] == 'Y'))
2556: {
2557: liberation(s_etat_processus,
2558: s_objet_argument);
2559: free(argument_majuscule);
2560:
2561: (*s_etat_processus).erreur_execution =
2562: d_ex_erreur_parametre_fichier;
2563: return;
2564: }
2565:
2566: options[d_FORCE_SEND_BUFFER] = 'Y';
2567:
2568: buffer_emission = (int) (*((integer8 *)
2569: (*(*l_element_courant_sous_objet)
2570: .donnee).objet));
2571: }
2572: else if (strcmp(argument_majuscule,
2573: "RECEIVING TIMEOUT") == 0)
2574: {
2575: if ((*(*l_element_courant_sous_objet)
2576: .donnee).type != INT)
2577: {
2578: liberation(s_etat_processus,
2579: s_objet_argument);
2580: free(argument_majuscule);
2581:
2582: (*s_etat_processus).erreur_execution =
2583: d_ex_erreur_parametre_fichier;
2584: return;
2585: }
2586:
2587: if (options[d_RECEIVING_TIMEOUT] == 'Y')
2588: {
2589: liberation(s_etat_processus,
2590: s_objet_argument);
2591: free(argument_majuscule);
2592:
2593: (*s_etat_processus).erreur_execution =
2594: d_ex_erreur_parametre_fichier;
2595: return;
2596: }
2597:
2598: options[d_RECEIVING_TIMEOUT] = 'Y';
2599:
2600: timeout_reception = (int) (*((integer8 *)
2601: (*(*l_element_courant_sous_objet)
2602: .donnee).objet));
2603: }
2604: else if (strcmp(argument_majuscule,
2605: "SENDING TIMEOUT") == 0)
2606: {
2607: if ((*(*l_element_courant_sous_objet)
2608: .donnee).type != INT)
2609: {
2610: liberation(s_etat_processus,
2611: s_objet_argument);
2612: free(argument_majuscule);
2613:
2614: (*s_etat_processus).erreur_execution =
2615: d_ex_erreur_parametre_fichier;
2616: return;
2617: }
2618:
2619: if (options[d_SENDING_TIMEOUT] == 'Y')
2620: {
2621: liberation(s_etat_processus,
2622: s_objet_argument);
2623: free(argument_majuscule);
2624:
2625: (*s_etat_processus).erreur_execution =
2626: d_ex_erreur_parametre_fichier;
2627: return;
2628: }
2629:
2630: options[d_SENDING_TIMEOUT] = 'Y';
2631:
2632: timeout_emission = (int) (*((integer8 *)
2633: (*(*l_element_courant_sous_objet)
2634: .donnee).objet));
2635: }
2636: else
2637: {
2638: liberation(s_etat_processus, s_objet_argument);
2639: free(argument_majuscule);
2640:
2641: (*s_etat_processus).erreur_execution =
2642: d_ex_erreur_parametre_fichier;
2643: return;
2644: }
2645:
2646: free(argument_majuscule);
2647: }
1.49 bertrand 2648: else if (strcmp(argument_majuscule, "STTY") == 0)
2649: {
2650: if (type_arguments == ' ')
2651: {
2652: type_arguments = 'F';
2653: }
2654: else if (type_arguments == 'S')
2655: {
2656: liberation(s_etat_processus, s_objet_argument);
2657: free(argument_majuscule);
2658:
2659: (*s_etat_processus).erreur_execution =
2660: d_ex_erreur_parametre_fichier;
2661: return;
2662: }
2663:
2664: free(argument_majuscule);
2665:
2666: l_element_courant_sous_objet =
2667: (*l_element_courant_sous_objet).suivant;
2668:
2669: if ((*(*l_element_courant_sous_objet)
2670: .donnee).type != CHN)
2671: {
2672: liberation(s_etat_processus, s_objet_argument);
2673:
2674: (*s_etat_processus).erreur_execution =
2675: d_ex_erreur_parametre_fichier;
2676: return;
2677: }
2678:
2679: l_element_courant_sous_objet =
2680: (*l_element_courant_sous_objet).suivant;
2681:
2682: if ((*(*l_element_courant_sous_objet)
2683: .donnee).type != LST)
2684: {
2685: liberation(s_etat_processus, s_objet_argument);
2686:
2687: (*s_etat_processus).erreur_execution =
2688: d_ex_erreur_parametre_fichier;
2689: return;
2690: }
2691:
2692: s_parametres_tty = (*l_element_courant).donnee;
2693: }
1.1 bertrand 2694: else
2695: {
2696: liberation(s_etat_processus, s_objet_argument);
2697: free(argument_majuscule);
2698:
2699: (*s_etat_processus).erreur_execution =
2700: d_ex_erreur_parametre_fichier;
2701: return;
2702: }
2703: }
2704: else
2705: {
2706: liberation(s_etat_processus, s_objet_argument);
2707: (*s_etat_processus).erreur_execution =
2708: d_ex_erreur_parametre_fichier;
2709:
2710: return;
2711: }
2712: }
2713: else
2714: {
2715: liberation(s_etat_processus, s_objet_argument);
2716: (*s_etat_processus).erreur_execution =
2717: d_ex_erreur_parametre_fichier;
2718:
2719: return;
2720: }
2721: }
2722: else
2723: {
2724: liberation(s_etat_processus, s_objet_argument);
2725:
2726: (*s_etat_processus).erreur_execution =
2727: d_ex_erreur_parametre_fichier;
2728: return;
2729: }
2730:
2731: l_element_courant = (*l_element_courant).suivant;
2732: }
2733:
2734: if (type_arguments == 'F')
2735: {
2736: /*
2737: * Traitement des fichiers
2738: */
2739:
2740: /*
2741: * Vérification de la cohérence et comportement par défaut
2742: */
2743:
2744: if (type_ouverture == ' ')
2745: {
2746: type_ouverture = 'U';
2747: }
2748:
2749: if (type_acces == ' ')
2750: {
2751: type_acces = 'S';
2752: }
2753:
2754: if (format == ' ')
2755: {
2756: format = 'N';
2757: }
2758:
2759: if (protection == ' ')
2760: {
2761: protection = 'N';
2762: }
2763:
2764: if ((type_ouverture == 'S') && (protection != 'N'))
2765: {
2766: liberation(s_etat_processus, s_objet_argument);
2767:
2768: (*s_etat_processus).erreur_execution =
2769: d_ex_erreur_parametre_fichier;
2770: return;
2771: }
2772:
2773: if ((type_ouverture != 'S') && (nom == NULL))
2774: {
2775: liberation(s_etat_processus, s_objet_argument);
2776:
2777: (*s_etat_processus).erreur_execution =
2778: d_ex_erreur_parametre_fichier;
2779: return;
2780: }
2781:
2782: if (((type_acces != 'I') && (position_clef != 0)) ||
1.7 bertrand 2783: ((type_acces == 'I') && (position_clef == 0) &&
2784: ((type_ouverture == 'N') || (type_ouverture == 'R') ||
2785: (type_ouverture == 'S'))))
1.1 bertrand 2786: {
2787: liberation(s_etat_processus, s_objet_argument);
2788:
2789: (*s_etat_processus).erreur_execution =
2790: d_ex_erreur_parametre_fichier;
2791: return;
2792: }
2793:
2794: if ((s_objet_resultat = allocation(s_etat_processus, FCH))
2795: == NULL)
2796: {
2797: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2798: return;
2799: }
2800:
2801: if (nom == NULL)
2802: {
2803: if ((nom_temporaire = creation_nom_fichier(s_etat_processus,
2804: (*s_etat_processus).chemin_fichiers_temporaires))
2805: == NULL)
2806: {
2807: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
2808: return;
2809: }
2810:
2811: if ((nom = malloc((strlen(nom_temporaire)
2812: + 5) * sizeof(unsigned char))) == NULL)
2813: {
2814: (*s_etat_processus).erreur_systeme =
2815: d_es_allocation_memoire;
2816: return;
2817: }
2818:
2819: sprintf(nom, "%s.rpl", nom_temporaire);
2820: free(nom_temporaire);
2821: }
2822: else
2823: {
1.6 bertrand 2824: if ((nom = transliteration(s_etat_processus, nom,
2825: d_locale, "UTF-8")) == NULL)
2826: {
2827: liberation(s_etat_processus, s_objet_argument);
2828: liberation(s_etat_processus, s_objet_resultat);
2829: return;
2830: }
1.1 bertrand 2831: }
2832:
2833: /*
2834: * Ouverture du fichier
2835: */
2836:
2837: (*((struct_fichier *) (*s_objet_resultat).objet))
2838: .nom = NULL;
2839: (*((struct_fichier *) (*s_objet_resultat).objet))
2840: .acces = type_acces;
2841: (*((struct_fichier *) (*s_objet_resultat).objet))
2842: .binaire = format;
2843: (*((struct_fichier *) (*s_objet_resultat).objet))
2844: .ouverture = type_ouverture;
2845: (*((struct_fichier *) (*s_objet_resultat).objet)).pid
2846: = getpid();
2847: (*((struct_fichier *) (*s_objet_resultat).objet)).tid
2848: = pthread_self();
2849:
2850: if (((*((struct_fichier *) (*s_objet_resultat).objet)).format =
2851: allocation(s_etat_processus, LST)) == NULL)
2852: {
1.6 bertrand 2853: free(nom);
2854:
1.1 bertrand 2855: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2856: return;
2857: }
2858:
2859: (*(*((struct_fichier *) (*s_objet_resultat).objet))
2860: .format).objet = NULL;
2861:
1.6 bertrand 2862: descripteur = NULL;
2863:
1.1 bertrand 2864: switch(type_ouverture)
2865: {
2866: case 'N' :
2867: {
2868: erreur = caracteristiques_fichier(s_etat_processus,
2869: nom, &existence, &ouverture, &unite);
2870:
2871: if ((erreur != 0) || (unite != 0))
2872: {
1.6 bertrand 2873: free(nom);
2874:
1.1 bertrand 2875: liberation(s_etat_processus, s_objet_argument);
2876: liberation(s_etat_processus, s_objet_resultat);
2877:
2878: (*s_etat_processus).erreur_execution =
2879: d_ex_erreur_acces_fichier;
2880: return;
2881: }
2882:
1.6 bertrand 2883: if (type_acces == 'S')
2884: {
2885: if ((descripteur = fopen(nom, "w+")) == NULL)
2886: {
2887: free(nom);
2888:
2889: liberation(s_etat_processus, s_objet_argument);
2890: liberation(s_etat_processus, s_objet_resultat);
2891:
2892: (*s_etat_processus).erreur_execution =
2893: d_ex_erreur_acces_fichier;
2894: return;
2895: }
2896: }
2897: else
1.1 bertrand 2898: {
1.6 bertrand 2899: // Si le fichier existe, on le supprime.
2900:
2901: if (unlink(nom) != 0)
2902: {
2903: free(nom);
2904:
2905: liberation(s_etat_processus, s_objet_argument);
2906: liberation(s_etat_processus, s_objet_resultat);
2907:
2908: (*s_etat_processus).erreur_execution =
2909: d_ex_erreur_acces_fichier;
2910: return;
2911: }
2912:
1.40 bertrand 2913: sqlite = NULL;
2914:
1.6 bertrand 2915: if (sqlite3_open_v2(nom, &sqlite,
2916: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
2917: NULL) != SQLITE_OK)
2918: {
1.40 bertrand 2919: if (sqlite != NULL)
2920: {
2921: sqlite3_close(sqlite);
2922: }
2923:
1.6 bertrand 2924: free(nom);
2925:
2926: liberation(s_etat_processus, s_objet_argument);
2927: liberation(s_etat_processus, s_objet_resultat);
2928:
2929: (*s_etat_processus).erreur_execution =
2930: d_ex_erreur_acces_fichier;
2931: return;
2932: }
2933:
2934: if ((descripteur = fopen(nom, "a+")) == NULL)
2935: {
2936: free(nom);
2937:
2938: liberation(s_etat_processus, s_objet_argument);
2939: liberation(s_etat_processus, s_objet_resultat);
2940:
2941: (*s_etat_processus).erreur_execution =
2942: d_ex_erreur_acces_fichier;
2943: return;
2944: }
2945:
2946: if (type_acces == 'D')
2947: {
2948: if (initialisation_fichier_acces_direct(
2949: s_etat_processus, sqlite,
2950: (format == 'N') ? d_faux : d_vrai)
2951: != d_absence_erreur)
2952: {
2953: free(nom);
2954:
2955: liberation(s_etat_processus, s_objet_argument);
2956: liberation(s_etat_processus, s_objet_resultat);
2957:
2958: return;
2959: }
2960: }
2961: else
2962: {
1.7 bertrand 2963: if (position_clef == 0)
2964: {
2965: free(nom);
2966:
2967: liberation(s_etat_processus, s_objet_argument);
2968: liberation(s_etat_processus, s_objet_resultat);
2969:
2970: (*s_etat_processus).erreur_execution =
2971: d_ex_erreur_parametre_fichier;
2972: return;
2973: }
2974:
1.6 bertrand 2975: if (initialisation_fichier_acces_indexe(
1.7 bertrand 2976: s_etat_processus, sqlite, position_clef,
1.6 bertrand 2977: (format == 'N') ? d_faux : d_vrai)
2978: != d_absence_erreur)
2979: {
2980: free(nom);
2981:
2982: liberation(s_etat_processus, s_objet_argument);
2983: liberation(s_etat_processus, s_objet_resultat);
1.1 bertrand 2984:
1.6 bertrand 2985: return;
2986: }
2987: }
1.1 bertrand 2988: }
2989:
2990: break;
2991: }
2992:
2993: case 'O' :
2994: {
1.6 bertrand 2995: erreur = caracteristiques_fichier(s_etat_processus, nom,
2996: &existence, &ouverture, &unite);
1.1 bertrand 2997:
2998: if ((erreur != d_absence_erreur) || (existence == d_faux))
2999: {
1.6 bertrand 3000: free(nom);
3001:
1.1 bertrand 3002: liberation(s_etat_processus, s_objet_argument);
3003: liberation(s_etat_processus, s_objet_resultat);
3004:
3005: (*s_etat_processus).erreur_execution =
3006: d_ex_erreur_acces_fichier;
3007: return;
3008: }
3009:
1.6 bertrand 3010: if (type_acces == 'S')
1.1 bertrand 3011: {
1.6 bertrand 3012: if ((descripteur = fopen(nom, "r+")) == NULL)
3013: {
3014: free(nom);
3015:
3016: liberation(s_etat_processus, s_objet_argument);
3017: liberation(s_etat_processus, s_objet_resultat);
3018:
3019: (*s_etat_processus).erreur_execution =
3020: d_ex_erreur_acces_fichier;
3021: return;
3022: }
3023: }
3024: else
3025: {
1.40 bertrand 3026: sqlite = NULL;
3027:
1.6 bertrand 3028: if (sqlite3_open_v2(nom, &sqlite,
3029: SQLITE_OPEN_READWRITE,
3030: NULL) != SQLITE_OK)
3031: {
1.40 bertrand 3032: if (sqlite != NULL)
3033: {
3034: sqlite3_close(sqlite);
3035: }
3036:
1.6 bertrand 3037: free(nom);
3038:
3039: liberation(s_etat_processus, s_objet_argument);
3040: liberation(s_etat_processus, s_objet_resultat);
3041:
3042: (*s_etat_processus).erreur_execution =
3043: d_ex_erreur_acces_fichier;
3044: return;
3045: }
3046:
3047: if ((descripteur = fopen(nom, "a+")) == NULL)
3048: {
3049: free(nom);
3050:
3051: liberation(s_etat_processus, s_objet_argument);
3052: liberation(s_etat_processus, s_objet_resultat);
1.1 bertrand 3053:
1.6 bertrand 3054: (*s_etat_processus).erreur_execution =
3055: d_ex_erreur_acces_fichier;
3056: return;
3057: }
1.1 bertrand 3058: }
3059:
3060: break;
3061: }
3062:
3063: case 'R' :
3064: {
3065: erreur = caracteristiques_fichier(s_etat_processus,
3066: nom, &existence, &ouverture, &unite);
3067:
3068: if ((erreur != d_absence_erreur) || (existence == d_faux))
3069: {
1.6 bertrand 3070: free(nom);
3071:
1.1 bertrand 3072: liberation(s_etat_processus, s_objet_argument);
3073: liberation(s_etat_processus, s_objet_resultat);
3074:
3075: (*s_etat_processus).erreur_execution =
3076: d_ex_erreur_acces_fichier;
3077: return;
3078: }
3079:
3080: /* Test du verrou */
3081:
3082: if ((descripteur = fopen(nom, "r")) == NULL)
3083: {
1.6 bertrand 3084: free(nom);
3085:
1.1 bertrand 3086: liberation(s_etat_processus, s_objet_argument);
3087: liberation(s_etat_processus, s_objet_resultat);
3088:
3089: (*s_etat_processus).erreur_execution =
3090: d_ex_erreur_acces_fichier;
3091: return;
3092: }
3093:
3094: lock.l_type = F_WRLCK;
3095: lock.l_whence = SEEK_SET;
3096: lock.l_start = 0;
3097: lock.l_len = 0;
3098: lock.l_pid = getpid();
3099:
3100: if (fcntl(fileno(descripteur), F_GETLK, &lock) == -1)
3101: {
1.6 bertrand 3102: free(nom);
3103:
1.1 bertrand 3104: if (fclose(descripteur) != 0)
3105: {
1.6 bertrand 3106: liberation(s_etat_processus, s_objet_argument);
1.1 bertrand 3107: liberation(s_etat_processus, s_objet_resultat);
3108:
3109: (*s_etat_processus).erreur_systeme =
3110: d_es_erreur_fichier;
3111: return;
3112: }
3113:
1.6 bertrand 3114: liberation(s_etat_processus, s_objet_argument);
1.1 bertrand 3115: liberation(s_etat_processus, s_objet_resultat);
3116:
3117: (*s_etat_processus).erreur_systeme =
3118: d_es_erreur_fichier;
3119: return;
3120: }
3121:
1.6 bertrand 3122: if (lock.l_type != F_UNLCK)
3123: {
3124: free(nom);
3125:
3126: if (fclose(descripteur) != 0)
3127: {
3128: liberation(s_etat_processus, s_objet_argument);
3129: liberation(s_etat_processus, s_objet_resultat);
3130:
3131: (*s_etat_processus).erreur_systeme =
3132: d_es_erreur_fichier;
3133: return;
3134: }
3135:
3136: liberation(s_etat_processus, s_objet_argument);
3137: liberation(s_etat_processus, s_objet_resultat);
3138:
3139: (*s_etat_processus).erreur_execution =
3140: d_ex_fichier_verrouille;
3141: return;
3142: }
3143:
1.1 bertrand 3144: if (fclose(descripteur) != 0)
3145: {
1.6 bertrand 3146: free(nom);
3147:
3148: liberation(s_etat_processus, s_objet_argument);
1.1 bertrand 3149: liberation(s_etat_processus, s_objet_resultat);
3150:
3151: (*s_etat_processus).erreur_systeme =
3152: d_es_erreur_fichier;
3153: return;
3154: }
3155:
1.6 bertrand 3156: if (type_acces == 'S')
1.1 bertrand 3157: {
1.6 bertrand 3158: if ((descripteur = fopen(nom, "w+")) == NULL)
3159: {
3160: free(nom);
3161:
3162: liberation(s_etat_processus, s_objet_argument);
3163: liberation(s_etat_processus, s_objet_resultat);
3164:
3165: (*s_etat_processus).erreur_execution =
3166: d_ex_erreur_acces_fichier;
3167: return;
3168: }
3169: }
3170: else
3171: {
1.40 bertrand 3172: sqlite = NULL;
3173:
1.6 bertrand 3174: if (sqlite3_open_v2(nom, &sqlite,
3175: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
3176: NULL) != SQLITE_OK)
3177: {
1.40 bertrand 3178: if (sqlite != NULL)
3179: {
3180: sqlite3_close(sqlite);
3181: }
3182:
1.6 bertrand 3183: free(nom);
3184:
3185: liberation(s_etat_processus, s_objet_argument);
3186: liberation(s_etat_processus, s_objet_resultat);
3187:
3188: (*s_etat_processus).erreur_execution =
3189: d_ex_erreur_acces_fichier;
3190: return;
3191: }
3192:
3193: // Ouverture du fichier pour pouvoir gérer les
3194: // verrous à la façon des fichiers séquentiels.
3195:
3196: if ((descripteur = fopen(nom, "a+")) == NULL)
3197: {
3198: free(nom);
3199:
3200: liberation(s_etat_processus, s_objet_argument);
3201: liberation(s_etat_processus, s_objet_resultat);
3202:
3203: (*s_etat_processus).erreur_execution =
3204: d_ex_erreur_acces_fichier;
3205: return;
3206: }
3207:
3208: if (type_acces == 'D')
3209: {
3210: if (initialisation_fichier_acces_direct(
3211: s_etat_processus, sqlite,
3212: (format == 'N') ? d_faux : d_vrai)
3213: != d_absence_erreur)
3214: {
3215: free(nom);
3216:
3217: liberation(s_etat_processus, s_objet_argument);
3218: liberation(s_etat_processus, s_objet_resultat);
3219:
3220: return;
3221: }
3222: }
3223: else
3224: {
1.7 bertrand 3225: if (position_clef == 0)
3226: {
3227: free(nom);
3228:
3229: liberation(s_etat_processus, s_objet_argument);
3230: liberation(s_etat_processus, s_objet_resultat);
3231:
3232: (*s_etat_processus).erreur_execution =
3233: d_ex_erreur_parametre_fichier;
3234: return;
3235: }
3236:
1.6 bertrand 3237: if (initialisation_fichier_acces_indexe(
1.7 bertrand 3238: s_etat_processus, sqlite, position_clef,
1.6 bertrand 3239: (format == 'N') ? d_faux : d_vrai)
3240: != d_absence_erreur)
3241: {
3242: free(nom);
3243:
3244: liberation(s_etat_processus, s_objet_argument);
3245: liberation(s_etat_processus, s_objet_resultat);
1.1 bertrand 3246:
1.6 bertrand 3247: return;
3248: }
3249: }
1.1 bertrand 3250: }
3251:
3252: break;
3253: }
3254:
3255: case 'U' :
3256: {
3257: erreur = caracteristiques_fichier(s_etat_processus,
3258: nom, &existence, &ouverture, &unite);
3259:
3260: if (erreur == d_erreur)
3261: {
1.6 bertrand 3262: free(nom);
3263:
1.1 bertrand 3264: liberation(s_etat_processus, s_objet_argument);
3265: liberation(s_etat_processus, s_objet_resultat);
3266:
3267: (*s_etat_processus).erreur_execution =
3268: d_ex_erreur_acces_fichier;
3269: return;
3270: }
3271:
3272: if (existence == d_faux)
3273: {
1.6 bertrand 3274: if (type_acces == 'S')
3275: {
3276: if ((descripteur = fopen(nom, "w+")) == NULL)
3277: {
3278: free(nom);
3279:
3280: liberation(s_etat_processus, s_objet_argument);
3281: liberation(s_etat_processus, s_objet_resultat);
3282:
3283: (*s_etat_processus).erreur_execution =
3284: d_ex_erreur_acces_fichier;
3285: return;
3286: }
3287: }
3288: else
1.1 bertrand 3289: {
1.40 bertrand 3290: sqlite = NULL;
3291:
1.6 bertrand 3292: if (sqlite3_open_v2(nom, &sqlite,
3293: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
3294: NULL) != SQLITE_OK)
3295: {
1.40 bertrand 3296: if (sqlite != NULL)
3297: {
3298: sqlite3_close(sqlite);
3299: }
3300:
1.6 bertrand 3301: free(nom);
3302:
3303: liberation(s_etat_processus, s_objet_argument);
3304: liberation(s_etat_processus, s_objet_resultat);
3305:
3306: (*s_etat_processus).erreur_execution =
3307: d_ex_erreur_acces_fichier;
3308: return;
3309: }
3310:
3311: if ((descripteur = fopen(nom, "a+")) == NULL)
3312: {
3313: free(nom);
3314:
3315: liberation(s_etat_processus, s_objet_argument);
3316: liberation(s_etat_processus, s_objet_resultat);
3317:
3318: (*s_etat_processus).erreur_execution =
3319: d_ex_erreur_acces_fichier;
3320: return;
3321: }
3322:
3323: if (type_acces == 'D')
3324: {
3325: if (initialisation_fichier_acces_direct(
3326: s_etat_processus, sqlite,
3327: (format == 'N') ? d_faux : d_vrai)
3328: != d_absence_erreur)
3329: {
3330: free(nom);
3331:
3332: liberation(s_etat_processus,
3333: s_objet_argument);
3334: liberation(s_etat_processus,
3335: s_objet_resultat);
3336:
3337: return;
3338: }
3339: }
3340: else
3341: {
1.7 bertrand 3342: if (position_clef == 0)
3343: {
3344: free(nom);
3345:
3346: liberation(s_etat_processus,
3347: s_objet_argument);
3348: liberation(s_etat_processus,
3349: s_objet_resultat);
3350:
3351: (*s_etat_processus).erreur_execution =
3352: d_ex_erreur_parametre_fichier;
3353: return;
3354: }
3355:
1.6 bertrand 3356: if (initialisation_fichier_acces_indexe(
1.7 bertrand 3357: s_etat_processus, sqlite, position_clef,
1.6 bertrand 3358: (format == 'N') ? d_faux : d_vrai)
3359: != d_absence_erreur)
3360: {
3361: free(nom);
3362:
3363: liberation(s_etat_processus,
3364: s_objet_argument);
3365: liberation(s_etat_processus,
3366: s_objet_resultat);
1.1 bertrand 3367:
1.6 bertrand 3368: return;
3369: }
3370: }
1.1 bertrand 3371: }
3372: }
3373: else
3374: {
1.6 bertrand 3375: if (type_acces == 'S')
3376: {
3377: if ((descripteur = fopen(nom, "r+")) == NULL)
3378: {
3379: free(nom);
3380:
3381: liberation(s_etat_processus, s_objet_argument);
3382: liberation(s_etat_processus, s_objet_resultat);
3383:
3384: (*s_etat_processus).erreur_execution =
3385: d_ex_erreur_acces_fichier;
3386: return;
3387: }
3388: }
3389: else
1.1 bertrand 3390: {
1.40 bertrand 3391: sqlite = NULL;
3392:
1.6 bertrand 3393: if (sqlite3_open_v2(nom, &sqlite,
3394: SQLITE_OPEN_READWRITE,
3395: NULL) != SQLITE_OK)
3396: {
1.40 bertrand 3397: if (sqlite != NULL)
3398: {
3399: sqlite3_close(sqlite);
3400: }
3401:
1.6 bertrand 3402: free(nom);
3403:
3404: liberation(s_etat_processus, s_objet_argument);
3405: liberation(s_etat_processus, s_objet_resultat);
3406:
3407: (*s_etat_processus).erreur_execution =
3408: d_ex_erreur_acces_fichier;
3409: return;
3410: }
3411:
3412: if ((descripteur = fopen(nom, "a+")) == NULL)
3413: {
3414: free(nom);
3415:
3416: liberation(s_etat_processus, s_objet_argument);
3417: liberation(s_etat_processus, s_objet_resultat);
1.1 bertrand 3418:
1.6 bertrand 3419: (*s_etat_processus).erreur_execution =
3420: d_ex_erreur_acces_fichier;
3421: return;
3422: }
1.1 bertrand 3423: }
3424: }
3425:
3426: break;
3427: }
3428:
3429: case 'S' :
3430: {
3431: erreur = caracteristiques_fichier(s_etat_processus,
3432: nom, &existence, &ouverture, &unite);
3433:
3434: if ((erreur != d_absence_erreur) || (existence != d_faux))
3435: {
1.6 bertrand 3436: free(nom);
3437:
1.1 bertrand 3438: liberation(s_etat_processus, s_objet_argument);
3439: liberation(s_etat_processus, s_objet_resultat);
3440:
3441: (*s_etat_processus).erreur_execution =
3442: d_ex_erreur_acces_fichier;
3443: return;
3444: }
3445:
1.6 bertrand 3446: if (type_acces == 'S')
1.1 bertrand 3447: {
1.6 bertrand 3448: if ((descripteur = fopen(nom, "w+")) == NULL)
3449: {
3450: free(nom);
3451:
3452: liberation(s_etat_processus, s_objet_argument);
3453: liberation(s_etat_processus, s_objet_resultat);
3454:
3455: (*s_etat_processus).erreur_execution =
3456: d_ex_erreur_acces_fichier;
3457: return;
3458: }
3459: }
3460: else
3461: {
3462: // Si le fichier existe, on le supprime.
3463:
3464: if (unlink(nom) != 0)
3465: {
3466: free(nom);
3467:
3468: liberation(s_etat_processus, s_objet_argument);
3469: liberation(s_etat_processus, s_objet_resultat);
3470:
3471: (*s_etat_processus).erreur_execution =
3472: d_ex_erreur_acces_fichier;
3473: return;
3474: }
3475:
1.40 bertrand 3476: sqlite = NULL;
3477:
1.6 bertrand 3478: if (sqlite3_open_v2(nom, &sqlite,
3479: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
3480: NULL) != SQLITE_OK)
3481: {
1.40 bertrand 3482: if (sqlite != NULL)
3483: {
3484: sqlite3_close(sqlite);
3485: }
3486:
1.6 bertrand 3487: free(nom);
3488:
3489: liberation(s_etat_processus, s_objet_argument);
3490: liberation(s_etat_processus, s_objet_resultat);
3491:
3492: (*s_etat_processus).erreur_execution =
3493: d_ex_erreur_acces_fichier;
3494: return;
3495: }
3496:
3497: if ((descripteur = fopen(nom, "a+")) == NULL)
3498: {
3499: free(nom);
3500:
3501: liberation(s_etat_processus, s_objet_argument);
3502: liberation(s_etat_processus, s_objet_resultat);
3503:
3504: (*s_etat_processus).erreur_execution =
3505: d_ex_erreur_acces_fichier;
3506: return;
3507: }
3508:
3509: if (type_acces == 'D')
3510: {
3511: if (initialisation_fichier_acces_direct(
3512: s_etat_processus, sqlite,
3513: (format == 'N') ? d_faux : d_vrai)
3514: != d_absence_erreur)
3515: {
3516: free(nom);
3517:
3518: liberation(s_etat_processus, s_objet_argument);
3519: liberation(s_etat_processus, s_objet_resultat);
3520:
3521: return;
3522: }
3523: }
3524: else
1.7 bertrand 3525: {
3526: if (position_clef == 0)
3527: {
3528: free(nom);
3529:
3530: liberation(s_etat_processus, s_objet_argument);
3531: liberation(s_etat_processus, s_objet_resultat);
3532:
3533: (*s_etat_processus).erreur_execution =
3534: d_ex_erreur_parametre_fichier;
3535: return;
3536: }
3537:
1.6 bertrand 3538: if (initialisation_fichier_acces_indexe(
1.7 bertrand 3539: s_etat_processus, sqlite, position_clef,
1.6 bertrand 3540: (format == 'N') ? d_faux : d_vrai)
3541: != d_absence_erreur)
3542: {
3543: free(nom);
3544:
3545: liberation(s_etat_processus, s_objet_argument);
3546: liberation(s_etat_processus, s_objet_resultat);
1.1 bertrand 3547:
1.6 bertrand 3548: return;
3549: }
3550: }
1.1 bertrand 3551: }
3552:
3553: break;
3554: }
3555:
3556: default:
3557: {
3558: BUG(1, printf("type_ouverture=%c\n", type_ouverture));
3559: return;
3560: }
3561: }
3562:
3563: if (((*((struct_fichier *) (*s_objet_resultat).objet)).nom =
3564: malloc((strlen(nom) + 1) *
3565: sizeof(unsigned char))) == NULL)
3566: {
3567: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3568: return;
3569: }
3570:
1.45 bertrand 3571: if (s_parametres_tty != NULL)
3572: {
3573: // Affectation des paramètres du port série.
3574:
3575: if (tcgetattr(fileno(descripteur), &tc) != 0)
3576: {
3577: liberation(s_etat_processus, s_objet_argument);
3578: liberation(s_etat_processus, s_objet_resultat);
3579:
3580: (*s_etat_processus).erreur_systeme =
3581: d_ex_erreur_fichier;
3582: return;
3583: }
1.46 bertrand 3584:
1.49 bertrand 3585: // Un test a déjà été fait pour vérifier que s_parametres_tty
3586: // contient deux ou trois arguments.
3587:
3588: parametre_courant = ((*(struct_liste_chainee *)
3589: (*s_parametres_tty).objet)).suivant;
1.46 bertrand 3590:
3591: // Le premier paramètre concerne la vitesse du port. Il doit
3592: // toujours être présent.
3593:
3594: if (parametre_courant == NULL)
3595: {
3596: liberation(s_etat_processus, s_objet_argument);
3597: liberation(s_etat_processus, s_objet_resultat);
3598:
3599: (*s_etat_processus).erreur_execution =
3600: d_ex_erreur_parametre_fichier;
3601: return;
3602: }
3603:
3604: if ((*(*parametre_courant).donnee).type != CHN)
3605: {
3606: liberation(s_etat_processus, s_objet_argument);
3607: liberation(s_etat_processus, s_objet_resultat);
3608:
3609: (*s_etat_processus).erreur_execution =
3610: d_ex_erreur_parametre_fichier;
3611: return;
3612: }
3613:
3614: if ((parametre_courant_majuscule = conversion_majuscule(
3615: (*(*parametre_courant).donnee).objet)) == NULL)
3616: {
3617: liberation(s_etat_processus, s_objet_argument);
3618: liberation(s_etat_processus, s_objet_resultat);
3619:
3620: (*s_etat_processus).erreur_systeme =
3621: d_es_allocation_memoire;
3622: return;
3623: }
3624:
3625: position = parametre_courant_majuscule;
3626:
3627: while((*position) != d_code_fin_chaine)
3628: {
3629: if ((*position) == ',')
3630: {
3631: (*position) = ' ';
3632: }
3633:
3634: position++;
3635: }
3636:
3637: position = parametre_courant_majuscule;
3638:
3639: while((*position) != d_code_fin_chaine)
3640: {
3641: if (isalnum((*position)) != 0)
3642: {
3643: break;
3644: }
3645:
3646: position++;
3647: }
3648:
3649: // Vitesse
3650:
3651: unsigned char *vitesses[] =
1.49 bertrand 3652: { "0", "50", "75", "110", "134", "150",
3653: "200", "300", "600", "1200", "1800", "2400",
3654: "4800", "9600", "19200", "38400", "57600",
3655: "115200", "230400", NULL };
1.46 bertrand 3656: int vitesses_constantes[] =
3657: { B0, B50, B75, B110, B134, B150, B200, B300, B600,
3658: B1200, B1800, B2400, B4800, B9600, B19200, B38400,
3659: B57600, B115200, B230400, 0 };
3660: unsigned int vitesse_courante;
3661:
3662: vitesse_courante = 0;
3663:
3664: while(vitesses[vitesse_courante] != NULL)
3665: {
3666: if (strncmp(position, vitesses[vitesse_courante],
3667: strlen(vitesses[vitesse_courante])) == 0)
3668: {
3669: if (position[strlen(vitesses[vitesse_courante])] ==
3670: d_code_espace)
3671: {
3672: tc.c_cflag &= ~CBAUD;
3673: tc.c_cflag |= vitesses_constantes[vitesse_courante];
3674: position += strlen(vitesses[vitesse_courante]);
3675:
3676: break;
3677: }
3678: }
3679:
3680: vitesse_courante++;
3681: }
3682:
3683: if (vitesses[vitesse_courante] == NULL)
3684: {
3685: // La vitesse indiquée n'est pas une vitesse autorisée.
3686:
3687: free(parametre_courant_majuscule);
3688: liberation(s_etat_processus, s_objet_argument);
3689: liberation(s_etat_processus, s_objet_resultat);
3690:
3691: (*s_etat_processus).erreur_execution =
3692: d_ex_erreur_parametre_fichier;
3693: return;
3694: }
3695:
3696: // Nombre de bits par caractère.
3697:
3698: while((*position) != d_code_fin_chaine)
3699: {
3700: if (isalnum((*position)) != 0)
3701: {
3702: break;
3703: }
3704:
3705: position++;
3706: }
3707:
3708: switch((*position))
3709: {
3710: case '5':
3711: {
3712: tc.c_cflag &= ~CSIZE;
3713: tc.c_cflag |= CS5;
3714: break;
3715: }
3716:
3717: case '6':
3718: {
3719: tc.c_cflag &= ~CSIZE;
3720: tc.c_cflag |= CS6;
3721: break;
3722: }
3723:
3724: case '7':
3725: {
3726: tc.c_cflag &= ~CSIZE;
3727: tc.c_cflag |= CS7;
3728: break;
3729: }
3730:
3731: case '8':
3732: {
3733: tc.c_cflag &= ~CSIZE;
3734: tc.c_cflag |= CS8;
3735: break;
3736: }
3737:
3738: default:
3739: {
3740: free(parametre_courant_majuscule);
3741: liberation(s_etat_processus, s_objet_argument);
3742: liberation(s_etat_processus, s_objet_resultat);
3743:
3744: (*s_etat_processus).erreur_execution =
3745: d_ex_erreur_parametre_fichier;
3746: return;
3747: }
3748: }
3749:
3750: position++;
3751:
3752: if ((*position) != d_code_espace)
3753: {
3754: free(parametre_courant_majuscule);
3755: liberation(s_etat_processus, s_objet_argument);
3756: liberation(s_etat_processus, s_objet_resultat);
3757:
3758: (*s_etat_processus).erreur_execution =
3759: d_ex_erreur_parametre_fichier;
3760: return;
3761: }
3762:
3763: // Parité
3764:
3765: while((*position) != d_code_fin_chaine)
3766: {
3767: if (isalnum((*position)) != 0)
3768: {
3769: break;
3770: }
3771:
3772: position++;
3773: }
3774:
3775: switch((*position))
3776: {
3777: case 'N':
3778: {
3779: tc.c_cflag &= ~PARENB;
3780: break;
3781: }
3782:
3783: case 'O':
3784: {
3785: tc.c_cflag |= PARENB;
3786: tc.c_cflag |= PARODD;
3787: break;
3788: }
3789:
3790: case 'E':
3791: {
3792: tc.c_cflag |= PARENB;
3793: tc.c_cflag &= ~PARODD;
3794: break;
3795: }
3796:
3797: default:
3798: {
3799: free(parametre_courant_majuscule);
3800: liberation(s_etat_processus, s_objet_argument);
3801: liberation(s_etat_processus, s_objet_resultat);
3802:
3803: (*s_etat_processus).erreur_execution =
3804: d_ex_erreur_parametre_fichier;
3805: return;
3806: }
3807: }
3808:
1.49 bertrand 3809: position++;
3810:
1.46 bertrand 3811: if ((*position) != d_code_espace)
3812: {
3813: free(parametre_courant_majuscule);
3814: liberation(s_etat_processus, s_objet_argument);
3815: liberation(s_etat_processus, s_objet_resultat);
3816:
3817: (*s_etat_processus).erreur_execution =
3818: d_ex_erreur_parametre_fichier;
3819: return;
3820: }
3821:
3822: // Bits de stop
3823:
3824: while((*position) != d_code_fin_chaine)
3825: {
3826: if (isalnum((*position)) != 0)
3827: {
3828: break;
3829: }
3830:
3831: position++;
3832: }
3833:
3834: switch((*position))
3835: {
3836: case '1':
3837: {
3838: tc.c_cflag &= ~CSTOPB;
3839: break;
3840: }
3841:
3842: case '2':
3843: {
3844: tc.c_cflag |= CSTOPB;
3845: break;
3846: }
3847:
3848: default:
3849: {
3850: free(parametre_courant_majuscule);
3851: liberation(s_etat_processus, s_objet_argument);
3852: liberation(s_etat_processus, s_objet_resultat);
3853:
3854: (*s_etat_processus).erreur_execution =
3855: d_ex_erreur_parametre_fichier;
3856: return;
3857: }
3858: }
3859:
3860: // S'il reste autre chose que des espaces, il y a un
3861: // problème de paramètres.
3862:
1.49 bertrand 3863: position++;
3864:
1.46 bertrand 3865: while((*position) != d_code_fin_chaine)
3866: {
3867: if ((*position) != d_code_espace)
3868: {
3869: free(parametre_courant_majuscule);
3870: liberation(s_etat_processus, s_objet_argument);
3871: liberation(s_etat_processus, s_objet_resultat);
3872:
3873: (*s_etat_processus).erreur_execution =
3874: d_ex_erreur_parametre_fichier;
3875: return;
3876: }
3877:
3878: position++;
3879: }
3880:
3881: // Autres paramètres
3882:
3883: free(parametre_courant_majuscule);
1.48 bertrand 3884: parametre_courant = (*parametre_courant).suivant;
1.46 bertrand 3885:
1.49 bertrand 3886: if (parametre_courant != NULL)
3887: {
3888: parametre_courant = (*(*parametre_courant).donnee).objet;
3889: }
3890:
1.46 bertrand 3891: while(parametre_courant != NULL)
3892: {
1.48 bertrand 3893: if ((*(*parametre_courant).donnee).type != CHN)
3894: {
3895: liberation(s_etat_processus, s_objet_argument);
3896: liberation(s_etat_processus, s_objet_resultat);
3897:
3898: (*s_etat_processus).erreur_execution =
3899: d_ex_erreur_parametre_fichier;
3900: return;
3901: }
3902:
3903: if ((parametre_courant_majuscule = conversion_majuscule(
3904: (*(*parametre_courant).donnee).objet)) == NULL)
3905: {
3906: (*s_etat_processus).erreur_systeme =
3907: d_es_allocation_memoire;
3908: return;
3909: }
3910:
3911: position = parametre_courant_majuscule;
3912: negation = d_faux;
3913:
3914: unsigned char *fonctions[] =
3915: { "IGNBRK", "BRKINT", "IGNPAR", "PARMRK",
3916: "INPCK", "ISTRIP", "INLCR", "IGNCR", "ICRNL",
3917: "IXON", "IXANY", "IXOFF", "OPOST",
3918: "ONLCR", "OCRNL", "ONOCR", "ONLRET",
3919: "OFILL", "HUPCL", "CLOCAL", "CRTSCTS",
3920: "ISIG", "ICANON", "ECHO", "ECHOE", "ECHOK",
3921: "ECHONL", "NOFLSH", "TOSTOP", "IEXTEN", NULL };
3922: int fonctions_constantes[] =
3923: { /* c_iflag */
3924: 1, IGNBRK, 1, BRKINT, 1, IGNPAR, 1, PARMRK,
3925: 1, INPCK, 1, ISTRIP, 1, INLCR, 1, IGNCR, 1, ICRNL,
3926: 1, IXON, 1, IXANY, 1, IXOFF,
3927: /* c_oflag */
3928: 2 , OPOST, 2, ONLCR, 2, OCRNL, 2, ONOCR, 2, ONLRET,
3929: 2, OFILL, 2, HUPCL,
3930: /* c_cflag */
3931: 3, CLOCAL, 3, CRTSCTS,
3932: /* c_lfkag */
3933: 4, ISIG, 4, ICANON, 4, ECHO, 4, ECHOE, 4, ECHOK,
3934: 4, ECHONL, 4, NOFLSH, 4, TOSTOP, 4, IEXTEN };
3935: unsigned int fonction_courante;
3936:
1.49 bertrand 3937: // On vient de trouver quelque chose à interpréter.
3938:
3939: if (strncmp(position, "NO ", 3) == 0)
1.48 bertrand 3940: {
1.49 bertrand 3941: position += 3;
3942: negation = d_vrai;
1.48 bertrand 3943: }
3944:
3945: for(fonction_courante = 0;
3946: fonctions[fonction_courante] != NULL;
3947: fonction_courante++)
3948: {
3949: if (strcmp(fonctions[fonction_courante], position)
3950: == 0)
3951: {
3952: if (negation == d_vrai)
3953: {
3954: switch(fonctions_constantes
3955: [fonction_courante * 2])
3956: {
3957: case 1:
3958: {
3959: tc.c_iflag &= ~fonctions_constantes
1.49 bertrand 3960: [(fonction_courante * 2) + 1];
1.48 bertrand 3961: break;
3962: }
3963:
3964: case 2:
3965: {
3966: tc.c_oflag &= ~fonctions_constantes
1.49 bertrand 3967: [(fonction_courante * 2) + 1];
1.48 bertrand 3968: break;
3969: }
3970:
3971: case 3:
3972: {
3973: tc.c_cflag &= ~fonctions_constantes
1.49 bertrand 3974: [(fonction_courante * 2) + 1];
1.48 bertrand 3975: break;
3976: }
3977:
3978: case 4:
3979: {
3980: tc.c_lflag &= ~fonctions_constantes
1.49 bertrand 3981: [(fonction_courante * 2) + 1];
1.48 bertrand 3982: break;
3983: }
3984: }
3985: }
3986: else
3987: {
3988: switch(fonctions_constantes
3989: [fonction_courante * 2])
3990: {
3991: case 1:
3992: {
3993: tc.c_iflag |= fonctions_constantes
1.49 bertrand 3994: [(fonction_courante * 2) + 1];
1.48 bertrand 3995: break;
3996: }
3997:
3998: case 2:
3999: {
4000: tc.c_oflag |= fonctions_constantes
1.49 bertrand 4001: [(fonction_courante * 2) + 1];
1.48 bertrand 4002: break;
4003: }
4004:
4005: case 3:
4006: {
4007: tc.c_cflag |= fonctions_constantes
1.49 bertrand 4008: [(fonction_courante * 2) + 1];
1.48 bertrand 4009: break;
4010: }
4011:
4012: case 4:
4013: {
4014: tc.c_lflag |= fonctions_constantes
1.49 bertrand 4015: [(fonction_courante * 2) + 1];
1.48 bertrand 4016: break;
4017: }
4018: }
4019: }
4020:
4021: break;
4022: }
4023: }
4024:
4025: if (fonctions[fonction_courante] == NULL)
4026: {
4027: free(parametre_courant_majuscule);
4028: liberation(s_etat_processus, s_objet_argument);
4029: liberation(s_etat_processus, s_objet_resultat);
4030:
4031: (*s_etat_processus).erreur_execution =
4032: d_ex_erreur_parametre_fichier;
4033: return;
4034: }
4035:
4036: free(parametre_courant_majuscule);
1.46 bertrand 4037: parametre_courant = (*parametre_courant).suivant;
4038: }
1.47 bertrand 4039:
4040: if (tcsetattr(fileno(descripteur), TCSANOW, &tc) != 0)
4041: {
4042: liberation(s_etat_processus, s_objet_argument);
4043: liberation(s_etat_processus, s_objet_resultat);
4044:
4045: (*s_etat_processus).erreur_systeme =
4046: d_ex_erreur_fichier;
4047: return;
4048: }
1.45 bertrand 4049: }
4050:
1.1 bertrand 4051: strcpy((*((struct_fichier *) (*s_objet_resultat).objet)).nom, nom);
4052: liberation(s_etat_processus, s_objet_argument);
4053:
4054: (*((struct_fichier *) (*s_objet_resultat).objet)).protection =
4055: protection;
4056: (*((struct_fichier *) (*s_objet_resultat).objet)).position_clef =
4057: position_clef;
4058:
4059: rewind(descripteur);
4060:
4061: lock.l_type = F_WRLCK;
4062: lock.l_whence = SEEK_SET;
4063: lock.l_start = 0;
4064: lock.l_len = 0;
4065: lock.l_pid = getpid();
4066:
4067: if (fcntl(fileno(descripteur), F_GETLK, &lock) == -1)
4068: {
4069: if (fclose(descripteur) != 0)
4070: {
4071: liberation(s_etat_processus, s_objet_resultat);
4072:
1.6 bertrand 4073: (*s_etat_processus).erreur_systeme =
4074: d_es_erreur_fichier;
1.1 bertrand 4075: return;
4076: }
4077:
4078: liberation(s_etat_processus, s_objet_resultat);
4079:
4080: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
4081: return;
4082: }
4083:
4084: if (lock.l_type == F_UNLCK)
4085: {
4086: /*
4087: * Positionnement d'un verrou exclusif d'écriture par défaut
4088: */
4089:
4090: lock.l_type = F_RDLCK;
4091: lock.l_whence = SEEK_SET;
4092: lock.l_start = 0;
4093: lock.l_len = 0;
4094: lock.l_pid = getpid();
4095:
4096: if (fcntl(fileno(descripteur), F_SETLK, &lock) == -1)
4097: {
4098: if (fclose(descripteur) != 0)
4099: {
4100: liberation(s_etat_processus, s_objet_resultat);
4101:
4102: (*s_etat_processus).erreur_systeme =
4103: d_es_erreur_fichier;
4104: return;
4105: }
4106:
4107: liberation(s_etat_processus, s_objet_resultat);
4108:
1.6 bertrand 4109: (*s_etat_processus).erreur_systeme =
4110: d_es_erreur_fichier;
1.1 bertrand 4111: return;
4112: }
4113: }
4114: else
4115: {
4116: /*
4117: * Test de la cohérence du verrou avec l'option PROTECTION
4118: */
4119:
4120: if ((lock.l_type == F_RDLCK) && (protection != 'R'))
4121: {
1.6 bertrand 4122: free(nom);
4123:
1.1 bertrand 4124: if (fclose(descripteur) != 0)
4125: {
4126: liberation(s_etat_processus, s_objet_resultat);
4127:
4128: (*s_etat_processus).erreur_systeme =
4129: d_es_erreur_fichier;
4130: return;
4131: }
4132:
4133: liberation(s_etat_processus, s_objet_resultat);
4134:
4135: (*s_etat_processus).erreur_execution =
4136: d_ex_fichier_verrouille;
4137: return;
4138: }
4139: else if ((lock.l_type == F_WRLCK) && (protection != 'W'))
4140: {
1.6 bertrand 4141: free(nom);
4142:
1.1 bertrand 4143: if (fclose(descripteur) != 0)
4144: {
4145: liberation(s_etat_processus, s_objet_resultat);
4146:
4147: (*s_etat_processus).erreur_systeme =
4148: d_es_erreur_fichier;
4149: return;
4150: }
4151:
4152: liberation(s_etat_processus, s_objet_resultat);
4153:
4154: (*s_etat_processus).erreur_execution =
4155: d_ex_fichier_verrouille;
4156: return;
4157: }
4158: else
4159: {
1.6 bertrand 4160: free(nom);
4161:
4162: if (fclose(descripteur) != 0)
4163: {
4164: liberation(s_etat_processus, s_objet_resultat);
4165:
4166: (*s_etat_processus).erreur_systeme =
4167: d_es_erreur_fichier;
4168: return;
4169: }
4170:
1.1 bertrand 4171: liberation(s_etat_processus, s_objet_resultat);
4172:
4173: (*s_etat_processus).erreur_execution =
4174: d_ex_fichier_verrouille;
4175: return;
4176: }
4177: }
4178:
4179: /*
4180: * Gestion de la liste des fichiers ouverts
4181: */
4182:
4183: l_element_courant = (*s_etat_processus).s_fichiers;
4184:
4185: if (l_element_courant == NULL)
4186: {
4187: if (((*s_etat_processus).s_fichiers = malloc(sizeof(
4188: struct_liste_chainee))) == NULL)
4189: {
4190: (*s_etat_processus).erreur_systeme =
4191: d_es_allocation_memoire;
4192: return;
4193: }
4194:
4195: (*(*s_etat_processus).s_fichiers).suivant = NULL;
4196:
4197: if (((*(*s_etat_processus).s_fichiers).donnee =
4198: malloc(sizeof(struct_descripteur_fichier))) == NULL)
4199: {
4200: (*s_etat_processus).erreur_systeme =
4201: d_es_allocation_memoire;
4202: return;
4203: }
4204:
4205: l_element_courant = (*s_etat_processus).s_fichiers;
4206: prochain_descripteur = 0;
4207: }
4208: else
4209: {
4210: /*
4211: * Recherche du premier descripteur libre
4212: */
4213:
1.6 bertrand 4214: if ((chaine_descripteurs = malloc(sizeof(unsigned char) *
4215: (ds_nombre_maximum_fichiers_ouverts + 1))) == NULL)
1.1 bertrand 4216: {
4217: (*s_etat_processus).erreur_systeme =
4218: d_es_allocation_memoire;
4219: return;
4220: }
4221:
4222: for(pointeur = chaine_descripteurs, i = 0;
4223: i < ds_nombre_maximum_fichiers_ouverts;
4224: (*pointeur) = d_code_espace, pointeur++, i++);
4225: (*pointeur) = d_code_fin_chaine;
4226:
4227: do
4228: {
4229: chaine_descripteurs[(*((struct_descripteur_fichier *)
4230: (*l_element_courant).donnee)).identifiant] = '-';
4231: l_element_courant = (*l_element_courant).suivant;
4232: } while(l_element_courant != NULL);
4233:
4234: i = 0;
4235: pointeur = chaine_descripteurs;
4236:
4237: while(i < ds_nombre_maximum_fichiers_ouverts)
4238: {
4239: if ((*pointeur) == ' ')
4240: {
4241: break;
4242: }
4243:
4244: pointeur++;
4245: i++;
4246: }
4247:
4248: free(chaine_descripteurs);
4249:
4250: if (i == ds_nombre_maximum_fichiers_ouverts)
4251: {
4252: (*s_etat_processus).erreur_systeme =
4253: d_es_nombre_max_descripteurs;
4254: return;
4255: }
4256:
4257: prochain_descripteur = i;
4258:
4259: /*
4260: * Ajout d'un élément à la fin de la liste chaînée
4261: */
4262:
4263: l_element_courant = (*s_etat_processus).s_fichiers;
4264: while((*l_element_courant).suivant != NULL)
4265: {
4266: l_element_courant = (*l_element_courant).suivant;
4267: }
4268:
4269: if (((*l_element_courant).suivant =
4270: allocation_maillon(s_etat_processus)) == NULL)
4271: {
4272: (*s_etat_processus).erreur_systeme =
4273: d_es_allocation_memoire;
4274: return;
4275: }
4276:
4277: l_element_courant = (*l_element_courant).suivant;
4278: (*l_element_courant).suivant = NULL;
4279:
4280: if (((*l_element_courant).donnee =
4281: malloc(sizeof(struct_descripteur_fichier))) == NULL)
4282: {
4283: (*s_etat_processus).erreur_systeme =
4284: d_es_allocation_memoire;
4285: return;
4286: }
4287: }
4288:
4289: (*((struct_fichier *) (*s_objet_resultat).objet)).descripteur
4290: = prochain_descripteur;
4291: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
4292: .identifiant = prochain_descripteur;
1.6 bertrand 4293:
4294: if (type_acces == 'S')
4295: {
4296: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
4297: .type = 'C';
4298: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
4299: .descripteur_c = descripteur;
4300: }
4301: else
4302: {
4303: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
4304: .type = 'S';
4305: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
4306: .descripteur_c = descripteur;
4307: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
4308: .descripteur_sqlite = sqlite;
4309: }
4310:
1.1 bertrand 4311: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
4312: .pid = getpid();
4313: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
4314: .tid = pthread_self();
4315: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
4316: .effacement = (type_ouverture == 'S') ? 'Y' : 'N';
4317:
1.6 bertrand 4318: (*((struct_descripteur_fichier *) (*l_element_courant)
4319: .donnee)).nom = nom;
1.1 bertrand 4320: }
4321: else if (type_arguments == 'S')
4322: {
4323: /*
4324: * Traitement des sockets
4325: */
4326:
4327:
4328: inline logical1 options_socket()
4329: {
4330: /*
4331: * Options des sockets
4332: */
4333:
4334: # define WARNING(message) \
4335: if ((*s_etat_processus).langue != 'F') \
4336: printf("+++Warning : %s unavailable on host system\n", \
4337: message); \
4338: else \
4339: printf("+++Attention : %s non disponible sur le système " \
4340: "hôte\n", message)
4341:
4342: if (options[d_BIND_TO_DEVICE] == 'Y')
4343: {
4344: # ifdef SO_BINDTODEVICE
4345: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
4346: .objet)).socket, SOL_SOCKET, SO_BINDTODEVICE,
4347: peripherique, strlen(peripherique)) != 0)
4348: {
4349: liberation(s_etat_processus, s_objet_argument);
4350: liberation(s_etat_processus, s_objet_resultat);
4351:
4352: (*s_etat_processus).erreur_execution =
4353: d_ex_erreur_parametre_fichier;
4354: return(d_erreur);
4355: }
4356: # else
4357: WARNING("BIND TO DEVICE");
4358: # endif
4359: }
4360:
4361: if (options[d_BROADCAST] == 'Y')
4362: {
4363: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
4364: .objet)).socket, SOL_SOCKET, SO_BROADCAST,
4365: &drapeau, sizeof(drapeau)) != 0)
4366: {
4367: liberation(s_etat_processus, s_objet_argument);
4368: liberation(s_etat_processus, s_objet_resultat);
4369:
4370: (*s_etat_processus).erreur_execution =
4371: d_ex_erreur_parametre_fichier;
4372: return(d_erreur);
4373: }
4374: }
4375:
4376: if (options[d_DONT_ROUTE] == 'Y')
4377: {
4378: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
4379: .objet)).socket, SOL_SOCKET, SO_DONTROUTE,
4380: &drapeau, sizeof(drapeau)) != 0)
4381: {
4382: liberation(s_etat_processus, s_objet_argument);
4383: liberation(s_etat_processus, s_objet_resultat);
4384:
4385: (*s_etat_processus).erreur_execution =
4386: d_ex_erreur_parametre_fichier;
4387: return(d_erreur);
4388: }
4389: }
4390:
4391: if (options[d_KEEP_ALIVE] == 'Y')
4392: {
4393: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
4394: .objet)).socket, SOL_SOCKET, SO_KEEPALIVE,
4395: &drapeau, sizeof(drapeau)) != 0)
4396: {
4397: liberation(s_etat_processus, s_objet_argument);
4398: liberation(s_etat_processus, s_objet_resultat);
4399:
4400: (*s_etat_processus).erreur_execution =
4401: d_ex_erreur_parametre_fichier;
4402: return(d_erreur);
4403: }
4404: }
4405:
4406: if (options[d_PRIORITY] == 'Y')
4407: {
4408: # ifdef SO_PRIORITY
4409: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
4410: .objet)).socket, SOL_SOCKET, SO_PRIORITY,
4411: &priorite, sizeof(priorite)) != 0)
4412: {
4413: liberation(s_etat_processus, s_objet_argument);
4414: liberation(s_etat_processus, s_objet_resultat);
4415:
4416: (*s_etat_processus).erreur_execution =
4417: d_ex_erreur_parametre_fichier;
4418: return(d_erreur);
4419: }
4420: # else
4421: WARNING("PRIORITY");
4422: # endif
4423: }
4424:
4425: if (options[d_RECEIVE_BUFFER] == 'Y')
4426: {
4427: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
4428: .objet)).socket, SOL_SOCKET, SO_RCVBUF,
4429: &buffer_reception, sizeof(buffer_reception)) != 0)
4430: {
4431: liberation(s_etat_processus, s_objet_argument);
4432: liberation(s_etat_processus, s_objet_resultat);
4433:
4434: (*s_etat_processus).erreur_execution =
4435: d_ex_erreur_parametre_fichier;
4436: return(d_erreur);
4437: }
4438: }
4439:
4440: if (options[d_FORCE_RECEIVE_BUFFER] == 'Y')
4441: {
4442: # ifdef SO_RCVBUFFORCE
4443: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
4444: .objet)).socket, SOL_SOCKET, SO_RCVBUFFORCE,
4445: &buffer_reception, sizeof(buffer_reception))
4446: != 0)
4447: {
4448: liberation(s_etat_processus, s_objet_argument);
4449: liberation(s_etat_processus, s_objet_resultat);
4450:
4451: (*s_etat_processus).erreur_execution =
4452: d_ex_erreur_parametre_fichier;
4453: return(d_erreur);
4454: }
4455: # else
4456: WARNING("FORCE_RECEIVE_BUFFER");
4457: # endif
4458: }
4459:
4460: if (options[d_SEND_BUFFER] == 'Y')
4461: {
4462: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
4463: .objet)).socket, SOL_SOCKET, SO_SNDBUF,
4464: &buffer_emission, sizeof(buffer_emission)) != 0)
4465: {
4466: liberation(s_etat_processus, s_objet_argument);
4467: liberation(s_etat_processus, s_objet_resultat);
4468:
4469: (*s_etat_processus).erreur_execution =
4470: d_ex_erreur_parametre_fichier;
4471: return(d_erreur);
4472: }
4473: }
4474:
4475: if (options[d_FORCE_SEND_BUFFER] == 'Y')
4476: {
4477: # ifdef SO_SNDBUFFORCE
4478: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
4479: .objet)).socket, SOL_SOCKET, SO_SNDBUFFORCE,
4480: &buffer_emission, sizeof(buffer_emission)) != 0)
4481: {
4482: liberation(s_etat_processus, s_objet_argument);
4483: liberation(s_etat_processus, s_objet_resultat);
4484:
4485: (*s_etat_processus).erreur_execution =
4486: d_ex_erreur_parametre_fichier;
4487: return(d_erreur);
4488: }
4489: # else
4490: WARNING("FORCE_SEND_BUFFER");
4491: # endif
4492: }
4493:
4494: if (options[d_RECEIVING_TIMEOUT] == 'Y')
4495: {
4496: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
4497: .objet)).socket, SOL_SOCKET, SO_RCVTIMEO,
4498: &timeout_reception, sizeof(timeout_reception)) != 0)
4499: {
4500: liberation(s_etat_processus, s_objet_argument);
4501: liberation(s_etat_processus, s_objet_resultat);
4502:
4503: (*s_etat_processus).erreur_execution =
4504: d_ex_erreur_parametre_fichier;
4505: return(d_erreur);
4506: }
4507: }
4508:
4509: if (options[d_SENDING_TIMEOUT] == 'Y')
4510: {
4511: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
4512: .objet)).socket, SOL_SOCKET, SO_SNDTIMEO,
4513: &timeout_emission, sizeof(timeout_emission)) != 0)
4514: {
4515: liberation(s_etat_processus, s_objet_argument);
4516: liberation(s_etat_processus, s_objet_resultat);
4517:
4518: (*s_etat_processus).erreur_execution =
4519: d_ex_erreur_parametre_fichier;
4520: return(d_erreur);
4521: }
4522: }
4523:
4524: if (options[d_REUSE_ADDRESS] == 'Y')
4525: {
4526: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
4527: .objet)).socket, SOL_SOCKET, SO_REUSEADDR,
4528: &drapeau, sizeof(drapeau)) != 0)
4529: {
4530: liberation(s_etat_processus, s_objet_argument);
4531: liberation(s_etat_processus, s_objet_resultat);
4532:
4533: (*s_etat_processus).erreur_execution =
4534: d_ex_erreur_parametre_fichier;
4535: return(d_erreur);
4536: }
4537: }
4538:
4539: return(d_absence_erreur);
4540: #undef WARNING
4541: }
4542:
4543: /*
4544: * Vérification de la cohérence des arguments et traitement
4545: * des valeurs par défaut.
4546: */
4547:
4548: if (format == ' ')
4549: {
4550: format = 'N';
4551: }
4552:
4553: if (protection == ' ')
4554: {
4555: protection = 'N';
4556: }
4557:
4558: if (type_domaine == ' ')
4559: {
4560: type_domaine = 'L';
4561: }
4562:
4563: if (type_socket == ' ')
4564: {
4565: type_socket = 'S';
4566: type = SOCK_STREAM;
4567: }
4568:
4569: if (nom != NULL)
4570: {
4571: if (strcmp(protocole, "") == 0)
4572: {
4573: strcpy(protocole, "UNIX");
4574: }
4575: }
4576: else
4577: {
4578: if (strcmp(protocole, "") == 0)
4579: {
4580: strcpy(protocole, "IPV4");
4581: }
4582: }
4583:
4584: if ((nom != NULL) && (hote != NULL))
4585: {
4586: liberation(s_etat_processus, s_objet_argument);
4587:
4588: (*s_etat_processus).erreur_execution =
4589: d_ex_erreur_parametre_fichier;
4590: return;
4591: }
4592:
4593: if ((nom != NULL) && (strcmp(protocole, "UNIX") != 0))
4594: {
4595: liberation(s_etat_processus, s_objet_argument);
4596:
4597: (*s_etat_processus).erreur_execution =
4598: d_ex_erreur_parametre_fichier;
4599: return;
4600: }
4601:
4602: if ((hote != NULL) && (strcmp(protocole, "UNIX") == 0))
4603: {
4604: liberation(s_etat_processus, s_objet_argument);
4605:
4606: (*s_etat_processus).erreur_execution =
4607: d_ex_erreur_parametre_fichier;
4608: return;
4609: }
4610:
4611: if ((nom != NULL) && (type_domaine == 'F') && (type_adresse != ' '))
4612: {
4613: liberation(s_etat_processus, s_objet_argument);
4614:
4615: (*s_etat_processus).erreur_execution =
4616: d_ex_erreur_parametre_fichier;
4617: return;
4618: }
4619:
4620: if ((presence_port == d_vrai) && (nom != NULL))
4621: {
4622: liberation(s_etat_processus, s_objet_argument);
4623:
4624: (*s_etat_processus).erreur_execution =
4625: d_ex_erreur_parametre_fichier;
4626: return;
4627: }
4628:
1.42 bertrand 4629: if ((type_adresse == ' ') && (type_domaine == 'L'))
4630: {
4631: if (strcmp(protocole, "IPV4") == 0)
4632: {
4633: for(i = 0; i < 4; adresse[i++] = 0);
4634: type_adresse = '4';
4635: }
4636: else if (strcmp(protocole, "IPV6") == 0)
4637: {
4638: for(i = 0; i < 16; adresse[i++] = 0);
4639: type_adresse = '6';
4640: }
4641: else
4642: {
4643: liberation(s_etat_processus, s_objet_argument);
4644:
4645: (*s_etat_processus).erreur_execution =
4646: d_ex_erreur_parametre_fichier;
4647: return;
4648: }
4649: }
4650:
1.1 bertrand 4651: if (((strcmp(protocole, "IPV4") == 0) && (type_adresse == '6')) ||
4652: ((strcmp(protocole, "IPV6") == 0) && (type_adresse == '4')))
4653: {
4654: liberation(s_etat_processus, s_objet_argument);
4655:
4656: (*s_etat_processus).erreur_execution =
4657: d_ex_erreur_parametre_fichier;
4658: return;
4659: }
4660:
4661: if ((nombre_maximal_connexions != 0) && ((type_socket != 'S') &&
4662: (type_socket != 'Q')))
4663: {
4664: liberation(s_etat_processus, s_objet_argument);
4665:
4666: (*s_etat_processus).erreur_execution =
4667: d_ex_erreur_parametre_fichier;
4668: return;
4669: }
4670:
4671: if (nombre_maximal_connexions == 0)
4672: {
4673: nombre_maximal_connexions = 1;
4674: }
4675:
4676: if (protocole_socket == NULL)
4677: {
4678: protocole_numerique = 0;
4679: }
4680: else
4681: {
1.42 bertrand 4682: if (strcmp(protocole_socket, "IPV4") == 0)
1.1 bertrand 4683: {
4684: protocole_socket[2] = d_code_fin_chaine;
4685: }
4686:
4687: if ((s_protocole = getprotobyname(protocole_socket)) == NULL)
4688: {
4689: liberation(s_etat_processus, s_objet_argument);
4690:
4691: (*s_etat_processus).erreur_execution =
4692: d_ex_erreur_parametre_fichier;
4693: return;
4694: }
4695:
4696: protocole_numerique = (*s_protocole).p_proto;
4697: }
4698:
4699: if ((s_objet_resultat = allocation(s_etat_processus, SCK))
4700: == NULL)
4701: {
4702: (*s_etat_processus).erreur_systeme =
4703: d_es_allocation_memoire;
4704: return;
4705: }
4706:
4707: if (((*((struct_socket *) (*s_objet_resultat).objet)).format =
4708: allocation(s_etat_processus, LST)) == NULL)
4709: {
4710: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
4711: return;
4712: }
4713:
4714: (*((struct_socket *) (*s_objet_resultat).objet)).protection
4715: = protection;
4716: (*(*((struct_socket *) (*s_objet_resultat).objet))
4717: .format).objet = NULL;
1.51 bertrand 4718: (*((struct_socket *) (*s_objet_resultat).objet)).adresse = NULL;
1.1 bertrand 4719:
4720: switch(type_socket)
4721: {
4722: case 'S' :
4723: type = SOCK_STREAM;
4724: strcpy((*((struct_socket *) (*s_objet_resultat).objet)).
4725: type, "STREAM");
4726: break;
4727:
4728: case 'D' :
4729: type = SOCK_DGRAM;
4730: strcpy((*((struct_socket *) (*s_objet_resultat).objet)).
4731: type, "DATAGRAM");
4732: break;
4733:
4734: case 'Q' :
4735: strcpy((*((struct_socket *) (*s_objet_resultat).objet)).
4736: type, "SEQUENTIAL DATAGRAM");
4737: type = SOCK_SEQPACKET;
4738: break;
4739:
4740: case 'R' :
4741: type = SOCK_RAW;
4742: strcpy((*((struct_socket *) (*s_objet_resultat).objet)).
4743: type, "RAW");
4744: break;
4745:
4746: case 'M' :
4747: type = SOCK_RDM;
4748: strcpy((*((struct_socket *) (*s_objet_resultat).objet)).
4749: type, "ROBUST DATAGRAM");
4750: break;
1.10 bertrand 4751:
4752: default :
4753: BUG(1, printf("type_socket=%c\n", type_socket));
4754: break;
1.1 bertrand 4755: }
4756:
4757: if ((protection != 'N') && ((type_socket != 'S') &&
4758: (type_socket != 'Q')))
4759: {
4760: liberation(s_etat_processus, s_objet_argument);
4761: liberation(s_etat_processus, s_objet_resultat);
4762:
4763: (*s_etat_processus).erreur_execution =
4764: d_ex_erreur_parametre_fichier;
4765: return;
4766: }
4767:
4768: if (nom == NULL)
4769: {
4770: if (((*((struct_socket *) (*s_objet_resultat).objet)).adresse =
4771: malloc(sizeof(unsigned char))) == NULL)
4772: {
4773: (*s_etat_processus).erreur_systeme =
4774: d_es_allocation_memoire;
4775: return;
4776: }
4777:
4778: strcpy((*((struct_socket *) (*s_objet_resultat).objet)).adresse,
4779: "");
4780: }
4781: else
4782: {
4783: if (((*((struct_socket *) (*s_objet_resultat).objet)).adresse =
1.6 bertrand 4784: transliteration(s_etat_processus, nom,
4785: d_locale, "UTF-8")) == NULL)
1.1 bertrand 4786: {
1.6 bertrand 4787: liberation(s_etat_processus, s_objet_argument);
4788: liberation(s_etat_processus, s_objet_resultat);
1.1 bertrand 4789: return;
4790: }
4791: }
4792:
4793: if (((*((struct_socket *) (*s_objet_resultat).objet))
4794: .adresse_distante = malloc(sizeof(unsigned char))) == NULL)
4795: {
4796: (*s_etat_processus).erreur_systeme =
4797: d_es_allocation_memoire;
4798: return;
4799: }
4800:
4801: strcpy((*((struct_socket *) (*s_objet_resultat).objet))
4802: .adresse_distante, "");
4803:
4804: (*((struct_socket *) (*s_objet_resultat).objet)).localisation =
4805: type_domaine;
4806: (*((struct_socket *) (*s_objet_resultat).objet)).binaire =
4807: format;
4808: (*((struct_socket *) (*s_objet_resultat).objet)).pid =
4809: getpid();
4810: (*((struct_socket *) (*s_objet_resultat).objet)).tid =
4811: pthread_self();
4812: (*((struct_socket *) (*s_objet_resultat).objet)).socket_en_ecoute
4813: = 'Y';
4814: (*((struct_socket *) (*s_objet_resultat).objet)).socket_connectee
4815: = d_faux;
4816:
4817: if (type_domaine == 'L')
4818: { // Socket serveur
4819: if (nom != NULL)
4820: {
4821: /*
4822: * La socket locale est dans l'espace des noms.
4823: */
4824:
4825: if (((*((struct_socket *) (*s_objet_resultat).objet))
4826: .socket = socket(PF_UNIX, type,
4827: protocole_numerique)) == -1)
4828: {
4829: liberation(s_etat_processus, s_objet_argument);
4830: liberation(s_etat_processus, s_objet_resultat);
4831:
4832: (*s_etat_processus).erreur_execution =
4833: d_ex_erreur_acces_fichier;
4834: return;
4835: }
4836:
4837: (*((struct_socket *) (*s_objet_resultat).objet)).domaine
4838: = PF_UNIX;
4839: (*((struct_socket *) (*s_objet_resultat).objet)).effacement
4840: = 'Y';
4841:
4842: socket_unix.sun_family = AF_UNIX;
4843:
4844: pointeur = (*((struct_socket *)
4845: (*s_objet_resultat).objet)).adresse;
4846:
4847: while((*pointeur) == d_code_espace)
4848: {
4849: pointeur++;
4850: }
4851:
1.21 bertrand 4852: strncpy(socket_unix.sun_path, pointeur, UNIX_PATH_MAX);
4853: socket_unix.sun_path[UNIX_PATH_MAX - 1] = d_code_fin_chaine;
1.1 bertrand 4854:
4855: if (options_socket() == d_erreur)
4856: {
4857: liberation(s_etat_processus, s_objet_argument);
4858: liberation(s_etat_processus, s_objet_resultat);
4859:
4860: return;
4861: }
4862:
4863: if (bind((*((struct_socket *) (*s_objet_resultat).objet))
4864: .socket, (const struct sockaddr *) &socket_unix,
4865: sizeof(socket_unix)) != 0)
4866: {
4867: liberation(s_etat_processus, s_objet_argument);
4868: liberation(s_etat_processus, s_objet_resultat);
4869:
4870: (*s_etat_processus).erreur_execution =
4871: d_ex_erreur_acces_fichier;
4872: return;
4873: }
4874: }
4875: else
4876: {
4877: /*
4878: * La socket est une socket réseau locale. L'adresse
4879: * passée en argument est l'adresse sur laquelle
4880: * cette socket est à l'écoute.
4881: */
4882:
4883: (*((struct_socket *) (*s_objet_resultat).objet)).effacement
4884: = 'N';
4885:
4886: if (hote != NULL)
4887: { // Hôte défini par un nom
4888: resolution = NULL;
4889:
4890: if (getaddrinfo(hote, NULL, NULL, &resolution) != 0)
4891: {
4892: liberation(s_etat_processus, s_objet_argument);
4893: liberation(s_etat_processus, s_objet_resultat);
4894:
4895: if (resolution != NULL)
4896: {
4897: freeaddrinfo(resolution);
4898: }
4899:
4900: (*s_etat_processus).erreur_execution =
4901: d_ex_erreur_acces_fichier;
4902: return;
4903: }
4904:
4905: if (strcmp(protocole, "IPV4") == 0)
4906: { // Accès en IPv4
4907: resolution_courante = resolution;
4908:
4909: while(resolution_courante != NULL)
4910: {
4911: if ((*resolution_courante).ai_family ==
4912: AF_INET)
4913: {
4914: break;
4915: }
4916:
4917: resolution_courante = (*resolution_courante)
4918: .ai_next;
4919: }
4920:
4921: if (resolution_courante == NULL)
4922: {
4923: liberation(s_etat_processus, s_objet_argument);
4924: liberation(s_etat_processus, s_objet_resultat);
4925:
4926: freeaddrinfo(resolution);
4927:
4928: (*s_etat_processus).erreur_execution =
4929: d_ex_erreur_acces_fichier;
4930: return;
4931: }
4932:
4933: if (((*((struct_socket *)
4934: (*s_objet_resultat).objet))
4935: .socket = socket(PF_INET, type,
4936: protocole_numerique)) == -1)
4937: {
4938: liberation(s_etat_processus, s_objet_argument);
4939: liberation(s_etat_processus, s_objet_resultat);
4940:
4941: freeaddrinfo(resolution);
4942:
4943: (*s_etat_processus).erreur_execution =
4944: d_ex_erreur_acces_fichier;
4945: return;
4946: }
4947:
4948: (*((struct_socket *) (*s_objet_resultat).objet))
4949: .domaine = PF_INET;
4950:
4951: memset(&socket_ipv4, 0, sizeof(socket_ipv4));
4952: socket_ipv4.sin_family = AF_INET;
4953: socket_ipv4.sin_port = htons((uint16_t) port);
4954: socket_ipv4.sin_addr.s_addr =
4955: (*((struct sockaddr_in *)
4956: (*resolution_courante).ai_addr))
4957: .sin_addr.s_addr;
4958:
4959: if (options_socket() == d_erreur)
4960: {
4961: liberation(s_etat_processus, s_objet_argument);
4962: liberation(s_etat_processus, s_objet_resultat);
4963:
4964: freeaddrinfo(resolution);
4965: return;
4966: }
4967:
4968: if (bind((*((struct_socket *) (*s_objet_resultat)
4969: .objet)).socket, (const struct sockaddr *)
4970: &socket_ipv4, sizeof(socket_ipv4)) != 0)
4971: {
4972: liberation(s_etat_processus, s_objet_argument);
4973: liberation(s_etat_processus, s_objet_resultat);
4974:
4975: freeaddrinfo(resolution);
4976:
4977: (*s_etat_processus).erreur_execution =
4978: d_ex_erreur_acces_fichier;
4979: return;
4980: }
4981:
1.51 bertrand 4982: free((*((struct_socket *) (*s_objet_resultat)
4983: .objet)).adresse);
4984:
1.1 bertrand 4985: if (((*((struct_socket *) (*s_objet_resultat)
4986: .objet)).adresse = malloc(22 *
4987: sizeof(unsigned char))) == NULL)
4988: {
4989: (*s_etat_processus).erreur_systeme =
4990: d_es_allocation_memoire;
4991: return;
4992: }
4993:
4994: sprintf((*((struct_socket *) (*s_objet_resultat)
4995: .objet)).adresse, "%d.%d.%d.%d",
4996: (ntohl((*((struct sockaddr_in *)
4997: (*resolution_courante).ai_addr)).sin_addr
4998: .s_addr) >> 24) & 0xFF,
4999: (ntohl((*((struct sockaddr_in *)
5000: (*resolution_courante).ai_addr)).sin_addr
5001: .s_addr) >> 16) & 0xFF,
5002: (ntohl((*((struct sockaddr_in *)
5003: (*resolution_courante).ai_addr)).sin_addr
5004: .s_addr) >> 8) & 0xFF,
5005: ntohl((*((struct sockaddr_in *)
5006: (*resolution_courante).ai_addr)).sin_addr
5007: .s_addr) & 0xFF);
5008: }
5009: else
5010: { // Accès en IPv6
1.17 bertrand 5011: # ifdef IPV6
1.1 bertrand 5012: resolution_courante = resolution;
5013:
5014: while(resolution_courante != NULL)
5015: {
5016: if ((*resolution_courante).ai_family ==
5017: AF_INET6)
5018: {
5019: break;
5020: }
5021:
5022: resolution_courante = (*resolution_courante)
5023: .ai_next;
5024: }
5025:
5026: if (resolution_courante == NULL)
5027: {
5028: liberation(s_etat_processus, s_objet_argument);
5029: liberation(s_etat_processus, s_objet_resultat);
5030:
5031: freeaddrinfo(resolution);
5032:
5033: (*s_etat_processus).erreur_execution =
5034: d_ex_erreur_acces_fichier;
5035: return;
5036: }
5037:
5038: if (((*((struct_socket *)
5039: (*s_objet_resultat).objet))
5040: .socket = socket(PF_INET6, type,
5041: protocole_numerique)) == -1)
5042: {
5043: liberation(s_etat_processus, s_objet_argument);
5044: liberation(s_etat_processus, s_objet_resultat);
5045:
5046: freeaddrinfo(resolution);
5047:
5048: (*s_etat_processus).erreur_execution =
5049: d_ex_erreur_acces_fichier;
5050: return;
5051: }
5052:
5053: (*((struct_socket *) (*s_objet_resultat).objet))
5054: .domaine = PF_INET6;
5055:
5056: memset(&socket_ipv6, 0, sizeof(socket_ipv6));
5057: socket_ipv6.sin6_family = AF_INET6;
5058: socket_ipv6.sin6_port = htons((uint16_t) port);
5059:
5060: for(i = 0; i < 16;
5061: socket_ipv6.sin6_addr.s6_addr[i] =
5062: (*((struct sockaddr_in6 *)
5063: (*resolution_courante).ai_addr))
5064: .sin6_addr.s6_addr[i], i++);
5065:
5066: if (options_socket() == d_erreur)
5067: {
5068: liberation(s_etat_processus, s_objet_argument);
5069: liberation(s_etat_processus, s_objet_resultat);
5070:
5071: freeaddrinfo(resolution);
5072: return;
5073: }
5074:
5075: if (bind((*((struct_socket *) (*s_objet_resultat)
5076: .objet)).socket, (const struct sockaddr *)
5077: &socket_ipv6, sizeof(socket_ipv6)) != 0)
5078: {
5079: liberation(s_etat_processus, s_objet_argument);
5080: liberation(s_etat_processus, s_objet_resultat);
5081:
5082: freeaddrinfo(resolution);
5083:
5084: (*s_etat_processus).erreur_execution =
5085: d_ex_erreur_acces_fichier;
5086: return;
5087: }
5088:
1.51 bertrand 5089: free((*((struct_socket *) (*s_objet_resultat)
5090: .objet)).adresse);
5091:
1.1 bertrand 5092: if (((*((struct_socket *) (*s_objet_resultat)
5093: .objet)).adresse = malloc(55 *
5094: sizeof(unsigned char))) == NULL)
5095: {
5096: (*s_etat_processus).erreur_systeme =
5097: d_es_allocation_memoire;
5098: return;
5099: }
5100:
5101: for(i = 0; i < 16; i++)
5102: {
5103: sprintf((*((struct_socket *) (*s_objet_resultat)
5104: .objet)).adresse,
5105: (i == 0) ? "%s%X" : "%s:%X",
5106: (*((struct_socket *) (*s_objet_resultat)
5107: .objet)).adresse,
5108: (*((struct sockaddr_in6 *)
5109: (*resolution_courante).ai_addr))
5110: .sin6_addr.s6_addr[i]);
5111: }
1.17 bertrand 5112: # else
1.19 bertrand 5113: if ((*s_etat_processus).langue == 'F')
5114: {
5115: printf("+++Attention : Support du protocole"
1.20 bertrand 5116: " IPv6 indisponible\n");
1.19 bertrand 5117: }
5118: else
5119: {
1.22 bertrand 5120: printf("+++Warning : IPv6 support "
1.19 bertrand 5121: "unavailable\n");
5122: }
1.51 bertrand 5123:
5124: liberation(s_etat_processus, s_objet_argument);
5125: liberation(s_etat_processus, s_objet_resultat);
5126:
5127: freeaddrinfo(resolution);
5128:
5129: (*s_etat_processus).erreur_execution =
5130: d_ex_instruction_indisponible;
5131: return;
1.17 bertrand 5132: # endif
1.1 bertrand 5133: }
5134:
5135: freeaddrinfo(resolution);
5136:
5137: sprintf((*((struct_socket *) (*s_objet_resultat)
5138: .objet)).adresse, "%s(%u)",
5139: (*((struct_socket *) (*s_objet_resultat)
5140: .objet)).adresse, (unsigned int) port);
5141: }
5142: else
5143: { // Hôte défini par une adresse
5144: if (strcmp(protocole, "IPV4") == 0)
5145: { // Accès en IPv4
1.51 bertrand 5146: free((*((struct_socket *) (*s_objet_resultat)
5147: .objet)).adresse);
5148:
1.1 bertrand 5149: if (((*((struct_socket *) (*s_objet_resultat)
5150: .objet)).adresse = malloc(22 *
5151: sizeof(unsigned char))) == NULL)
5152: {
5153: (*s_etat_processus).erreur_systeme =
5154: d_es_allocation_memoire;
5155: return;
5156: }
5157:
5158: (*((struct_socket *) (*s_objet_resultat).objet))
5159: .adresse[0] = d_code_fin_chaine;
5160:
5161: for(i = 0; i < 4; i++)
5162: {
5163: sprintf((*((struct_socket *) (*s_objet_resultat)
5164: .objet)).adresse,
5165: (i == 0) ? "%s%d" : "%s.%d",
5166: (*((struct_socket *) (*s_objet_resultat)
5167: .objet)).adresse, (int) adresse[i]);
5168: }
5169:
5170: sprintf((*((struct_socket *) (*s_objet_resultat)
5171: .objet)).adresse, "%s(%u)",
5172: (*((struct_socket *) (*s_objet_resultat)
5173: .objet)).adresse, (unsigned int) port);
5174:
5175: if (((*((struct_socket *)
5176: (*s_objet_resultat).objet))
5177: .socket = socket(PF_INET, type,
5178: protocole_numerique)) == -1)
5179: {
5180: liberation(s_etat_processus, s_objet_argument);
5181: liberation(s_etat_processus, s_objet_resultat);
5182:
5183: (*s_etat_processus).erreur_execution =
5184: d_ex_erreur_acces_fichier;
5185: return;
5186: }
5187:
5188: (*((struct_socket *) (*s_objet_resultat).objet))
5189: .domaine = PF_INET;
5190:
5191: memset(&socket_ipv4, 0, sizeof(socket_ipv4));
5192: socket_ipv4.sin_family = AF_INET;
5193: socket_ipv4.sin_port = htons((uint16_t) port);
5194:
5195: adresse_ipv4 = 0;
5196: for(i = 0; i < 4; adresse_ipv4 =
5197: (256 * adresse_ipv4) + adresse[i++]);
5198:
5199: socket_ipv4.sin_addr.s_addr = htonl(adresse_ipv4);
5200:
5201: if (options_socket() == d_erreur)
5202: {
5203: liberation(s_etat_processus, s_objet_argument);
5204: liberation(s_etat_processus, s_objet_resultat);
5205:
5206: return;
5207: }
5208:
5209: if (bind((*((struct_socket *) (*s_objet_resultat)
5210: .objet)).socket, (const struct sockaddr *)
5211: &socket_ipv4, sizeof(socket_ipv4)) != 0)
5212: {
5213: liberation(s_etat_processus, s_objet_argument);
5214: liberation(s_etat_processus, s_objet_resultat);
5215:
5216: (*s_etat_processus).erreur_execution =
5217: d_ex_erreur_acces_fichier;
5218: return;
5219: }
5220: }
5221: else
5222: { // Accès en IPv6
1.17 bertrand 5223: # ifdef IPV6
1.51 bertrand 5224: free((*((struct_socket *) (*s_objet_resultat)
5225: .objet)).adresse);
5226:
1.1 bertrand 5227: if (((*((struct_socket *) (*s_objet_resultat)
5228: .objet)).adresse = malloc(55 *
5229: sizeof(unsigned char))) == NULL)
5230: {
5231: (*s_etat_processus).erreur_systeme =
5232: d_es_allocation_memoire;
5233: return;
5234: }
5235:
5236: (*((struct_socket *) (*s_objet_resultat).objet))
5237: .adresse[0] = d_code_fin_chaine;
5238:
5239: for(i = 0; i < 16; i++)
5240: {
5241: sprintf((*((struct_socket *) (*s_objet_resultat)
5242: .objet)).adresse,
5243: (i == 0) ? "%s%X" : "%s:%X",
5244: (*((struct_socket *) (*s_objet_resultat)
5245: .objet)).adresse, (unsigned int)
5246: adresse[i]);
5247: }
5248:
5249: sprintf((*((struct_socket *) (*s_objet_resultat)
5250: .objet)).adresse, "%s(%u)",
5251: (*((struct_socket *) (*s_objet_resultat)
5252: .objet)).adresse, (unsigned int) port);
5253:
5254: if (((*((struct_socket *)
5255: (*s_objet_resultat).objet))
5256: .socket = socket(PF_INET6, type,
5257: protocole_numerique)) == -1)
5258: {
5259: liberation(s_etat_processus, s_objet_argument);
5260: liberation(s_etat_processus, s_objet_resultat);
5261:
5262: (*s_etat_processus).erreur_execution =
5263: d_ex_erreur_acces_fichier;
5264: return;
5265: }
5266:
5267: (*((struct_socket *) (*s_objet_resultat).objet))
5268: .domaine = PF_INET6;
5269:
5270: memset(&socket_ipv6, 0, sizeof(socket_ipv6));
5271: socket_ipv6.sin6_family = AF_INET6;
5272: socket_ipv6.sin6_port = htons((uint16_t) port);
5273:
5274: for(i = 0; i < 16;
5275: socket_ipv6.sin6_addr.s6_addr[i] =
5276: (unsigned char) (adresse[i]), i++);
5277:
5278: if (options_socket() == d_erreur)
5279: {
5280: liberation(s_etat_processus, s_objet_argument);
5281: liberation(s_etat_processus, s_objet_resultat);
5282:
5283: return;
5284: }
5285:
5286: if (bind((*((struct_socket *) (*s_objet_resultat)
5287: .objet)).socket, (const struct sockaddr *)
5288: &socket_ipv6, sizeof(socket_ipv6)) != 0)
5289: {
5290: liberation(s_etat_processus, s_objet_argument);
5291: liberation(s_etat_processus, s_objet_resultat);
5292:
5293: (*s_etat_processus).erreur_execution =
5294: d_ex_erreur_acces_fichier;
5295: return;
5296: }
1.17 bertrand 5297: # else
1.19 bertrand 5298: if ((*s_etat_processus).langue == 'F')
5299: {
5300: printf("+++Attention : Support du protocole"
1.20 bertrand 5301: " IPv6 indisponible\n");
1.19 bertrand 5302: }
5303: else
5304: {
1.22 bertrand 5305: printf("+++Warning : IPv6 support "
1.19 bertrand 5306: "unavailable\n");
5307: }
1.51 bertrand 5308:
5309: liberation(s_etat_processus, s_objet_argument);
5310: liberation(s_etat_processus, s_objet_resultat);
5311:
5312: (*s_etat_processus).erreur_execution =
5313: d_ex_instruction_indisponible;
5314: return;
1.17 bertrand 5315: # endif
1.1 bertrand 5316: }
5317: }
5318:
5319: (*((struct_socket *) (*s_objet_resultat).objet)).effacement
5320: = 'N';
5321: }
5322:
5323: if ((type_socket == 'S') || (type_socket == 'Q'))
5324: {
5325: if (listen((*((struct_socket *) (*s_objet_resultat).objet))
5326: .socket, (int) nombre_maximal_connexions) != 0)
5327: {
5328: liberation(s_etat_processus, s_objet_argument);
5329: liberation(s_etat_processus, s_objet_resultat);
5330:
5331: (*s_etat_processus).erreur_execution =
5332: d_ex_erreur_acces_fichier;
5333: return;
5334: }
5335:
5336: (*((struct_socket *) (*s_objet_resultat).objet))
5337: .socket_connectee = d_vrai;
5338:
5339: if (protection == 'R')
5340: { // WRITEONLY
5341: if (shutdown((*((struct_socket *) (*s_objet_resultat)
5342: .objet)).socket, SHUT_RD) != 0)
5343: {
5344: liberation(s_etat_processus, s_objet_argument);
5345: liberation(s_etat_processus, s_objet_resultat);
5346:
5347: (*s_etat_processus).erreur_execution =
5348: d_ex_erreur_acces_fichier;
5349: return;
5350: }
5351: }
5352: else if (protection == 'W')
5353: { // READONLY
5354: if (shutdown((*((struct_socket *) (*s_objet_resultat)
5355: .objet)).socket, SHUT_WR) != 0)
5356: {
5357: liberation(s_etat_processus, s_objet_argument);
5358: liberation(s_etat_processus, s_objet_resultat);
5359:
5360: (*s_etat_processus).erreur_execution =
5361: d_ex_erreur_acces_fichier;
5362: return;
5363: }
5364: }
5365: else
5366: { // READWRITE
5367: }
5368: }
5369: }
5370: else
5371: { // Socket cliente
5372: (*((struct_socket *) (*s_objet_resultat).objet)).effacement
5373: = 'N';
5374:
5375: /*
5376: * Dans le cas où la socket n'est pas connectée, on
5377: * ne peut utiliser ni "NAME", ni "HOST", ni "PORT",
5378: * et encore moins spécifier une adresse. En effet, la cible
5379: * est défini par la commande TARGET.
5380: */
5381:
5382: if ((type_socket != 'S') && (type_socket != 'Q'))
5383: {
5384: if ((presence_port == d_vrai) || (hote != NULL) ||
5385: (nom != NULL) || (type_adresse != ' '))
5386: {
5387: liberation(s_etat_processus, s_objet_argument);
5388: liberation(s_etat_processus, s_objet_resultat);
5389:
5390: (*s_etat_processus).erreur_execution =
5391: d_ex_erreur_parametre_fichier;
5392: return;
5393: }
5394: }
5395:
5396: if (nom != NULL)
5397: {
5398: /*
5399: * La socket est dans l'espace des noms.
5400: */
5401:
5402: if (((*((struct_socket *) (*s_objet_resultat).objet))
5403: .socket = socket(PF_UNIX, type,
5404: protocole_numerique)) == -1)
5405: {
5406: liberation(s_etat_processus, s_objet_argument);
5407: liberation(s_etat_processus, s_objet_resultat);
5408:
5409: (*s_etat_processus).erreur_execution =
5410: d_ex_erreur_acces_fichier;
5411: return;
5412: }
5413:
5414: (*((struct_socket *) (*s_objet_resultat).objet))
5415: .domaine = PF_UNIX;
5416:
5417: socket_unix.sun_family = AF_UNIX;
5418: strncpy(socket_unix.sun_path, (*((struct_socket *)
1.21 bertrand 5419: (*s_objet_resultat).objet)).adresse, UNIX_PATH_MAX);
5420: socket_unix.sun_path[UNIX_PATH_MAX - 1] = d_code_fin_chaine;
1.1 bertrand 5421:
5422: if ((type_socket == 'S') || (type_socket == 'Q'))
5423: {
5424: if (connect((*((struct_socket *) (*s_objet_resultat)
5425: .objet)).socket, (const struct sockaddr *)
5426: &socket_unix, sizeof(socket_unix)) != 0)
5427: {
5428: liberation(s_etat_processus, s_objet_argument);
5429: liberation(s_etat_processus, s_objet_resultat);
5430:
5431: (*s_etat_processus).erreur_execution =
5432: d_ex_erreur_acces_fichier;
5433: return;
5434: }
5435:
5436: (*((struct_socket *) (*s_objet_resultat).objet))
5437: .socket_connectee = d_vrai;
5438: (*((struct_socket *) (*s_objet_resultat).objet))
5439: .socket_en_ecoute = 'N';
5440: }
5441: }
5442: else
5443: {
5444: /*
5445: * La socket est une socket réseau. L'adresse
5446: * passée en argument est l'adresse sur laquelle
5447: * cette socket est à l'écoute.
5448: */
5449:
5450: if (hote != NULL)
5451: { // Hôte défini par un nom
5452: resolution = NULL;
5453:
5454: if (getaddrinfo(hote, NULL, NULL, &resolution) != 0)
5455: {
5456: liberation(s_etat_processus, s_objet_argument);
5457: liberation(s_etat_processus, s_objet_resultat);
5458:
5459: if (resolution != NULL)
5460: {
5461: freeaddrinfo(resolution);
5462: }
5463:
5464: (*s_etat_processus).erreur_execution =
5465: d_ex_erreur_acces_fichier;
5466: return;
5467: }
5468:
5469: if (strcmp(protocole, "IPV4") == 0)
5470: { // Accès en IPv4
5471: resolution_courante = resolution;
5472:
5473: while(resolution_courante != NULL)
5474: {
5475: if ((*resolution_courante).ai_family ==
5476: AF_INET)
5477: {
5478: break;
5479: }
5480:
5481: resolution_courante = (*resolution_courante)
5482: .ai_next;
5483: }
5484:
5485: if (resolution_courante == NULL)
5486: {
5487: liberation(s_etat_processus, s_objet_argument);
5488: liberation(s_etat_processus, s_objet_resultat);
5489:
5490: freeaddrinfo(resolution);
5491:
5492: (*s_etat_processus).erreur_execution =
5493: d_ex_erreur_acces_fichier;
5494: return;
5495: }
5496:
5497: if (((*((struct_socket *)
5498: (*s_objet_resultat).objet))
5499: .socket = socket(PF_INET, type,
5500: protocole_numerique)) == -1)
5501: {
5502: liberation(s_etat_processus, s_objet_argument);
5503: liberation(s_etat_processus, s_objet_resultat);
5504:
5505: freeaddrinfo(resolution);
5506:
5507: (*s_etat_processus).erreur_execution =
5508: d_ex_erreur_acces_fichier;
5509: return;
5510: }
5511:
5512: (*((struct_socket *) (*s_objet_resultat).objet))
5513: .domaine = PF_INET;
5514:
5515: memset(&socket_ipv4, 0, sizeof(socket_ipv4));
5516: socket_ipv4.sin_family = AF_INET;
5517: socket_ipv4.sin_port = htons((uint16_t) port);
5518: socket_ipv4.sin_addr.s_addr =
5519: (*((struct sockaddr_in *)
5520: (*resolution_courante).ai_addr))
5521: .sin_addr.s_addr;
5522:
5523: if ((type_socket == 'S') || (type_socket == 'Q'))
5524: {
5525: if (connect((*((struct_socket *)
5526: (*s_objet_resultat).objet)).socket,
5527: (const struct sockaddr *)
5528: &socket_ipv4, sizeof(socket_ipv4)) != 0)
5529: {
5530: liberation(s_etat_processus,
5531: s_objet_argument);
5532: liberation(s_etat_processus,
5533: s_objet_resultat);
5534:
5535: freeaddrinfo(resolution);
5536:
5537: (*s_etat_processus).erreur_execution =
5538: d_ex_erreur_acces_fichier;
5539: return;
5540: }
5541:
5542: (*((struct_socket *) (*s_objet_resultat).objet))
5543: .socket_connectee = d_vrai;
5544: (*((struct_socket *) (*s_objet_resultat).objet))
5545: .socket_en_ecoute = 'N';
5546: }
5547:
1.51 bertrand 5548: free((*((struct_socket *) (*s_objet_resultat)
5549: .objet)).adresse);
5550:
1.1 bertrand 5551: if (((*((struct_socket *) (*s_objet_resultat)
5552: .objet)).adresse = malloc(22 *
5553: sizeof(unsigned char))) == NULL)
5554: {
5555: (*s_etat_processus).erreur_systeme =
5556: d_es_allocation_memoire;
5557: return;
5558: }
5559:
5560: sprintf((*((struct_socket *) (*s_objet_resultat)
5561: .objet)).adresse, "%d.%d.%d.%d",
5562: (ntohl((*((struct sockaddr_in *)
5563: (*resolution_courante).ai_addr)).sin_addr
5564: .s_addr) >> 24) & 0xFF,
5565: (ntohl((*((struct sockaddr_in *)
5566: (*resolution_courante).ai_addr)).sin_addr
5567: .s_addr) >> 16) & 0xFF,
5568: (ntohl((*((struct sockaddr_in *)
5569: (*resolution_courante).ai_addr)).sin_addr
5570: .s_addr) >> 8) & 0xFF,
5571: ntohl((*((struct sockaddr_in *)
5572: (*resolution_courante).ai_addr)).sin_addr
5573: .s_addr) & 0xFF);
5574: }
5575: else
5576: { // Accès en IPv6
1.17 bertrand 5577: # ifdef IPV6
1.1 bertrand 5578: resolution_courante = resolution;
5579:
5580: while(resolution_courante != NULL)
5581: {
5582: if ((*resolution_courante).ai_family ==
5583: AF_INET6)
5584: {
5585: break;
5586: }
5587:
5588: resolution_courante = (*resolution_courante)
5589: .ai_next;
5590: }
5591:
5592: if (resolution_courante == NULL)
5593: {
5594: liberation(s_etat_processus, s_objet_argument);
5595: liberation(s_etat_processus, s_objet_resultat);
5596:
5597: freeaddrinfo(resolution);
5598:
5599: (*s_etat_processus).erreur_execution =
5600: d_ex_erreur_acces_fichier;
5601: return;
5602: }
5603:
5604: if (((*((struct_socket *)
5605: (*s_objet_resultat).objet))
5606: .socket = socket(PF_INET6, type,
5607: protocole_numerique)) == -1)
5608: {
5609: liberation(s_etat_processus, s_objet_argument);
5610: liberation(s_etat_processus, s_objet_resultat);
5611:
5612: freeaddrinfo(resolution);
5613:
5614: (*s_etat_processus).erreur_execution =
5615: d_ex_erreur_acces_fichier;
5616: return;
5617: }
5618:
5619: (*((struct_socket *) (*s_objet_resultat).objet))
5620: .domaine = PF_INET6;
5621:
5622: memset(&socket_ipv6, 0, sizeof(socket_ipv6));
5623: socket_ipv6.sin6_family = AF_INET6;
5624: socket_ipv6.sin6_port = htons((uint16_t) port);
5625:
5626: for(i = 0; i < 16;
5627: socket_ipv6.sin6_addr.s6_addr[i] =
5628: (*((struct sockaddr_in6 *)
5629: (*resolution_courante).ai_addr))
5630: .sin6_addr.s6_addr[i], i++);
5631:
5632: if ((type_socket == 'S') || (type_socket == 'Q'))
5633: {
5634: if (connect((*((struct_socket *)
5635: (*s_objet_resultat).objet)).socket,
5636: (const struct sockaddr *)
5637: &socket_ipv6, sizeof(socket_ipv6)) != 0)
5638: {
5639: liberation(s_etat_processus,
5640: s_objet_argument);
5641: liberation(s_etat_processus,
5642: s_objet_resultat);
5643:
5644: freeaddrinfo(resolution);
5645:
5646: (*s_etat_processus).erreur_execution =
5647: d_ex_erreur_acces_fichier;
5648: return;
5649: }
5650:
5651: (*((struct_socket *) (*s_objet_resultat).objet))
5652: .socket_connectee = d_vrai;
5653: (*((struct_socket *) (*s_objet_resultat).objet))
5654: .socket_en_ecoute = 'N';
5655: }
5656:
1.51 bertrand 5657: free((*((struct_socket *) (*s_objet_resultat)
5658: .objet)).adresse);
5659:
1.1 bertrand 5660: if (((*((struct_socket *) (*s_objet_resultat)
5661: .objet)).adresse = malloc(55 *
5662: sizeof(unsigned char))) == NULL)
5663: {
5664: (*s_etat_processus).erreur_systeme =
5665: d_es_allocation_memoire;
5666: return;
5667: }
5668:
5669: for(i = 0; i < 16; i++)
5670: {
5671: sprintf((*((struct_socket *) (*s_objet_resultat)
5672: .objet)).adresse,
5673: (i == 0) ? "%s%X" : "%s:%X",
5674: (*((struct_socket *) (*s_objet_resultat)
5675: .objet)).adresse,
5676: (*((struct sockaddr_in6 *)
5677: (*resolution_courante).ai_addr))
5678: .sin6_addr.s6_addr[i]);
5679: }
1.17 bertrand 5680: # else
1.19 bertrand 5681: if ((*s_etat_processus).langue == 'F')
5682: {
5683: printf("+++Attention : Support du protocole"
1.20 bertrand 5684: " IPv6 indisponible\n");
1.19 bertrand 5685: }
5686: else
5687: {
1.22 bertrand 5688: printf("+++Warning : IPv6 support "
1.19 bertrand 5689: "unavailable\n");
5690: }
1.51 bertrand 5691:
5692: liberation(s_etat_processus, s_objet_argument);
5693: liberation(s_etat_processus, s_objet_resultat);
5694:
5695: freeaddrinfo(resolution);
5696:
5697: (*s_etat_processus).erreur_execution =
5698: d_ex_instruction_indisponible;
5699: return;
1.17 bertrand 5700: # endif
1.1 bertrand 5701: }
5702:
5703: freeaddrinfo(resolution);
5704:
5705: sprintf((*((struct_socket *) (*s_objet_resultat)
5706: .objet)).adresse, "%s(%u)",
5707: (*((struct_socket *) (*s_objet_resultat)
5708: .objet)).adresse, (unsigned int) port);
5709: }
5710: else
5711: { // Hôte défini par une adresse
5712: if (strcmp(protocole, "IPV4") == 0)
5713: { // Accès en IPv4
5714: if (type_adresse == '4')
5715: {
1.51 bertrand 5716: free((*((struct_socket *) (*s_objet_resultat)
5717: .objet)).adresse);
5718:
1.1 bertrand 5719: if (((*((struct_socket *) (*s_objet_resultat)
5720: .objet)).adresse = malloc(22 *
5721: sizeof(unsigned char))) == NULL)
5722: {
5723: (*s_etat_processus).erreur_systeme =
5724: d_es_allocation_memoire;
5725: return;
5726: }
5727:
5728: (*((struct_socket *) (*s_objet_resultat).objet))
5729: .adresse[0] = d_code_fin_chaine;
5730:
5731: for(i = 0; i < 4; i++)
5732: {
5733: sprintf((*((struct_socket *)
5734: (*s_objet_resultat).objet)).adresse,
5735: (i == 0) ? "%s%d" : "%s.%d",
5736: (*((struct_socket *)
5737: (*s_objet_resultat)
5738: .objet)).adresse, (int) adresse[i]);
5739: }
5740:
5741: sprintf((*((struct_socket *) (*s_objet_resultat)
5742: .objet)).adresse, "%s(%u)",
5743: (*((struct_socket *) (*s_objet_resultat)
5744: .objet)).adresse, (unsigned int) port);
5745: }
5746: else
5747: {
1.51 bertrand 5748: free((*((struct_socket *) (*s_objet_resultat)
5749: .objet)).adresse);
5750:
1.1 bertrand 5751: if (((*((struct_socket *) (*s_objet_resultat)
5752: .objet)).adresse = malloc(
5753: sizeof(unsigned char))) == NULL)
5754: {
5755: (*s_etat_processus).erreur_systeme =
5756: d_es_allocation_memoire;
5757: return;
5758: }
5759:
5760: (*((struct_socket *) (*s_objet_resultat).objet))
5761: .adresse[0] = d_code_fin_chaine;
5762: }
5763:
5764: if (((*((struct_socket *)
5765: (*s_objet_resultat).objet))
5766: .socket = socket(PF_INET, type,
5767: protocole_numerique)) == -1)
5768: {
5769: liberation(s_etat_processus, s_objet_argument);
5770: liberation(s_etat_processus, s_objet_resultat);
5771:
5772: (*s_etat_processus).erreur_execution =
5773: d_ex_erreur_acces_fichier;
5774: return;
5775: }
5776:
5777: (*((struct_socket *) (*s_objet_resultat).objet))
5778: .domaine = PF_INET;
5779:
5780: memset(&socket_ipv4, 0, sizeof(socket_ipv4));
5781: socket_ipv4.sin_family = AF_INET;
5782: socket_ipv4.sin_port = htons((uint16_t) port);
5783:
5784: adresse_ipv4 = 0;
5785: for(i = 0; i < 4; adresse_ipv4 =
5786: (256 * adresse_ipv4) + adresse[i++]);
5787:
5788: socket_ipv4.sin_addr.s_addr = htonl(adresse_ipv4);
5789:
5790: if ((type_socket == 'S') || (type_socket == 'Q'))
5791: {
5792: if (connect((*((struct_socket *)
5793: (*s_objet_resultat).objet)).socket,
5794: (const struct sockaddr *)
5795: &socket_ipv4, sizeof(socket_ipv4)) != 0)
5796: {
5797: liberation(s_etat_processus,
5798: s_objet_argument);
5799: liberation(s_etat_processus,
5800: s_objet_resultat);
5801:
5802: (*s_etat_processus).erreur_execution =
5803: d_ex_erreur_acces_fichier;
5804: return;
5805: }
5806:
5807: (*((struct_socket *) (*s_objet_resultat).objet))
5808: .socket_connectee = d_vrai;
5809: (*((struct_socket *) (*s_objet_resultat).objet))
5810: .socket_en_ecoute = 'N';
5811: }
5812: }
5813: else if (strcmp(protocole, "IPV6") == 0)
5814: { // Accès en IPv6
1.17 bertrand 5815: # ifdef IPV6
1.1 bertrand 5816: if (type_adresse == '6')
5817: {
1.51 bertrand 5818: free((*((struct_socket *) (*s_objet_resultat)
5819: .objet)).adresse);
5820:
1.1 bertrand 5821: if (((*((struct_socket *) (*s_objet_resultat)
5822: .objet)).adresse = malloc(55 *
5823: sizeof(unsigned char))) == NULL)
5824: {
5825: (*s_etat_processus).erreur_systeme =
5826: d_es_allocation_memoire;
5827: return;
5828: }
5829:
5830: (*((struct_socket *) (*s_objet_resultat).objet))
5831: .adresse[0] = d_code_fin_chaine;
5832:
5833: for(i = 0; i < 16; i++)
5834: {
5835: sprintf((*((struct_socket *)
5836: (*s_objet_resultat).objet)).adresse,
5837: (i == 0) ? "%s%X" : "%s:%X",
5838: (*((struct_socket *)
5839: (*s_objet_resultat)
5840: .objet)).adresse, (unsigned int)
5841: adresse[i]);
5842: }
5843:
5844: sprintf((*((struct_socket *) (*s_objet_resultat)
5845: .objet)).adresse, "%s(%u)",
5846: (*((struct_socket *) (*s_objet_resultat)
5847: .objet)).adresse, (unsigned int) port);
5848: }
5849: else
5850: {
1.51 bertrand 5851: free((*((struct_socket *) (*s_objet_resultat)
5852: .objet)).adresse);
5853:
1.1 bertrand 5854: if (((*((struct_socket *) (*s_objet_resultat)
5855: .objet)).adresse = malloc(
5856: sizeof(unsigned char))) == NULL)
5857: {
5858: (*s_etat_processus).erreur_systeme =
5859: d_es_allocation_memoire;
5860: return;
5861: }
5862:
5863: (*((struct_socket *) (*s_objet_resultat).objet))
5864: .adresse[0] = d_code_fin_chaine;
5865: }
5866:
5867: if (((*((struct_socket *)
5868: (*s_objet_resultat).objet))
5869: .socket = socket(PF_INET6, type,
5870: protocole_numerique)) == -1)
5871: {
5872: liberation(s_etat_processus, s_objet_argument);
5873: liberation(s_etat_processus, s_objet_resultat);
5874:
5875: (*s_etat_processus).erreur_execution =
5876: d_ex_erreur_acces_fichier;
5877: return;
5878: }
5879:
5880: (*((struct_socket *) (*s_objet_resultat).objet))
5881: .domaine = PF_INET6;
5882:
5883: memset(&socket_ipv6, 0, sizeof(socket_ipv6));
5884: socket_ipv6.sin6_family = AF_INET6;
5885: socket_ipv6.sin6_port = htons((uint16_t) port);
5886:
5887: for(i = 0; i < 16;
5888: socket_ipv6.sin6_addr.s6_addr[i] =
5889: (unsigned char) (adresse[i]), i++);
5890:
5891: if ((type_socket == 'S') || (type_socket == 'Q'))
5892: {
5893: if (connect((*((struct_socket *)
5894: (*s_objet_resultat).objet)).socket,
5895: (const struct sockaddr *)
5896: &socket_ipv6, sizeof(socket_ipv6)) != 0)
5897: {
5898: liberation(s_etat_processus,
5899: s_objet_argument);
5900: liberation(s_etat_processus,
5901: s_objet_resultat);
5902:
5903: (*s_etat_processus).erreur_execution =
5904: d_ex_erreur_acces_fichier;
5905: return;
5906: }
5907:
5908: (*((struct_socket *) (*s_objet_resultat).objet))
5909: .socket_connectee = d_vrai;
5910: (*((struct_socket *) (*s_objet_resultat).objet))
5911: .socket_en_ecoute = 'N';
5912: }
1.17 bertrand 5913: # else
1.19 bertrand 5914: if ((*s_etat_processus).langue == 'F')
5915: {
5916: printf("+++Attention : Support du protocole"
1.20 bertrand 5917: " IPv6 indisponible\n");
1.19 bertrand 5918: }
5919: else
5920: {
1.22 bertrand 5921: printf("+++Warning : IPv6 support "
1.19 bertrand 5922: "unavailable\n");
5923: }
1.51 bertrand 5924:
5925: liberation(s_etat_processus, s_objet_argument);
5926: liberation(s_etat_processus, s_objet_resultat);
5927:
5928: (*s_etat_processus).erreur_execution =
5929: d_ex_instruction_indisponible;
5930: return;
1.17 bertrand 5931: # endif
1.1 bertrand 5932: }
5933: else
5934: { // Socket UNIX
1.51 bertrand 5935: free((*((struct_socket *) (*s_objet_resultat)
5936: .objet)).adresse);
5937:
1.1 bertrand 5938: if (((*((struct_socket *) (*s_objet_resultat)
5939: .objet)).adresse = malloc(
5940: sizeof(unsigned char))) == NULL)
5941: {
5942: (*s_etat_processus).erreur_systeme =
5943: d_es_allocation_memoire;
5944: return;
5945: }
5946:
5947: (*((struct_socket *) (*s_objet_resultat).objet))
5948: .adresse[0] = d_code_fin_chaine;
5949:
5950: if (((*((struct_socket *)
5951: (*s_objet_resultat).objet))
5952: .socket = socket(PF_UNIX, type,
5953: protocole_numerique)) == -1)
5954: {
5955: liberation(s_etat_processus, s_objet_argument);
5956: liberation(s_etat_processus, s_objet_resultat);
5957:
5958: (*s_etat_processus).erreur_execution =
5959: d_ex_erreur_acces_fichier;
5960: return;
5961: }
5962: }
5963: }
5964:
5965: (*((struct_socket *) (*s_objet_resultat).objet)).effacement
5966: = 'N';
5967: }
5968:
5969: if ((type_socket == 'S') || (type_socket == 'Q'))
5970: {
5971: if (protection == 'R')
5972: { // WRITEONLY
5973: if (shutdown((*((struct_socket *) (*s_objet_resultat)
5974: .objet)).socket, SHUT_RD) != 0)
5975: {
5976: liberation(s_etat_processus, s_objet_argument);
5977: liberation(s_etat_processus, s_objet_resultat);
5978:
5979: (*s_etat_processus).erreur_execution =
5980: d_ex_erreur_acces_fichier;
5981: return;
5982: }
5983: }
5984: else if (protection == 'W')
5985: { // READONLY
5986: if (shutdown((*((struct_socket *) (*s_objet_resultat)
5987: .objet)).socket, SHUT_WR) != 0)
5988: {
5989: liberation(s_etat_processus, s_objet_argument);
5990: liberation(s_etat_processus, s_objet_resultat);
5991:
5992: (*s_etat_processus).erreur_execution =
5993: d_ex_erreur_acces_fichier;
5994: return;
5995: }
5996: }
5997: else
5998: { // READWRITE
5999: }
6000: }
6001: }
6002:
6003: /*
6004: * Gestion de la liste des sockets ouvertes
6005: */
6006:
6007: l_element_courant = (*s_etat_processus).s_sockets;
6008:
6009: if (l_element_courant == NULL)
6010: {
6011: if (((*s_etat_processus).s_sockets =
6012: allocation_maillon(s_etat_processus)) == NULL)
6013: {
6014: (*s_etat_processus).erreur_systeme =
6015: d_es_allocation_memoire;
6016: return;
6017: }
6018:
6019: (*(*s_etat_processus).s_sockets).suivant = NULL;
6020: l_element_courant = (*s_etat_processus).s_sockets;
6021: }
6022: else
6023: {
6024: /*
6025: * Ajout d'un élément à la fin de la liste chaînée
6026: */
6027:
6028: while((*l_element_courant).suivant != NULL)
6029: {
6030: l_element_courant = (*l_element_courant).suivant;
6031: }
6032:
6033: if (((*l_element_courant).suivant =
6034: allocation_maillon(s_etat_processus)) == NULL)
6035: {
6036: (*s_etat_processus).erreur_systeme =
6037: d_es_allocation_memoire;
6038: return;
6039: }
6040:
6041: l_element_courant = (*l_element_courant).suivant;
6042: (*l_element_courant).suivant = NULL;
6043: }
6044:
6045: if (((*l_element_courant).donnee = copie_objet(s_etat_processus,
6046: s_objet_resultat, 'O')) == NULL)
6047: {
6048: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
6049: return;
6050: }
1.13 bertrand 6051:
6052: liberation(s_etat_processus, s_objet_argument);
1.1 bertrand 6053: }
6054: else
6055: {
6056: liberation(s_etat_processus, s_objet_argument);
6057:
6058: (*s_etat_processus).erreur_execution =
6059: d_ex_erreur_parametre_fichier;
6060: return;
6061: }
6062: }
6063: else if ((*s_objet_argument).type == CHN)
6064: {
6065: if ((s_objet_resultat = allocation(s_etat_processus, SPH)) == NULL)
6066: {
6067: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
6068: return;
6069: }
6070:
6071: if (((*((struct_semaphore *) (*s_objet_resultat).objet)).nom =
6072: malloc((strlen((unsigned char *) (*s_objet_argument).objet)
6073: + 1) *sizeof(unsigned char))) == NULL)
6074: {
6075: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
6076: return;
6077: }
6078:
6079: strcpy((*((struct_semaphore *) (*s_objet_resultat).objet)).nom,
6080: (unsigned char *) (*s_objet_argument).objet);
6081:
6082: if (((*((struct_semaphore *) (*s_objet_resultat).objet)).semaphore =
6083: sem_open((*((struct_semaphore *) (*s_objet_resultat).objet))
6084: .nom, 0)) == SEM_FAILED)
6085: {
6086: if (errno == ENOMEM)
6087: {
6088: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
6089: return;
6090: }
6091:
6092: (*s_etat_processus).erreur_execution = d_ex_semaphore;
6093:
6094: liberation(s_etat_processus, s_objet_argument);
6095: liberation(s_etat_processus, s_objet_resultat);
6096: return;
6097: }
6098: }
6099: else
6100: {
6101: liberation(s_etat_processus, s_objet_argument);
6102:
6103: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
6104: return;
6105: }
6106:
6107: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
6108: s_objet_resultat) == d_erreur)
6109: {
6110: return;
6111: }
6112:
6113: return;
6114: }
6115:
6116: // vim: ts=4