1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.18
4: Copyright (C) 1989-2010 Dr. BERTRAND Joël
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:
23: #include "rpl-conv.h"
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.
900: */
901:
902: file *descripteur;
903:
904: int buffer_emission;
905: int buffer_reception;
906: int drapeau;
907: int priorite;
908: int protocole_numerique;
909: int timeout_emission;
910: int timeout_reception;
911: int type;
912:
913: integer8 adresse[16];
914: integer8 nombre_maximal_connexions;
915: integer8 port;
916: integer8 position_clef;
917:
918: logical1 erreur;
919: logical1 existence;
920: logical1 ouverture;
921: logical1 presence_port;
922:
923: sqlite3 *sqlite;
924:
925: struct_liste_chainee *l_element_courant;
926: struct_liste_chainee *l_element_courant_sous_objet;
927:
928: struct flock lock;
929:
930: struct addrinfo *resolution;
931: struct addrinfo *resolution_courante;
932:
933: struct protoent *s_protocole;
934:
935: struct sockaddr_un socket_unix;
936: struct sockaddr_in socket_ipv4;
937: # ifdef IPV6
938: struct sockaddr_in6 socket_ipv6;
939: # endif
940:
941: struct_objet *s_objet_argument;
942: struct_objet *s_objet_resultat;
943:
944: uint32_t adresse_ipv4;
945:
946: unsigned char *argument_majuscule;
947: unsigned char *chaine_descripteurs;
948: unsigned char format;
949: unsigned char *hote;
950: unsigned char *nom;
951: unsigned char *nom_temporaire;
952: unsigned char options[12];
953: unsigned char *peripherique;
954: unsigned char *pointeur;
955: unsigned char protection;
956: unsigned char protocole[16 + 1];
957: unsigned char *protocole_socket;
958: unsigned char type_acces;
959: unsigned char type_adresse;
960: unsigned char type_arguments;
961: unsigned char type_domaine;
962: unsigned char type_ouverture;
963: unsigned char type_socket;
964:
965: unsigned long i;
966: unsigned long nombre_elements;
967: unsigned long prochain_descripteur;
968: unsigned long unite;
969:
970: # define d_BIND_TO_DEVICE 0
971: # define d_BROADCAST 1
972: # define d_DONT_ROUTE 2
973: # define d_KEEP_ALIVE 3
974: # define d_PRIORITY 4
975: # define d_RECEIVE_BUFFER 5
976: # define d_FORCE_RECEIVE_BUFFER 6
977: # define d_SEND_BUFFER 7
978: # define d_FORCE_SEND_BUFFER 8
979: # define d_RECEIVING_TIMEOUT 9
980: # define d_SENDING_TIMEOUT 10
981: # define d_REUSE_ADDRESS 11
982:
983: /*
984: * Argument : { "ouverture" "accès" "format" [ { "nom" } 'protection' ] }
985: */
986:
987: (*s_etat_processus).erreur_execution = d_ex;
988:
989: if ((*s_etat_processus).affichage_arguments == 'Y')
990: {
991: printf("\n OPEN ");
992:
993: if ((*s_etat_processus).langue == 'F')
994: {
995: printf("(ouverture d'un fichier, d'une socket ou d'un sémaphore)"
996: "\n\n");
997: }
998: else
999: {
1000: printf("(open file, socket or semaphore)\n\n");
1001: }
1002:
1003: printf(" 1: %s\n", d_LST);
1004: printf("-> 1: %s, %s\n\n", d_FCH, d_SCK);
1005:
1006: printf(" 1: %s\n", d_CHN);
1007: printf("-> 1: %s\n\n", d_SPH);
1008:
1009: if ((*s_etat_processus).langue == 'F')
1010: {
1011: printf(" Utilisation :\n\n");
1012: }
1013: else
1014: {
1015: printf(" Usage:\n\n");
1016: }
1017:
1018: printf(" { \"filetype\" \"access\" \"format\" { \"name\" "
1019: "\"file name\" } \"protection\" } OPEN\n");
1020: printf(" { \"sockettype\" { \"name\" \"local name\" } } OPEN\n");
1021: printf(" { \"sockettype\" \"socketdomain\" \"protection\" } OPEN\n");
1022: printf(" \"/semaphore\" OPEN\n");
1023:
1024: printf(" File type : NEW/OLD/REPLACE/UNKNOWN/SCRATCH\n");
1025: printf(" File access : SEQUENTIAL/DIRECT/KEYED\n");
1026: printf(" Socket type : STREAM/DATAGRAM/RAW/"
1027: "ROBUST DATAGRAM/SEQUENTIAL DATAGRAM\n");
1028: printf(" Socket domain : LOCAL/FOREIGN\n");
1029: printf(" Socket protocol : IPV4/IPV6/UNIX\n");
1030: printf(" Format : FORMATTED/UNFORMATTED/FLOW\n");
1031: printf(" Protection : READONLY/WRITEONLY/READWRITE\n\n");
1032:
1033: printf(" Address : { \"ADDRESS\" [ 127 0 0 1 ] }\n");
1034: printf(" { \"HOST\" \"hostname\" }\n");
1035: printf(" Connections : { \"LISTEN\" amount of connections }\n");
1036: printf(" Name : { \"NAME\" \"filename\" }\n");
1037: printf(" Options : { \"OPTION\" \"option\" argument }\n");
1038: printf(" \"BIND TO DEVICE\" \"device\"\n");
1039: printf(" \"BROADCAST\"\n");
1040: printf(" \"DO NOT ROUTE\"\n");
1041: printf(" \"KEEP ALIVE\"\n");
1042: printf(" \"PRIORITY\" integer\n");
1043: printf(" \"RECEIVE BUFFER\" integer\n");
1044: printf(" \"FORCE RECEIVE BUFFER\" integer\n");
1045: printf(" \"SEND BUFFER\" integer\n");
1046: printf(" \"FORCE SEND BUFFER\" integer\n");
1047: printf(" \"RECEIVING TIMEOUT\" integer\n");
1048: printf(" \"SENDING TIMEOUT\" integer\n");
1049: printf(" \"REUSE ADDRESS\"\n");
1050: printf(" Port : { \"PORT\" port number }\n");
1051: printf(" Protocol : { \"PROTOCOL\" \"protocol\" }\n\n");
1052:
1053: printf(" { { \"NAME\" \"filename\" } } OPEN\n");
1054: printf(" { \"SCRATCH\" } OPEN\n");
1055: printf(" { { \"NAME\" \"filename\" } \"UNKNOWN\" \"FORMATTED\" "
1056: "\"DIRECT\" } OPEN\n");
1057: printf(" { { \"NAME\" \"filename\" } \"OLD\" \"FORMATTED\" "
1058: "\"KEYED\" { \"KEY\" 2 } } OPEN\n");
1059: printf(" { \"STREAM\" \"READWRITE\" } OPEN\n");
1060: printf(" { \"FOREIGN\" \"DATAGRAM\" } OPEN\n");
1061: printf(" { \"LOCAL\" { \"NAME\" \"socket.sock\" } } OPEN\n");
1062:
1063: return;
1064: }
1065: else if ((*s_etat_processus).test_instruction == 'Y')
1066: {
1067: (*s_etat_processus).nombre_arguments = -1;
1068: return;
1069: }
1070:
1071: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1072: {
1073: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1074: {
1075: return;
1076: }
1077: }
1078:
1079: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1080: &s_objet_argument) == d_erreur)
1081: {
1082: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1083: return;
1084: }
1085:
1086: if ((*s_objet_argument).type == LST)
1087: {
1088: l_element_courant = (struct_liste_chainee *) (*s_objet_argument).objet;
1089:
1090: if (l_element_courant == NULL)
1091: {
1092: liberation(s_etat_processus, s_objet_argument);
1093:
1094: (*s_etat_processus).erreur_execution =
1095: d_ex_erreur_parametre_fichier;
1096: return;
1097: }
1098:
1099: format = ' ';
1100: type_domaine = ' ';
1101: type_ouverture = ' ';
1102: protection = ' ';
1103: type_acces = ' ';
1104: type_socket = ' ';
1105: nom = NULL;
1106: position_clef = 0;
1107: port = 0;
1108: type_arguments = ' ';
1109: nombre_maximal_connexions = 0;
1110: hote = NULL;
1111: type_adresse = ' ';
1112: protocole[0] = d_code_fin_chaine;
1113: protocole_socket = NULL;
1114: presence_port = d_faux;
1115: peripherique = NULL;
1116: priorite = 0;
1117: buffer_emission = 0;
1118: buffer_reception = 0;
1119: timeout_emission = 0;
1120: timeout_reception = 0;
1121: drapeau = -1;
1122:
1123: for(i = 0; i < 12; options[i++] = 'N');
1124:
1125: while(l_element_courant != NULL)
1126: {
1127: if ((*(*l_element_courant).donnee).type == CHN)
1128: {
1129: if ((argument_majuscule = conversion_majuscule((unsigned char *)
1130: (*(*l_element_courant).donnee).objet)) == NULL)
1131: {
1132: (*s_etat_processus).erreur_systeme =
1133: d_es_allocation_memoire;
1134: return;
1135: }
1136:
1137: if (strcmp(argument_majuscule, "NEW") == 0)
1138: {
1139: if (type_ouverture != ' ')
1140: {
1141: liberation(s_etat_processus, s_objet_argument);
1142: free(argument_majuscule);
1143:
1144: (*s_etat_processus).erreur_execution =
1145: d_ex_erreur_parametre_fichier;
1146: return;
1147: }
1148:
1149: if (type_arguments == ' ')
1150: {
1151: type_arguments = 'F';
1152: }
1153: else if (type_arguments == 'S')
1154: {
1155: liberation(s_etat_processus, s_objet_argument);
1156: free(argument_majuscule);
1157:
1158: (*s_etat_processus).erreur_execution =
1159: d_ex_erreur_parametre_fichier;
1160: return;
1161: }
1162:
1163: type_ouverture = 'N';
1164: }
1165: else if (strcmp(argument_majuscule, "REPLACE") == 0)
1166: {
1167: if (type_ouverture != ' ')
1168: {
1169: liberation(s_etat_processus, s_objet_argument);
1170: free(argument_majuscule);
1171:
1172: (*s_etat_processus).erreur_execution =
1173: d_ex_erreur_parametre_fichier;
1174: return;
1175: }
1176:
1177: if (type_arguments == ' ')
1178: {
1179: type_arguments = 'F';
1180: }
1181: else if (type_arguments == 'S')
1182: {
1183: liberation(s_etat_processus, s_objet_argument);
1184: free(argument_majuscule);
1185:
1186: (*s_etat_processus).erreur_execution =
1187: d_ex_erreur_parametre_fichier;
1188: return;
1189: }
1190:
1191: type_ouverture = 'R';
1192: }
1193: else if (strcmp(argument_majuscule, "UNKNOWN") == 0)
1194: {
1195: if (type_ouverture != ' ')
1196: {
1197: liberation(s_etat_processus, s_objet_argument);
1198: free(argument_majuscule);
1199:
1200: (*s_etat_processus).erreur_execution =
1201: d_ex_erreur_parametre_fichier;
1202: return;
1203: }
1204:
1205: if (type_arguments == ' ')
1206: {
1207: type_arguments = 'F';
1208: }
1209: else if (type_arguments == 'S')
1210: {
1211: liberation(s_etat_processus, s_objet_argument);
1212: free(argument_majuscule);
1213:
1214: (*s_etat_processus).erreur_execution =
1215: d_ex_erreur_parametre_fichier;
1216: return;
1217: }
1218:
1219: type_ouverture = 'U';
1220: }
1221: else if (strcmp(argument_majuscule, "SCRATCH") == 0)
1222: {
1223: if (type_ouverture != ' ')
1224: {
1225: liberation(s_etat_processus, s_objet_argument);
1226: free(argument_majuscule);
1227:
1228: (*s_etat_processus).erreur_execution =
1229: d_ex_erreur_parametre_fichier;
1230: return;
1231: }
1232:
1233: if (type_arguments == ' ')
1234: {
1235: type_arguments = 'F';
1236: }
1237: else if (type_arguments == 'S')
1238: {
1239: liberation(s_etat_processus, s_objet_argument);
1240: free(argument_majuscule);
1241:
1242: (*s_etat_processus).erreur_execution =
1243: d_ex_erreur_parametre_fichier;
1244: return;
1245: }
1246:
1247: type_ouverture = 'S';
1248: }
1249: else if (strcmp(argument_majuscule, "SEQUENTIAL") == 0)
1250: {
1251: if (type_acces != ' ')
1252: {
1253: liberation(s_etat_processus, s_objet_argument);
1254: free(argument_majuscule);
1255:
1256: (*s_etat_processus).erreur_execution =
1257: d_ex_erreur_parametre_fichier;
1258: return;
1259: }
1260:
1261: if (type_arguments == ' ')
1262: {
1263: type_arguments = 'F';
1264: }
1265: else if (type_arguments == 'S')
1266: {
1267: liberation(s_etat_processus, s_objet_argument);
1268: free(argument_majuscule);
1269:
1270: (*s_etat_processus).erreur_execution =
1271: d_ex_erreur_parametre_fichier;
1272: return;
1273: }
1274:
1275: type_acces = 'S';
1276: }
1277: else if (strcmp(argument_majuscule, "DIRECT") == 0)
1278: {
1279: if (type_acces != ' ')
1280: {
1281: liberation(s_etat_processus, s_objet_argument);
1282: free(argument_majuscule);
1283:
1284: (*s_etat_processus).erreur_execution =
1285: d_ex_erreur_parametre_fichier;
1286: return;
1287: }
1288:
1289: if (type_arguments == ' ')
1290: {
1291: type_arguments = 'F';
1292: }
1293: else if (type_arguments == 'S')
1294: {
1295: liberation(s_etat_processus, s_objet_argument);
1296: free(argument_majuscule);
1297:
1298: (*s_etat_processus).erreur_execution =
1299: d_ex_erreur_parametre_fichier;
1300: return;
1301: }
1302:
1303: type_acces = 'D';
1304: }
1305: else if (strcmp(argument_majuscule, "KEYED") == 0)
1306: {
1307: if (type_acces != ' ')
1308: {
1309: liberation(s_etat_processus, s_objet_argument);
1310: free(argument_majuscule);
1311:
1312: (*s_etat_processus).erreur_execution =
1313: d_ex_erreur_parametre_fichier;
1314: return;
1315: }
1316:
1317: if (type_arguments == ' ')
1318: {
1319: type_arguments = 'F';
1320: }
1321: else if (type_arguments == 'S')
1322: {
1323: liberation(s_etat_processus, s_objet_argument);
1324: free(argument_majuscule);
1325:
1326: (*s_etat_processus).erreur_execution =
1327: d_ex_erreur_parametre_fichier;
1328: return;
1329: }
1330:
1331: type_acces = 'I';
1332: }
1333: else if (strcmp(argument_majuscule, "READONLY") == 0)
1334: {
1335: if (protection != ' ')
1336: {
1337: liberation(s_etat_processus, s_objet_argument);
1338: free(argument_majuscule);
1339:
1340: (*s_etat_processus).erreur_execution =
1341: d_ex_erreur_parametre_fichier;
1342: return;
1343: }
1344:
1345: protection = 'R';
1346: }
1347: else if (strcmp(argument_majuscule, "WRITEONLY") == 0)
1348: {
1349: if (protection != ' ')
1350: {
1351: liberation(s_etat_processus, s_objet_argument);
1352: free(argument_majuscule);
1353:
1354: (*s_etat_processus).erreur_execution =
1355: d_ex_erreur_parametre_fichier;
1356: return;
1357: }
1358:
1359: protection = 'W';
1360: }
1361: else if (strcmp(argument_majuscule, "READWRITE") == 0)
1362: {
1363: if (protection != ' ')
1364: {
1365: liberation(s_etat_processus, s_objet_argument);
1366: free(argument_majuscule);
1367:
1368: (*s_etat_processus).erreur_execution =
1369: d_ex_erreur_parametre_fichier;
1370: return;
1371: }
1372:
1373: protection = 'N';
1374: }
1375: else if (strcmp(argument_majuscule, "FORMATTED") == 0)
1376: {
1377: if (format != ' ')
1378: {
1379: liberation(s_etat_processus, s_objet_argument);
1380: free(argument_majuscule);
1381:
1382: (*s_etat_processus).erreur_execution =
1383: d_ex_erreur_parametre_fichier;
1384: return;
1385: }
1386:
1387: format = 'N';
1388: }
1389: else if (strcmp(argument_majuscule, "UNFORMATTED") == 0)
1390: {
1391: if (format != ' ')
1392: {
1393: liberation(s_etat_processus, s_objet_argument);
1394: free(argument_majuscule);
1395:
1396: (*s_etat_processus).erreur_execution =
1397: d_ex_erreur_parametre_fichier;
1398: return;
1399: }
1400:
1401: format = 'Y';
1402: }
1403: else if (strcmp(argument_majuscule, "FLOW") == 0)
1404: {
1405: if (format != ' ')
1406: {
1407: liberation(s_etat_processus, s_objet_argument);
1408: free(argument_majuscule);
1409:
1410: (*s_etat_processus).erreur_execution =
1411: d_ex_erreur_parametre_fichier;
1412: return;
1413: }
1414:
1415: format = 'F';
1416: }
1417: else if (strcmp(argument_majuscule, "STREAM") == 0)
1418: {
1419: if (type_socket != ' ')
1420: {
1421: liberation(s_etat_processus, s_objet_argument);
1422: free(argument_majuscule);
1423:
1424: (*s_etat_processus).erreur_execution =
1425: d_ex_erreur_parametre_fichier;
1426: return;
1427: }
1428:
1429: if (type_arguments == ' ')
1430: {
1431: type_arguments = 'S';
1432: }
1433: else if (type_arguments == 'F')
1434: {
1435: liberation(s_etat_processus, s_objet_argument);
1436: free(argument_majuscule);
1437:
1438: (*s_etat_processus).erreur_execution =
1439: d_ex_erreur_parametre_fichier;
1440: return;
1441: }
1442:
1443: type_socket = 'S';
1444: }
1445: else if (strcmp(argument_majuscule, "DATAGRAM") == 0)
1446: {
1447: if (type_socket != ' ')
1448: {
1449: liberation(s_etat_processus, s_objet_argument);
1450: free(argument_majuscule);
1451:
1452: (*s_etat_processus).erreur_execution =
1453: d_ex_erreur_parametre_fichier;
1454: return;
1455: }
1456:
1457: type_socket = 'D';
1458: }
1459: else if (strcmp(argument_majuscule, "SEQUENTIAL DATAGRAM") == 0)
1460: {
1461: if (type_socket != ' ')
1462: {
1463: liberation(s_etat_processus, s_objet_argument);
1464: free(argument_majuscule);
1465:
1466: (*s_etat_processus).erreur_execution =
1467: d_ex_erreur_parametre_fichier;
1468: return;
1469: }
1470:
1471: if (type_arguments == ' ')
1472: {
1473: type_arguments = 'S';
1474: }
1475: else if (type_arguments == 'F')
1476: {
1477: liberation(s_etat_processus, s_objet_argument);
1478: free(argument_majuscule);
1479:
1480: (*s_etat_processus).erreur_execution =
1481: d_ex_erreur_parametre_fichier;
1482: return;
1483: }
1484:
1485: type_socket = 'Q';
1486: }
1487: else if (strcmp(argument_majuscule, "RAW") == 0)
1488: {
1489: if (type_socket != ' ')
1490: {
1491: liberation(s_etat_processus, s_objet_argument);
1492: free(argument_majuscule);
1493:
1494: (*s_etat_processus).erreur_execution =
1495: d_ex_erreur_parametre_fichier;
1496: return;
1497: }
1498:
1499: if (type_arguments == ' ')
1500: {
1501: type_arguments = 'S';
1502: }
1503: else if (type_arguments == 'F')
1504: {
1505: liberation(s_etat_processus, s_objet_argument);
1506: free(argument_majuscule);
1507:
1508: (*s_etat_processus).erreur_execution =
1509: d_ex_erreur_parametre_fichier;
1510: return;
1511: }
1512:
1513: type_socket = 'R';
1514: }
1515: else if (strcmp(argument_majuscule, "ROBUST DATAGRAM") == 0)
1516: {
1517: if (type_socket != ' ')
1518: {
1519: liberation(s_etat_processus, s_objet_argument);
1520: free(argument_majuscule);
1521:
1522: (*s_etat_processus).erreur_execution =
1523: d_ex_erreur_parametre_fichier;
1524: return;
1525: }
1526:
1527: if (type_arguments == ' ')
1528: {
1529: type_arguments = 'S';
1530: }
1531: else if (type_arguments == 'F')
1532: {
1533: liberation(s_etat_processus, s_objet_argument);
1534: free(argument_majuscule);
1535:
1536: (*s_etat_processus).erreur_execution =
1537: d_ex_erreur_parametre_fichier;
1538: return;
1539: }
1540:
1541: type_socket = 'M';
1542: }
1543: else if (strcmp(argument_majuscule, "LOCAL") == 0)
1544: {
1545: if (type_domaine != ' ')
1546: {
1547: liberation(s_etat_processus, s_objet_argument);
1548: free(argument_majuscule);
1549:
1550: (*s_etat_processus).erreur_execution =
1551: d_ex_erreur_parametre_fichier;
1552: return;
1553: }
1554:
1555: if (type_arguments == ' ')
1556: {
1557: type_arguments = 'S';
1558: }
1559: else if (type_arguments == 'F')
1560: {
1561: liberation(s_etat_processus, s_objet_argument);
1562: free(argument_majuscule);
1563:
1564: (*s_etat_processus).erreur_execution =
1565: d_ex_erreur_parametre_fichier;
1566: return;
1567: }
1568:
1569: type_domaine = 'L';
1570: }
1571: else if (strcmp(argument_majuscule, "FOREIGN") == 0)
1572: {
1573: if (type_domaine != ' ')
1574: {
1575: liberation(s_etat_processus, s_objet_argument);
1576: free(argument_majuscule);
1577:
1578: (*s_etat_processus).erreur_execution =
1579: d_ex_erreur_parametre_fichier;
1580: return;
1581: }
1582:
1583: if (type_arguments == ' ')
1584: {
1585: type_arguments = 'S';
1586: }
1587: else if (type_arguments == 'F')
1588: {
1589: liberation(s_etat_processus, s_objet_argument);
1590: free(argument_majuscule);
1591:
1592: (*s_etat_processus).erreur_execution =
1593: d_ex_erreur_parametre_fichier;
1594: return;
1595: }
1596:
1597: type_domaine = 'F';
1598: }
1599: else if (strcmp(argument_majuscule, "IPV4") == 0)
1600: {
1601: if (strcmp(protocole, "") != 0)
1602: {
1603: liberation(s_etat_processus, s_objet_argument);
1604: free(argument_majuscule);
1605:
1606: (*s_etat_processus).erreur_execution =
1607: d_ex_erreur_parametre_fichier;
1608: return;
1609: }
1610:
1611: if (type_arguments == ' ')
1612: {
1613: type_arguments = 'S';
1614: }
1615: else if (type_arguments == 'F')
1616: {
1617: liberation(s_etat_processus, s_objet_argument);
1618: free(argument_majuscule);
1619:
1620: (*s_etat_processus).erreur_execution =
1621: d_ex_erreur_parametre_fichier;
1622: return;
1623: }
1624:
1625: strcpy(protocole, "IPV4");
1626: }
1627: else if (strcmp(argument_majuscule, "IPV6") == 0)
1628: {
1629: if (strcmp(protocole, "") != 0)
1630: {
1631: liberation(s_etat_processus, s_objet_argument);
1632: free(argument_majuscule);
1633:
1634: (*s_etat_processus).erreur_execution =
1635: d_ex_erreur_parametre_fichier;
1636: return;
1637: }
1638:
1639: if (type_arguments == ' ')
1640: {
1641: type_arguments = 'S';
1642: }
1643: else if (type_arguments == 'F')
1644: {
1645: liberation(s_etat_processus, s_objet_argument);
1646: free(argument_majuscule);
1647:
1648: (*s_etat_processus).erreur_execution =
1649: d_ex_erreur_parametre_fichier;
1650: return;
1651: }
1652:
1653: strcpy(protocole, "IPV6");
1654: }
1655: else if (strcmp(argument_majuscule, "UNIX") == 0)
1656: {
1657: if (strcmp(protocole, "") != 0)
1658: {
1659: liberation(s_etat_processus, s_objet_argument);
1660: free(argument_majuscule);
1661:
1662: (*s_etat_processus).erreur_execution =
1663: d_ex_erreur_parametre_fichier;
1664: return;
1665: }
1666:
1667: if (type_arguments == ' ')
1668: {
1669: type_arguments = 'S';
1670: }
1671: else if (type_arguments == 'F')
1672: {
1673: liberation(s_etat_processus, s_objet_argument);
1674: free(argument_majuscule);
1675:
1676: (*s_etat_processus).erreur_execution =
1677: d_ex_erreur_parametre_fichier;
1678: return;
1679: }
1680:
1681: strcpy(protocole, "UNIX");
1682: }
1683: else
1684: {
1685: liberation(s_etat_processus, s_objet_argument);
1686: free(argument_majuscule);
1687:
1688: (*s_etat_processus).erreur_execution =
1689: d_ex_erreur_parametre_fichier;
1690: return;
1691: }
1692:
1693: free(argument_majuscule);
1694: }
1695: else if ((*(*l_element_courant).donnee).type == LST)
1696: {
1697: l_element_courant_sous_objet =
1698: (*(*l_element_courant).donnee).objet;
1699:
1700: nombre_elements = 0;
1701: while(l_element_courant_sous_objet != NULL)
1702: {
1703: nombre_elements++;
1704: l_element_courant_sous_objet =
1705: (*l_element_courant_sous_objet).suivant;
1706: }
1707:
1708: l_element_courant_sous_objet =
1709: (*(*l_element_courant).donnee).objet;
1710:
1711: if (nombre_elements == 2)
1712: {
1713: if ((*(*l_element_courant_sous_objet).donnee).type == CHN)
1714: {
1715: if ((argument_majuscule = conversion_majuscule(
1716: (unsigned char *)
1717: (*(*l_element_courant_sous_objet)
1718: .donnee).objet)) == NULL)
1719: {
1720: (*s_etat_processus).erreur_systeme =
1721: d_es_allocation_memoire;
1722: return;
1723: }
1724:
1725: l_element_courant_sous_objet =
1726: (*l_element_courant_sous_objet).suivant;
1727:
1728: if (strcmp(argument_majuscule, "NAME") == 0)
1729: {
1730: if ((*(*l_element_courant_sous_objet).donnee).type
1731: == CHN)
1732: {
1733: if (nom != NULL)
1734: {
1735: liberation(s_etat_processus,
1736: s_objet_argument);
1737: free(argument_majuscule);
1738:
1739: (*s_etat_processus).erreur_execution =
1740: d_ex_erreur_parametre_fichier;
1741: return;
1742: }
1743:
1744: nom = (unsigned char *)
1745: (*(*l_element_courant_sous_objet)
1746: .donnee).objet;
1747: }
1748: else
1749: {
1750: liberation(s_etat_processus, s_objet_argument);
1751: free(argument_majuscule);
1752:
1753: (*s_etat_processus).erreur_execution =
1754: d_ex_erreur_parametre_fichier;
1755: return;
1756: }
1757: }
1758: else if (strcmp(argument_majuscule, "OPTION") == 0)
1759: {
1760: if ((*(*l_element_courant_sous_objet).donnee).type
1761: == CHN)
1762: {
1763: if (type_arguments == ' ')
1764: {
1765: type_arguments = 'S';
1766: }
1767: else if (type_arguments == 'F')
1768: {
1769: liberation(s_etat_processus,
1770: s_objet_argument);
1771: free(argument_majuscule);
1772:
1773: (*s_etat_processus).erreur_execution =
1774: d_ex_erreur_parametre_fichier;
1775: return;
1776: }
1777: }
1778:
1779: free(argument_majuscule);
1780:
1781: if ((argument_majuscule = conversion_majuscule(
1782: (unsigned char *)
1783: (*(*l_element_courant_sous_objet)
1784: .donnee).objet)) == NULL)
1785: {
1786: (*s_etat_processus).erreur_systeme =
1787: d_es_allocation_memoire;
1788: return;
1789: }
1790:
1791: if (strcmp(argument_majuscule, "BROADCAST") == 0)
1792: {
1793: if (options[d_BROADCAST] == 'Y')
1794: {
1795: liberation(s_etat_processus,
1796: s_objet_argument);
1797: free(argument_majuscule);
1798:
1799: (*s_etat_processus).erreur_execution =
1800: d_ex_erreur_parametre_fichier;
1801: return;
1802: }
1803:
1804: options[d_BROADCAST] = 'Y';
1805: }
1806: else if (strcmp(argument_majuscule, "DO NOT ROUTE")
1807: == 0)
1808: {
1809: if (options[d_DONT_ROUTE] == 'Y')
1810: {
1811: liberation(s_etat_processus,
1812: s_objet_argument);
1813: free(argument_majuscule);
1814:
1815: (*s_etat_processus).erreur_execution =
1816: d_ex_erreur_parametre_fichier;
1817: return;
1818: }
1819:
1820: options[d_DONT_ROUTE] = 'Y';
1821: }
1822: else if (strcmp(argument_majuscule, "KEEP ALIVE")
1823: == 0)
1824: {
1825: if (options[d_KEEP_ALIVE] == 'Y')
1826: {
1827: liberation(s_etat_processus,
1828: s_objet_argument);
1829: free(argument_majuscule);
1830:
1831: (*s_etat_processus).erreur_execution =
1832: d_ex_erreur_parametre_fichier;
1833: return;
1834: }
1835:
1836: options[d_KEEP_ALIVE] = 'Y';
1837: }
1838: else if (strcmp(argument_majuscule, "REUSE ADDRESS")
1839: == 0)
1840: {
1841: if (options[d_REUSE_ADDRESS] == 'Y')
1842: {
1843: liberation(s_etat_processus,
1844: s_objet_argument);
1845: free(argument_majuscule);
1846:
1847: (*s_etat_processus).erreur_execution =
1848: d_ex_erreur_parametre_fichier;
1849: return;
1850: }
1851:
1852: options[d_REUSE_ADDRESS] = 'Y';
1853: }
1854: else
1855: {
1856: liberation(s_etat_processus,
1857: s_objet_argument);
1858: free(argument_majuscule);
1859:
1860: (*s_etat_processus).erreur_execution =
1861: d_ex_erreur_parametre_fichier;
1862: return;
1863: }
1864: }
1865: else if (strcmp(argument_majuscule, "HOST") == 0)
1866: {
1867: if ((*(*l_element_courant_sous_objet).donnee).type
1868: == CHN)
1869: {
1870: if (type_arguments == ' ')
1871: {
1872: type_arguments = 'S';
1873: }
1874: else if (type_arguments == 'F')
1875: {
1876: liberation(s_etat_processus,
1877: s_objet_argument);
1878: free(argument_majuscule);
1879:
1880: (*s_etat_processus).erreur_execution =
1881: d_ex_erreur_parametre_fichier;
1882: return;
1883: }
1884:
1885: if (hote != NULL)
1886: {
1887: liberation(s_etat_processus,
1888: s_objet_argument);
1889: free(argument_majuscule);
1890:
1891: (*s_etat_processus).erreur_execution =
1892: d_ex_erreur_parametre_fichier;
1893: return;
1894: }
1895:
1896: hote = (unsigned char *)
1897: (*(*l_element_courant_sous_objet)
1898: .donnee).objet;
1899: }
1900: else
1901: {
1902: liberation(s_etat_processus,
1903: s_objet_argument);
1904: free(argument_majuscule);
1905:
1906: (*s_etat_processus).erreur_execution =
1907: d_ex_erreur_parametre_fichier;
1908: return;
1909: }
1910: }
1911: else if (strcmp(argument_majuscule, "PROTOCOL") == 0)
1912: {
1913: if ((*(*l_element_courant_sous_objet).donnee).type
1914: == CHN)
1915: {
1916: if (type_arguments == ' ')
1917: {
1918: type_arguments = 'S';
1919: }
1920: else if (type_arguments == 'F')
1921: {
1922: liberation(s_etat_processus,
1923: s_objet_argument);
1924: free(argument_majuscule);
1925:
1926: (*s_etat_processus).erreur_execution =
1927: d_ex_erreur_parametre_fichier;
1928: return;
1929: }
1930:
1931: if (protocole_socket != NULL)
1932: {
1933: liberation(s_etat_processus,
1934: s_objet_argument);
1935: free(argument_majuscule);
1936:
1937: (*s_etat_processus).erreur_execution =
1938: d_ex_erreur_parametre_fichier;
1939: return;
1940: }
1941:
1942: protocole_socket = (unsigned char *)
1943: (*(*l_element_courant_sous_objet)
1944: .donnee).objet;
1945: }
1946: else
1947: {
1948: liberation(s_etat_processus, s_objet_argument);
1949: free(argument_majuscule);
1950:
1951: (*s_etat_processus).erreur_execution =
1952: d_ex_erreur_parametre_fichier;
1953: return;
1954: }
1955: }
1956: else if (strcmp(argument_majuscule, "KEY") == 0)
1957: {
1958: if ((*(*l_element_courant_sous_objet).donnee).type
1959: == INT)
1960: {
1961: if (type_arguments == ' ')
1962: {
1963: type_arguments = 'F';
1964: }
1965: else if (type_arguments == 'S')
1966: {
1967: liberation(s_etat_processus,
1968: s_objet_argument);
1969: free(argument_majuscule);
1970:
1971: (*s_etat_processus).erreur_execution =
1972: d_ex_erreur_parametre_fichier;
1973: return;
1974: }
1975:
1976: if (position_clef != 0)
1977: {
1978: liberation(s_etat_processus,
1979: s_objet_argument);
1980:
1981: (*s_etat_processus).erreur_execution =
1982: d_ex_erreur_parametre_fichier;
1983: return;
1984: }
1985: else
1986: {
1987: if ((position_clef = (*((integer8 *)
1988: (*(*l_element_courant_sous_objet)
1989: .donnee).objet))) <= 0)
1990: {
1991: liberation(s_etat_processus,
1992: s_objet_argument);
1993:
1994: (*s_etat_processus).erreur_execution =
1995: d_ex_erreur_parametre_fichier;
1996: return;
1997: }
1998: }
1999: }
2000: else
2001: {
2002: liberation(s_etat_processus, s_objet_argument);
2003: free(argument_majuscule);
2004:
2005: (*s_etat_processus).erreur_execution =
2006: d_ex_erreur_parametre_fichier;
2007: return;
2008: }
2009: }
2010: else if (strcmp(argument_majuscule, "PORT") == 0)
2011: {
2012: if ((*(*l_element_courant_sous_objet)
2013: .donnee).type == INT)
2014: {
2015: if (type_arguments == ' ')
2016: {
2017: type_arguments = 'S';
2018: }
2019: else if (type_arguments == 'F')
2020: {
2021: liberation(s_etat_processus,
2022: s_objet_argument);
2023: free(argument_majuscule);
2024:
2025: (*s_etat_processus).erreur_execution =
2026: d_ex_erreur_parametre_fichier;
2027: return;
2028: }
2029:
2030: if (presence_port == d_vrai)
2031: {
2032: liberation(s_etat_processus,
2033: s_objet_argument);
2034:
2035: (*s_etat_processus).erreur_execution =
2036: d_ex_erreur_parametre_fichier;
2037: return;
2038: }
2039: else
2040: {
2041: presence_port = d_vrai;
2042:
2043: if ((port = (*((integer8 *)
2044: (*(*l_element_courant_sous_objet)
2045: .donnee).objet))) < 0)
2046: {
2047: liberation(s_etat_processus,
2048: s_objet_argument);
2049:
2050: (*s_etat_processus).erreur_execution =
2051: d_ex_erreur_parametre_fichier;
2052: return;
2053: }
2054:
2055: if (port > 65535)
2056: {
2057: liberation(s_etat_processus,
2058: s_objet_argument);
2059:
2060: (*s_etat_processus).erreur_execution =
2061: d_ex_erreur_parametre_fichier;
2062: return;
2063: }
2064: }
2065: }
2066: else
2067: {
2068: liberation(s_etat_processus, s_objet_argument);
2069: free(argument_majuscule);
2070:
2071: (*s_etat_processus).erreur_execution =
2072: d_ex_erreur_parametre_fichier;
2073: return;
2074: }
2075: }
2076: else if (strcmp(argument_majuscule, "LISTEN") == 0)
2077: {
2078: if ((*(*l_element_courant_sous_objet).donnee).type
2079: == INT)
2080: {
2081: if (type_arguments == ' ')
2082: {
2083: type_arguments = 'S';
2084: }
2085: else if (type_arguments == 'F')
2086: {
2087: liberation(s_etat_processus,
2088: s_objet_argument);
2089: free(argument_majuscule);
2090:
2091: (*s_etat_processus).erreur_execution =
2092: d_ex_erreur_parametre_fichier;
2093: return;
2094: }
2095:
2096: if (nombre_maximal_connexions != 0)
2097: {
2098: liberation(s_etat_processus,
2099: s_objet_argument);
2100:
2101: (*s_etat_processus).erreur_execution =
2102: d_ex_erreur_parametre_fichier;
2103: return;
2104: }
2105: else
2106: {
2107: if ((nombre_maximal_connexions =
2108: (*((integer8 *)
2109: (*(*l_element_courant_sous_objet)
2110: .donnee).objet))) <= 0)
2111: {
2112: liberation(s_etat_processus,
2113: s_objet_argument);
2114:
2115: (*s_etat_processus).erreur_execution =
2116: d_ex_erreur_parametre_fichier;
2117: return;
2118: }
2119: }
2120: }
2121: }
2122: else if (strcmp(argument_majuscule, "ADDRESS") == 0)
2123: {
2124: if ((*(*l_element_courant_sous_objet)
2125: .donnee).type == VIN)
2126: {
2127: if (type_arguments == ' ')
2128: {
2129: type_arguments = 'S';
2130: }
2131: else if (type_arguments == 'F')
2132: {
2133: liberation(s_etat_processus,
2134: s_objet_argument);
2135: free(argument_majuscule);
2136:
2137: (*s_etat_processus).erreur_execution =
2138: d_ex_erreur_parametre_fichier;
2139: return;
2140: }
2141:
2142: if (type_adresse != ' ')
2143: {
2144: liberation(s_etat_processus,
2145: s_objet_argument);
2146:
2147: (*s_etat_processus).erreur_execution =
2148: d_ex_erreur_parametre_fichier;
2149: return;
2150: }
2151:
2152: if ((*((struct_vecteur *)
2153: (*(*l_element_courant_sous_objet)
2154: .donnee).objet)).taille == 4)
2155: { // Adresse IPv4
2156: type_adresse = '4';
2157:
2158: for(i = 0; i < 4; i++)
2159: {
2160: adresse[i] = ((integer8 *)
2161: (*((struct_vecteur *) (*
2162: (*l_element_courant_sous_objet)
2163: .donnee).objet)).tableau)[i];
2164:
2165: if ((adresse[i] < 0) || (adresse[i] >
2166: 255))
2167: {
2168: liberation(s_etat_processus,
2169: s_objet_argument);
2170:
2171: (*s_etat_processus).erreur_execution
2172: = d_ex_erreur_parametre_fichier;
2173: return;
2174: }
2175: }
2176: }
2177: else if ((*((struct_vecteur *)
2178: (*(*l_element_courant_sous_objet)
2179: .donnee).objet)).taille == 16)
2180: { // Adresse IPv6
2181: type_adresse = '6';
2182:
2183: for(i = 0; i < 16; i++)
2184: {
2185: adresse[i] = ((integer8 *)
2186: (*((struct_vecteur *) (*
2187: (*l_element_courant_sous_objet)
2188: .donnee).objet)).tableau)[i];
2189:
2190: if ((adresse[i] < 0) || (adresse[i] >
2191: 255))
2192: {
2193: liberation(s_etat_processus,
2194: s_objet_argument);
2195:
2196: (*s_etat_processus).erreur_execution
2197: = d_ex_erreur_parametre_fichier;
2198: return;
2199: }
2200: }
2201: }
2202: else
2203: { // Adresse non supportée
2204: liberation(s_etat_processus,
2205: s_objet_argument);
2206:
2207: (*s_etat_processus).erreur_execution =
2208: d_ex_erreur_parametre_fichier;
2209: return;
2210: }
2211: }
2212: }
2213: else
2214: {
2215: liberation(s_etat_processus, s_objet_argument);
2216: free(argument_majuscule);
2217:
2218: (*s_etat_processus).erreur_execution =
2219: d_ex_erreur_parametre_fichier;
2220: return;
2221: }
2222:
2223: free(argument_majuscule);
2224: }
2225: else
2226: {
2227: liberation(s_etat_processus, s_objet_argument);
2228: (*s_etat_processus).erreur_execution =
2229: d_ex_erreur_parametre_fichier;
2230:
2231: return;
2232: }
2233: }
2234: else if (nombre_elements == 3)
2235: {
2236: if ((*(*l_element_courant_sous_objet).donnee).type == CHN)
2237: {
2238: if ((argument_majuscule = conversion_majuscule(
2239: (unsigned char *)
2240: (*(*l_element_courant_sous_objet)
2241: .donnee).objet)) == NULL)
2242: {
2243: (*s_etat_processus).erreur_systeme =
2244: d_es_allocation_memoire;
2245: return;
2246: }
2247:
2248: if (strcmp(argument_majuscule, "OPTION") == 0)
2249: {
2250: if (type_arguments == ' ')
2251: {
2252: type_arguments = 'S';
2253: }
2254: else if (type_arguments == 'F')
2255: {
2256: liberation(s_etat_processus, s_objet_argument);
2257: free(argument_majuscule);
2258:
2259: (*s_etat_processus).erreur_execution =
2260: d_ex_erreur_parametre_fichier;
2261: return;
2262: }
2263:
2264: free(argument_majuscule);
2265:
2266: l_element_courant_sous_objet =
2267: (*l_element_courant_sous_objet).suivant;
2268:
2269: if ((*(*l_element_courant_sous_objet)
2270: .donnee).type != CHN)
2271: {
2272: liberation(s_etat_processus, s_objet_argument);
2273:
2274: (*s_etat_processus).erreur_execution =
2275: d_ex_erreur_parametre_fichier;
2276: return;
2277: }
2278:
2279: if ((argument_majuscule = conversion_majuscule(
2280: (unsigned char *)
2281: (*(*l_element_courant_sous_objet)
2282: .donnee).objet)) == NULL)
2283: {
2284: (*s_etat_processus).erreur_systeme =
2285: d_es_allocation_memoire;
2286: return;
2287: }
2288:
2289: l_element_courant_sous_objet =
2290: (*l_element_courant_sous_objet).suivant;
2291:
2292: if (strcmp(argument_majuscule, "BIND TO DEVICE")
2293: == 0)
2294: {
2295: if ((*(*l_element_courant_sous_objet)
2296: .donnee).type != CHN)
2297: {
2298: liberation(s_etat_processus,
2299: s_objet_argument);
2300: free(argument_majuscule);
2301:
2302: (*s_etat_processus).erreur_execution =
2303: d_ex_erreur_parametre_fichier;
2304: return;
2305: }
2306:
2307: if (options[d_BIND_TO_DEVICE] == 'Y')
2308: {
2309: liberation(s_etat_processus,
2310: s_objet_argument);
2311: free(argument_majuscule);
2312:
2313: (*s_etat_processus).erreur_execution =
2314: d_ex_erreur_parametre_fichier;
2315: return;
2316: }
2317:
2318: options[d_BIND_TO_DEVICE] = 'Y';
2319:
2320: peripherique = (unsigned char *)
2321: (*(*l_element_courant_sous_objet)
2322: .donnee).objet;
2323: }
2324: else if (strcmp(argument_majuscule, "PRIORITY")
2325: == 0)
2326: {
2327: if ((*(*l_element_courant_sous_objet)
2328: .donnee).type != INT)
2329: {
2330: liberation(s_etat_processus,
2331: s_objet_argument);
2332: free(argument_majuscule);
2333:
2334: (*s_etat_processus).erreur_execution =
2335: d_ex_erreur_parametre_fichier;
2336: return;
2337: }
2338:
2339: if (options[d_PRIORITY] == 'Y')
2340: {
2341: liberation(s_etat_processus,
2342: s_objet_argument);
2343: free(argument_majuscule);
2344:
2345: (*s_etat_processus).erreur_execution =
2346: d_ex_erreur_parametre_fichier;
2347: return;
2348: }
2349:
2350: options[d_PRIORITY] = 'Y';
2351:
2352: priorite = (int) (*((integer8 *)
2353: (*(*l_element_courant_sous_objet)
2354: .donnee).objet));
2355: }
2356: else if (strcmp(argument_majuscule,
2357: "RECEIVE BUFFER") == 0)
2358: {
2359: if ((*(*l_element_courant_sous_objet)
2360: .donnee).type != INT)
2361: {
2362: liberation(s_etat_processus,
2363: s_objet_argument);
2364: free(argument_majuscule);
2365:
2366: (*s_etat_processus).erreur_execution =
2367: d_ex_erreur_parametre_fichier;
2368: return;
2369: }
2370:
2371: if ((options[d_RECEIVE_BUFFER] == 'Y') ||
2372: (options[d_FORCE_RECEIVE_BUFFER]
2373: == 'Y'))
2374: {
2375: liberation(s_etat_processus,
2376: s_objet_argument);
2377: free(argument_majuscule);
2378:
2379: (*s_etat_processus).erreur_execution =
2380: d_ex_erreur_parametre_fichier;
2381: return;
2382: }
2383:
2384: options[d_RECEIVE_BUFFER] = 'Y';
2385:
2386: buffer_reception = (int) (*((integer8 *)
2387: (*(*l_element_courant_sous_objet)
2388: .donnee).objet));
2389: }
2390: else if (strcmp(argument_majuscule,
2391: "FORCE RECEIVE BUFFER") == 0)
2392: {
2393: if ((*(*l_element_courant_sous_objet)
2394: .donnee).type != INT)
2395: {
2396: liberation(s_etat_processus,
2397: s_objet_argument);
2398: free(argument_majuscule);
2399:
2400: (*s_etat_processus).erreur_execution =
2401: d_ex_erreur_parametre_fichier;
2402: return;
2403: }
2404:
2405: if ((options[d_RECEIVE_BUFFER] == 'Y') ||
2406: (options[d_FORCE_RECEIVE_BUFFER]
2407: == 'Y'))
2408: {
2409: liberation(s_etat_processus,
2410: s_objet_argument);
2411: free(argument_majuscule);
2412:
2413: (*s_etat_processus).erreur_execution =
2414: d_ex_erreur_parametre_fichier;
2415: return;
2416: }
2417:
2418: options[d_FORCE_RECEIVE_BUFFER] = 'Y';
2419:
2420: buffer_reception = (int) (*((integer8 *)
2421: (*(*l_element_courant_sous_objet)
2422: .donnee).objet));
2423: }
2424: else if (strcmp(argument_majuscule,
2425: "SEND BUFFER") == 0)
2426: {
2427: if ((*(*l_element_courant_sous_objet)
2428: .donnee).type != INT)
2429: {
2430: liberation(s_etat_processus,
2431: s_objet_argument);
2432: free(argument_majuscule);
2433:
2434: (*s_etat_processus).erreur_execution =
2435: d_ex_erreur_parametre_fichier;
2436: return;
2437: }
2438:
2439: if ((options[d_SEND_BUFFER] == 'Y') ||
2440: (options[d_FORCE_SEND_BUFFER] == 'Y'))
2441: {
2442: liberation(s_etat_processus,
2443: s_objet_argument);
2444: free(argument_majuscule);
2445:
2446: (*s_etat_processus).erreur_execution =
2447: d_ex_erreur_parametre_fichier;
2448: return;
2449: }
2450:
2451: options[d_SEND_BUFFER] = 'Y';
2452:
2453: buffer_emission = (int) (*((integer8 *)
2454: (*(*l_element_courant_sous_objet)
2455: .donnee).objet));
2456: }
2457: else if (strcmp(argument_majuscule,
2458: "FORCE SEND BUFFER") == 0)
2459: {
2460: if ((*(*l_element_courant_sous_objet)
2461: .donnee).type != INT)
2462: {
2463: liberation(s_etat_processus,
2464: s_objet_argument);
2465: free(argument_majuscule);
2466:
2467: (*s_etat_processus).erreur_execution =
2468: d_ex_erreur_parametre_fichier;
2469: return;
2470: }
2471:
2472: if ((options[d_SEND_BUFFER] == 'Y') ||
2473: (options[d_FORCE_SEND_BUFFER] == 'Y'))
2474: {
2475: liberation(s_etat_processus,
2476: s_objet_argument);
2477: free(argument_majuscule);
2478:
2479: (*s_etat_processus).erreur_execution =
2480: d_ex_erreur_parametre_fichier;
2481: return;
2482: }
2483:
2484: options[d_FORCE_SEND_BUFFER] = 'Y';
2485:
2486: buffer_emission = (int) (*((integer8 *)
2487: (*(*l_element_courant_sous_objet)
2488: .donnee).objet));
2489: }
2490: else if (strcmp(argument_majuscule,
2491: "RECEIVING TIMEOUT") == 0)
2492: {
2493: if ((*(*l_element_courant_sous_objet)
2494: .donnee).type != INT)
2495: {
2496: liberation(s_etat_processus,
2497: s_objet_argument);
2498: free(argument_majuscule);
2499:
2500: (*s_etat_processus).erreur_execution =
2501: d_ex_erreur_parametre_fichier;
2502: return;
2503: }
2504:
2505: if (options[d_RECEIVING_TIMEOUT] == 'Y')
2506: {
2507: liberation(s_etat_processus,
2508: s_objet_argument);
2509: free(argument_majuscule);
2510:
2511: (*s_etat_processus).erreur_execution =
2512: d_ex_erreur_parametre_fichier;
2513: return;
2514: }
2515:
2516: options[d_RECEIVING_TIMEOUT] = 'Y';
2517:
2518: timeout_reception = (int) (*((integer8 *)
2519: (*(*l_element_courant_sous_objet)
2520: .donnee).objet));
2521: }
2522: else if (strcmp(argument_majuscule,
2523: "SENDING TIMEOUT") == 0)
2524: {
2525: if ((*(*l_element_courant_sous_objet)
2526: .donnee).type != INT)
2527: {
2528: liberation(s_etat_processus,
2529: s_objet_argument);
2530: free(argument_majuscule);
2531:
2532: (*s_etat_processus).erreur_execution =
2533: d_ex_erreur_parametre_fichier;
2534: return;
2535: }
2536:
2537: if (options[d_SENDING_TIMEOUT] == 'Y')
2538: {
2539: liberation(s_etat_processus,
2540: s_objet_argument);
2541: free(argument_majuscule);
2542:
2543: (*s_etat_processus).erreur_execution =
2544: d_ex_erreur_parametre_fichier;
2545: return;
2546: }
2547:
2548: options[d_SENDING_TIMEOUT] = 'Y';
2549:
2550: timeout_emission = (int) (*((integer8 *)
2551: (*(*l_element_courant_sous_objet)
2552: .donnee).objet));
2553: }
2554: else
2555: {
2556: liberation(s_etat_processus, s_objet_argument);
2557: free(argument_majuscule);
2558:
2559: (*s_etat_processus).erreur_execution =
2560: d_ex_erreur_parametre_fichier;
2561: return;
2562: }
2563:
2564: free(argument_majuscule);
2565: }
2566: else
2567: {
2568: liberation(s_etat_processus, s_objet_argument);
2569: free(argument_majuscule);
2570:
2571: (*s_etat_processus).erreur_execution =
2572: d_ex_erreur_parametre_fichier;
2573: return;
2574: }
2575: }
2576: else
2577: {
2578: liberation(s_etat_processus, s_objet_argument);
2579: (*s_etat_processus).erreur_execution =
2580: d_ex_erreur_parametre_fichier;
2581:
2582: return;
2583: }
2584: }
2585: else
2586: {
2587: liberation(s_etat_processus, s_objet_argument);
2588: (*s_etat_processus).erreur_execution =
2589: d_ex_erreur_parametre_fichier;
2590:
2591: return;
2592: }
2593: }
2594: else
2595: {
2596: liberation(s_etat_processus, s_objet_argument);
2597:
2598: (*s_etat_processus).erreur_execution =
2599: d_ex_erreur_parametre_fichier;
2600: return;
2601: }
2602:
2603: l_element_courant = (*l_element_courant).suivant;
2604: }
2605:
2606: if (type_arguments == 'F')
2607: {
2608: /*
2609: * Traitement des fichiers
2610: */
2611:
2612: /*
2613: * Vérification de la cohérence et comportement par défaut
2614: */
2615:
2616: if (type_ouverture == ' ')
2617: {
2618: type_ouverture = 'U';
2619: }
2620:
2621: if (type_acces == ' ')
2622: {
2623: type_acces = 'S';
2624: }
2625:
2626: if (format == ' ')
2627: {
2628: format = 'N';
2629: }
2630:
2631: if (protection == ' ')
2632: {
2633: protection = 'N';
2634: }
2635:
2636: if ((type_ouverture == 'S') && (protection != 'N'))
2637: {
2638: liberation(s_etat_processus, s_objet_argument);
2639:
2640: (*s_etat_processus).erreur_execution =
2641: d_ex_erreur_parametre_fichier;
2642: return;
2643: }
2644:
2645: if ((type_ouverture != 'S') && (nom == NULL))
2646: {
2647: liberation(s_etat_processus, s_objet_argument);
2648:
2649: (*s_etat_processus).erreur_execution =
2650: d_ex_erreur_parametre_fichier;
2651: return;
2652: }
2653:
2654: if (((type_acces != 'I') && (position_clef != 0)) ||
2655: ((type_acces == 'I') && (position_clef == 0) &&
2656: ((type_ouverture == 'N') || (type_ouverture == 'R') ||
2657: (type_ouverture == 'S'))))
2658: {
2659: liberation(s_etat_processus, s_objet_argument);
2660:
2661: (*s_etat_processus).erreur_execution =
2662: d_ex_erreur_parametre_fichier;
2663: return;
2664: }
2665:
2666: if ((s_objet_resultat = allocation(s_etat_processus, FCH))
2667: == NULL)
2668: {
2669: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2670: return;
2671: }
2672:
2673: if (nom == NULL)
2674: {
2675: if ((nom_temporaire = creation_nom_fichier(s_etat_processus,
2676: (*s_etat_processus).chemin_fichiers_temporaires))
2677: == NULL)
2678: {
2679: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
2680: return;
2681: }
2682:
2683: if ((nom = malloc((strlen(nom_temporaire)
2684: + 5) * sizeof(unsigned char))) == NULL)
2685: {
2686: (*s_etat_processus).erreur_systeme =
2687: d_es_allocation_memoire;
2688: return;
2689: }
2690:
2691: sprintf(nom, "%s.rpl", nom_temporaire);
2692: free(nom_temporaire);
2693: }
2694: else
2695: {
2696: if ((nom = transliteration(s_etat_processus, nom,
2697: d_locale, "UTF-8")) == NULL)
2698: {
2699: liberation(s_etat_processus, s_objet_argument);
2700: liberation(s_etat_processus, s_objet_resultat);
2701: return;
2702: }
2703: }
2704:
2705: /*
2706: * Ouverture du fichier
2707: */
2708:
2709: (*((struct_fichier *) (*s_objet_resultat).objet))
2710: .nom = NULL;
2711: (*((struct_fichier *) (*s_objet_resultat).objet))
2712: .acces = type_acces;
2713: (*((struct_fichier *) (*s_objet_resultat).objet))
2714: .binaire = format;
2715: (*((struct_fichier *) (*s_objet_resultat).objet))
2716: .ouverture = type_ouverture;
2717: (*((struct_fichier *) (*s_objet_resultat).objet)).pid
2718: = getpid();
2719: (*((struct_fichier *) (*s_objet_resultat).objet)).tid
2720: = pthread_self();
2721:
2722: if (((*((struct_fichier *) (*s_objet_resultat).objet)).format =
2723: allocation(s_etat_processus, LST)) == NULL)
2724: {
2725: free(nom);
2726:
2727: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2728: return;
2729: }
2730:
2731: (*(*((struct_fichier *) (*s_objet_resultat).objet))
2732: .format).objet = NULL;
2733:
2734: descripteur = NULL;
2735:
2736: switch(type_ouverture)
2737: {
2738: case 'N' :
2739: {
2740: erreur = caracteristiques_fichier(s_etat_processus,
2741: nom, &existence, &ouverture, &unite);
2742:
2743: if ((erreur != 0) || (unite != 0))
2744: {
2745: free(nom);
2746:
2747: liberation(s_etat_processus, s_objet_argument);
2748: liberation(s_etat_processus, s_objet_resultat);
2749:
2750: (*s_etat_processus).erreur_execution =
2751: d_ex_erreur_acces_fichier;
2752: return;
2753: }
2754:
2755: if (type_acces == 'S')
2756: {
2757: if ((descripteur = fopen(nom, "w+")) == NULL)
2758: {
2759: free(nom);
2760:
2761: liberation(s_etat_processus, s_objet_argument);
2762: liberation(s_etat_processus, s_objet_resultat);
2763:
2764: (*s_etat_processus).erreur_execution =
2765: d_ex_erreur_acces_fichier;
2766: return;
2767: }
2768: }
2769: else
2770: {
2771: // Si le fichier existe, on le supprime.
2772:
2773: if (unlink(nom) != 0)
2774: {
2775: free(nom);
2776:
2777: liberation(s_etat_processus, s_objet_argument);
2778: liberation(s_etat_processus, s_objet_resultat);
2779:
2780: (*s_etat_processus).erreur_execution =
2781: d_ex_erreur_acces_fichier;
2782: return;
2783: }
2784:
2785: if (sqlite3_open_v2(nom, &sqlite,
2786: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
2787: NULL) != SQLITE_OK)
2788: {
2789: free(nom);
2790:
2791: liberation(s_etat_processus, s_objet_argument);
2792: liberation(s_etat_processus, s_objet_resultat);
2793:
2794: (*s_etat_processus).erreur_execution =
2795: d_ex_erreur_acces_fichier;
2796: return;
2797: }
2798:
2799: if ((descripteur = fopen(nom, "a+")) == NULL)
2800: {
2801: free(nom);
2802:
2803: liberation(s_etat_processus, s_objet_argument);
2804: liberation(s_etat_processus, s_objet_resultat);
2805:
2806: (*s_etat_processus).erreur_execution =
2807: d_ex_erreur_acces_fichier;
2808: return;
2809: }
2810:
2811: if (type_acces == 'D')
2812: {
2813: if (initialisation_fichier_acces_direct(
2814: s_etat_processus, sqlite,
2815: (format == 'N') ? d_faux : d_vrai)
2816: != d_absence_erreur)
2817: {
2818: free(nom);
2819:
2820: liberation(s_etat_processus, s_objet_argument);
2821: liberation(s_etat_processus, s_objet_resultat);
2822:
2823: return;
2824: }
2825: }
2826: else
2827: {
2828: if (position_clef == 0)
2829: {
2830: free(nom);
2831:
2832: liberation(s_etat_processus, s_objet_argument);
2833: liberation(s_etat_processus, s_objet_resultat);
2834:
2835: (*s_etat_processus).erreur_execution =
2836: d_ex_erreur_parametre_fichier;
2837: return;
2838: }
2839:
2840: if (initialisation_fichier_acces_indexe(
2841: s_etat_processus, sqlite, position_clef,
2842: (format == 'N') ? d_faux : d_vrai)
2843: != d_absence_erreur)
2844: {
2845: free(nom);
2846:
2847: liberation(s_etat_processus, s_objet_argument);
2848: liberation(s_etat_processus, s_objet_resultat);
2849:
2850: return;
2851: }
2852: }
2853: }
2854:
2855: break;
2856: }
2857:
2858: case 'O' :
2859: {
2860: erreur = caracteristiques_fichier(s_etat_processus, nom,
2861: &existence, &ouverture, &unite);
2862:
2863: if ((erreur != d_absence_erreur) || (existence == d_faux))
2864: {
2865: free(nom);
2866:
2867: liberation(s_etat_processus, s_objet_argument);
2868: liberation(s_etat_processus, s_objet_resultat);
2869:
2870: (*s_etat_processus).erreur_execution =
2871: d_ex_erreur_acces_fichier;
2872: return;
2873: }
2874:
2875: if (type_acces == 'S')
2876: {
2877: if ((descripteur = fopen(nom, "r+")) == NULL)
2878: {
2879: free(nom);
2880:
2881: liberation(s_etat_processus, s_objet_argument);
2882: liberation(s_etat_processus, s_objet_resultat);
2883:
2884: (*s_etat_processus).erreur_execution =
2885: d_ex_erreur_acces_fichier;
2886: return;
2887: }
2888: }
2889: else
2890: {
2891: if (sqlite3_open_v2(nom, &sqlite,
2892: SQLITE_OPEN_READWRITE,
2893: NULL) != SQLITE_OK)
2894: {
2895: free(nom);
2896:
2897: liberation(s_etat_processus, s_objet_argument);
2898: liberation(s_etat_processus, s_objet_resultat);
2899:
2900: (*s_etat_processus).erreur_execution =
2901: d_ex_erreur_acces_fichier;
2902: return;
2903: }
2904:
2905: if ((descripteur = fopen(nom, "a+")) == NULL)
2906: {
2907: free(nom);
2908:
2909: liberation(s_etat_processus, s_objet_argument);
2910: liberation(s_etat_processus, s_objet_resultat);
2911:
2912: (*s_etat_processus).erreur_execution =
2913: d_ex_erreur_acces_fichier;
2914: return;
2915: }
2916: }
2917:
2918: break;
2919: }
2920:
2921: case 'R' :
2922: {
2923: erreur = caracteristiques_fichier(s_etat_processus,
2924: nom, &existence, &ouverture, &unite);
2925:
2926: if ((erreur != d_absence_erreur) || (existence == d_faux))
2927: {
2928: free(nom);
2929:
2930: liberation(s_etat_processus, s_objet_argument);
2931: liberation(s_etat_processus, s_objet_resultat);
2932:
2933: (*s_etat_processus).erreur_execution =
2934: d_ex_erreur_acces_fichier;
2935: return;
2936: }
2937:
2938: /* Test du verrou */
2939:
2940: if ((descripteur = fopen(nom, "r")) == NULL)
2941: {
2942: free(nom);
2943:
2944: liberation(s_etat_processus, s_objet_argument);
2945: liberation(s_etat_processus, s_objet_resultat);
2946:
2947: (*s_etat_processus).erreur_execution =
2948: d_ex_erreur_acces_fichier;
2949: return;
2950: }
2951:
2952: lock.l_type = F_WRLCK;
2953: lock.l_whence = SEEK_SET;
2954: lock.l_start = 0;
2955: lock.l_len = 0;
2956: lock.l_pid = getpid();
2957:
2958: if (fcntl(fileno(descripteur), F_GETLK, &lock) == -1)
2959: {
2960: free(nom);
2961:
2962: if (fclose(descripteur) != 0)
2963: {
2964: liberation(s_etat_processus, s_objet_argument);
2965: liberation(s_etat_processus, s_objet_resultat);
2966:
2967: (*s_etat_processus).erreur_systeme =
2968: d_es_erreur_fichier;
2969: return;
2970: }
2971:
2972: liberation(s_etat_processus, s_objet_argument);
2973: liberation(s_etat_processus, s_objet_resultat);
2974:
2975: (*s_etat_processus).erreur_systeme =
2976: d_es_erreur_fichier;
2977: return;
2978: }
2979:
2980: if (lock.l_type != F_UNLCK)
2981: {
2982: free(nom);
2983:
2984: if (fclose(descripteur) != 0)
2985: {
2986: liberation(s_etat_processus, s_objet_argument);
2987: liberation(s_etat_processus, s_objet_resultat);
2988:
2989: (*s_etat_processus).erreur_systeme =
2990: d_es_erreur_fichier;
2991: return;
2992: }
2993:
2994: liberation(s_etat_processus, s_objet_argument);
2995: liberation(s_etat_processus, s_objet_resultat);
2996:
2997: (*s_etat_processus).erreur_execution =
2998: d_ex_fichier_verrouille;
2999: return;
3000: }
3001:
3002: if (fclose(descripteur) != 0)
3003: {
3004: free(nom);
3005:
3006: liberation(s_etat_processus, s_objet_argument);
3007: liberation(s_etat_processus, s_objet_resultat);
3008:
3009: (*s_etat_processus).erreur_systeme =
3010: d_es_erreur_fichier;
3011: return;
3012: }
3013:
3014: if (type_acces == 'S')
3015: {
3016: if ((descripteur = fopen(nom, "w+")) == NULL)
3017: {
3018: free(nom);
3019:
3020: liberation(s_etat_processus, s_objet_argument);
3021: liberation(s_etat_processus, s_objet_resultat);
3022:
3023: (*s_etat_processus).erreur_execution =
3024: d_ex_erreur_acces_fichier;
3025: return;
3026: }
3027: }
3028: else
3029: {
3030: if (sqlite3_open_v2(nom, &sqlite,
3031: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
3032: NULL) != SQLITE_OK)
3033: {
3034: free(nom);
3035:
3036: liberation(s_etat_processus, s_objet_argument);
3037: liberation(s_etat_processus, s_objet_resultat);
3038:
3039: (*s_etat_processus).erreur_execution =
3040: d_ex_erreur_acces_fichier;
3041: return;
3042: }
3043:
3044: // Ouverture du fichier pour pouvoir gérer les
3045: // verrous à la façon des fichiers séquentiels.
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);
3053:
3054: (*s_etat_processus).erreur_execution =
3055: d_ex_erreur_acces_fichier;
3056: return;
3057: }
3058:
3059: if (type_acces == 'D')
3060: {
3061: if (initialisation_fichier_acces_direct(
3062: s_etat_processus, sqlite,
3063: (format == 'N') ? d_faux : d_vrai)
3064: != d_absence_erreur)
3065: {
3066: free(nom);
3067:
3068: liberation(s_etat_processus, s_objet_argument);
3069: liberation(s_etat_processus, s_objet_resultat);
3070:
3071: return;
3072: }
3073: }
3074: else
3075: {
3076: if (position_clef == 0)
3077: {
3078: free(nom);
3079:
3080: liberation(s_etat_processus, s_objet_argument);
3081: liberation(s_etat_processus, s_objet_resultat);
3082:
3083: (*s_etat_processus).erreur_execution =
3084: d_ex_erreur_parametre_fichier;
3085: return;
3086: }
3087:
3088: if (initialisation_fichier_acces_indexe(
3089: s_etat_processus, sqlite, position_clef,
3090: (format == 'N') ? d_faux : d_vrai)
3091: != d_absence_erreur)
3092: {
3093: free(nom);
3094:
3095: liberation(s_etat_processus, s_objet_argument);
3096: liberation(s_etat_processus, s_objet_resultat);
3097:
3098: return;
3099: }
3100: }
3101: }
3102:
3103: break;
3104: }
3105:
3106: case 'U' :
3107: {
3108: erreur = caracteristiques_fichier(s_etat_processus,
3109: nom, &existence, &ouverture, &unite);
3110:
3111: if (erreur == d_erreur)
3112: {
3113: free(nom);
3114:
3115: liberation(s_etat_processus, s_objet_argument);
3116: liberation(s_etat_processus, s_objet_resultat);
3117:
3118: (*s_etat_processus).erreur_execution =
3119: d_ex_erreur_acces_fichier;
3120: return;
3121: }
3122:
3123: if (existence == d_faux)
3124: {
3125: if (type_acces == 'S')
3126: {
3127: if ((descripteur = fopen(nom, "w+")) == NULL)
3128: {
3129: free(nom);
3130:
3131: liberation(s_etat_processus, s_objet_argument);
3132: liberation(s_etat_processus, s_objet_resultat);
3133:
3134: (*s_etat_processus).erreur_execution =
3135: d_ex_erreur_acces_fichier;
3136: return;
3137: }
3138: }
3139: else
3140: {
3141: if (sqlite3_open_v2(nom, &sqlite,
3142: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
3143: NULL) != SQLITE_OK)
3144: {
3145: free(nom);
3146:
3147: liberation(s_etat_processus, s_objet_argument);
3148: liberation(s_etat_processus, s_objet_resultat);
3149:
3150: (*s_etat_processus).erreur_execution =
3151: d_ex_erreur_acces_fichier;
3152: return;
3153: }
3154:
3155: if ((descripteur = fopen(nom, "a+")) == NULL)
3156: {
3157: free(nom);
3158:
3159: liberation(s_etat_processus, s_objet_argument);
3160: liberation(s_etat_processus, s_objet_resultat);
3161:
3162: (*s_etat_processus).erreur_execution =
3163: d_ex_erreur_acces_fichier;
3164: return;
3165: }
3166:
3167: if (type_acces == 'D')
3168: {
3169: if (initialisation_fichier_acces_direct(
3170: s_etat_processus, sqlite,
3171: (format == 'N') ? d_faux : d_vrai)
3172: != d_absence_erreur)
3173: {
3174: free(nom);
3175:
3176: liberation(s_etat_processus,
3177: s_objet_argument);
3178: liberation(s_etat_processus,
3179: s_objet_resultat);
3180:
3181: return;
3182: }
3183: }
3184: else
3185: {
3186: if (position_clef == 0)
3187: {
3188: free(nom);
3189:
3190: liberation(s_etat_processus,
3191: s_objet_argument);
3192: liberation(s_etat_processus,
3193: s_objet_resultat);
3194:
3195: (*s_etat_processus).erreur_execution =
3196: d_ex_erreur_parametre_fichier;
3197: return;
3198: }
3199:
3200: if (initialisation_fichier_acces_indexe(
3201: s_etat_processus, sqlite, position_clef,
3202: (format == 'N') ? d_faux : d_vrai)
3203: != d_absence_erreur)
3204: {
3205: free(nom);
3206:
3207: liberation(s_etat_processus,
3208: s_objet_argument);
3209: liberation(s_etat_processus,
3210: s_objet_resultat);
3211:
3212: return;
3213: }
3214: }
3215: }
3216: }
3217: else
3218: {
3219: if (type_acces == 'S')
3220: {
3221: if ((descripteur = fopen(nom, "r+")) == NULL)
3222: {
3223: free(nom);
3224:
3225: liberation(s_etat_processus, s_objet_argument);
3226: liberation(s_etat_processus, s_objet_resultat);
3227:
3228: (*s_etat_processus).erreur_execution =
3229: d_ex_erreur_acces_fichier;
3230: return;
3231: }
3232: }
3233: else
3234: {
3235: if (sqlite3_open_v2(nom, &sqlite,
3236: SQLITE_OPEN_READWRITE,
3237: NULL) != SQLITE_OK)
3238: {
3239: free(nom);
3240:
3241: liberation(s_etat_processus, s_objet_argument);
3242: liberation(s_etat_processus, s_objet_resultat);
3243:
3244: (*s_etat_processus).erreur_execution =
3245: d_ex_erreur_acces_fichier;
3246: return;
3247: }
3248:
3249: if ((descripteur = fopen(nom, "a+")) == NULL)
3250: {
3251: free(nom);
3252:
3253: liberation(s_etat_processus, s_objet_argument);
3254: liberation(s_etat_processus, s_objet_resultat);
3255:
3256: (*s_etat_processus).erreur_execution =
3257: d_ex_erreur_acces_fichier;
3258: return;
3259: }
3260: }
3261: }
3262:
3263: break;
3264: }
3265:
3266: case 'S' :
3267: {
3268: erreur = caracteristiques_fichier(s_etat_processus,
3269: nom, &existence, &ouverture, &unite);
3270:
3271: if ((erreur != d_absence_erreur) || (existence != d_faux))
3272: {
3273: free(nom);
3274:
3275: liberation(s_etat_processus, s_objet_argument);
3276: liberation(s_etat_processus, s_objet_resultat);
3277:
3278: (*s_etat_processus).erreur_execution =
3279: d_ex_erreur_acces_fichier;
3280: return;
3281: }
3282:
3283: if (type_acces == 'S')
3284: {
3285: if ((descripteur = fopen(nom, "w+")) == NULL)
3286: {
3287: free(nom);
3288:
3289: liberation(s_etat_processus, s_objet_argument);
3290: liberation(s_etat_processus, s_objet_resultat);
3291:
3292: (*s_etat_processus).erreur_execution =
3293: d_ex_erreur_acces_fichier;
3294: return;
3295: }
3296: }
3297: else
3298: {
3299: // Si le fichier existe, on le supprime.
3300:
3301: if (unlink(nom) != 0)
3302: {
3303: free(nom);
3304:
3305: liberation(s_etat_processus, s_objet_argument);
3306: liberation(s_etat_processus, s_objet_resultat);
3307:
3308: (*s_etat_processus).erreur_execution =
3309: d_ex_erreur_acces_fichier;
3310: return;
3311: }
3312:
3313: if (sqlite3_open_v2(nom, &sqlite,
3314: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
3315: NULL) != SQLITE_OK)
3316: {
3317: free(nom);
3318:
3319: liberation(s_etat_processus, s_objet_argument);
3320: liberation(s_etat_processus, s_objet_resultat);
3321:
3322: (*s_etat_processus).erreur_execution =
3323: d_ex_erreur_acces_fichier;
3324: return;
3325: }
3326:
3327: if ((descripteur = fopen(nom, "a+")) == NULL)
3328: {
3329: free(nom);
3330:
3331: liberation(s_etat_processus, s_objet_argument);
3332: liberation(s_etat_processus, s_objet_resultat);
3333:
3334: (*s_etat_processus).erreur_execution =
3335: d_ex_erreur_acces_fichier;
3336: return;
3337: }
3338:
3339: if (type_acces == 'D')
3340: {
3341: if (initialisation_fichier_acces_direct(
3342: s_etat_processus, sqlite,
3343: (format == 'N') ? d_faux : d_vrai)
3344: != d_absence_erreur)
3345: {
3346: free(nom);
3347:
3348: liberation(s_etat_processus, s_objet_argument);
3349: liberation(s_etat_processus, s_objet_resultat);
3350:
3351: return;
3352: }
3353: }
3354: else
3355: {
3356: if (position_clef == 0)
3357: {
3358: free(nom);
3359:
3360: liberation(s_etat_processus, s_objet_argument);
3361: liberation(s_etat_processus, s_objet_resultat);
3362:
3363: (*s_etat_processus).erreur_execution =
3364: d_ex_erreur_parametre_fichier;
3365: return;
3366: }
3367:
3368: if (initialisation_fichier_acces_indexe(
3369: s_etat_processus, sqlite, position_clef,
3370: (format == 'N') ? d_faux : d_vrai)
3371: != d_absence_erreur)
3372: {
3373: free(nom);
3374:
3375: liberation(s_etat_processus, s_objet_argument);
3376: liberation(s_etat_processus, s_objet_resultat);
3377:
3378: return;
3379: }
3380: }
3381: }
3382:
3383: break;
3384: }
3385:
3386: default:
3387: {
3388: BUG(1, printf("type_ouverture=%c\n", type_ouverture));
3389: return;
3390: }
3391: }
3392:
3393: if (((*((struct_fichier *) (*s_objet_resultat).objet)).nom =
3394: malloc((strlen(nom) + 1) *
3395: sizeof(unsigned char))) == NULL)
3396: {
3397: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3398: return;
3399: }
3400:
3401: strcpy((*((struct_fichier *) (*s_objet_resultat).objet)).nom, nom);
3402: liberation(s_etat_processus, s_objet_argument);
3403:
3404: (*((struct_fichier *) (*s_objet_resultat).objet)).protection =
3405: protection;
3406: (*((struct_fichier *) (*s_objet_resultat).objet)).position_clef =
3407: position_clef;
3408:
3409: rewind(descripteur);
3410:
3411: lock.l_type = F_WRLCK;
3412: lock.l_whence = SEEK_SET;
3413: lock.l_start = 0;
3414: lock.l_len = 0;
3415: lock.l_pid = getpid();
3416:
3417: if (fcntl(fileno(descripteur), F_GETLK, &lock) == -1)
3418: {
3419: if (fclose(descripteur) != 0)
3420: {
3421: liberation(s_etat_processus, s_objet_resultat);
3422:
3423: (*s_etat_processus).erreur_systeme =
3424: d_es_erreur_fichier;
3425: return;
3426: }
3427:
3428: liberation(s_etat_processus, s_objet_resultat);
3429:
3430: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
3431: return;
3432: }
3433:
3434: if (lock.l_type == F_UNLCK)
3435: {
3436: /*
3437: * Positionnement d'un verrou exclusif d'écriture par défaut
3438: */
3439:
3440: lock.l_type = F_RDLCK;
3441: lock.l_whence = SEEK_SET;
3442: lock.l_start = 0;
3443: lock.l_len = 0;
3444: lock.l_pid = getpid();
3445:
3446: if (fcntl(fileno(descripteur), F_SETLK, &lock) == -1)
3447: {
3448: if (fclose(descripteur) != 0)
3449: {
3450: liberation(s_etat_processus, s_objet_resultat);
3451:
3452: (*s_etat_processus).erreur_systeme =
3453: d_es_erreur_fichier;
3454: return;
3455: }
3456:
3457: liberation(s_etat_processus, s_objet_resultat);
3458:
3459: (*s_etat_processus).erreur_systeme =
3460: d_es_erreur_fichier;
3461: return;
3462: }
3463: }
3464: else
3465: {
3466: /*
3467: * Test de la cohérence du verrou avec l'option PROTECTION
3468: */
3469:
3470: if ((lock.l_type == F_RDLCK) && (protection != 'R'))
3471: {
3472: free(nom);
3473:
3474: if (fclose(descripteur) != 0)
3475: {
3476: liberation(s_etat_processus, s_objet_resultat);
3477:
3478: (*s_etat_processus).erreur_systeme =
3479: d_es_erreur_fichier;
3480: return;
3481: }
3482:
3483: liberation(s_etat_processus, s_objet_resultat);
3484:
3485: (*s_etat_processus).erreur_execution =
3486: d_ex_fichier_verrouille;
3487: return;
3488: }
3489: else if ((lock.l_type == F_WRLCK) && (protection != 'W'))
3490: {
3491: free(nom);
3492:
3493: if (fclose(descripteur) != 0)
3494: {
3495: liberation(s_etat_processus, s_objet_resultat);
3496:
3497: (*s_etat_processus).erreur_systeme =
3498: d_es_erreur_fichier;
3499: return;
3500: }
3501:
3502: liberation(s_etat_processus, s_objet_resultat);
3503:
3504: (*s_etat_processus).erreur_execution =
3505: d_ex_fichier_verrouille;
3506: return;
3507: }
3508: else
3509: {
3510: free(nom);
3511:
3512: if (fclose(descripteur) != 0)
3513: {
3514: liberation(s_etat_processus, s_objet_resultat);
3515:
3516: (*s_etat_processus).erreur_systeme =
3517: d_es_erreur_fichier;
3518: return;
3519: }
3520:
3521: liberation(s_etat_processus, s_objet_resultat);
3522:
3523: (*s_etat_processus).erreur_execution =
3524: d_ex_fichier_verrouille;
3525: return;
3526: }
3527: }
3528:
3529: /*
3530: * Gestion de la liste des fichiers ouverts
3531: */
3532:
3533: l_element_courant = (*s_etat_processus).s_fichiers;
3534:
3535: if (l_element_courant == NULL)
3536: {
3537: if (((*s_etat_processus).s_fichiers = malloc(sizeof(
3538: struct_liste_chainee))) == NULL)
3539: {
3540: (*s_etat_processus).erreur_systeme =
3541: d_es_allocation_memoire;
3542: return;
3543: }
3544:
3545: (*(*s_etat_processus).s_fichiers).suivant = NULL;
3546:
3547: if (((*(*s_etat_processus).s_fichiers).donnee =
3548: malloc(sizeof(struct_descripteur_fichier))) == NULL)
3549: {
3550: (*s_etat_processus).erreur_systeme =
3551: d_es_allocation_memoire;
3552: return;
3553: }
3554:
3555: l_element_courant = (*s_etat_processus).s_fichiers;
3556: prochain_descripteur = 0;
3557: }
3558: else
3559: {
3560: /*
3561: * Recherche du premier descripteur libre
3562: */
3563:
3564: if ((chaine_descripteurs = malloc(sizeof(unsigned char) *
3565: (ds_nombre_maximum_fichiers_ouverts + 1))) == NULL)
3566: {
3567: (*s_etat_processus).erreur_systeme =
3568: d_es_allocation_memoire;
3569: return;
3570: }
3571:
3572: for(pointeur = chaine_descripteurs, i = 0;
3573: i < ds_nombre_maximum_fichiers_ouverts;
3574: (*pointeur) = d_code_espace, pointeur++, i++);
3575: (*pointeur) = d_code_fin_chaine;
3576:
3577: do
3578: {
3579: chaine_descripteurs[(*((struct_descripteur_fichier *)
3580: (*l_element_courant).donnee)).identifiant] = '-';
3581: l_element_courant = (*l_element_courant).suivant;
3582: } while(l_element_courant != NULL);
3583:
3584: i = 0;
3585: pointeur = chaine_descripteurs;
3586:
3587: while(i < ds_nombre_maximum_fichiers_ouverts)
3588: {
3589: if ((*pointeur) == ' ')
3590: {
3591: break;
3592: }
3593:
3594: pointeur++;
3595: i++;
3596: }
3597:
3598: free(chaine_descripteurs);
3599:
3600: if (i == ds_nombre_maximum_fichiers_ouverts)
3601: {
3602: (*s_etat_processus).erreur_systeme =
3603: d_es_nombre_max_descripteurs;
3604: return;
3605: }
3606:
3607: prochain_descripteur = i;
3608:
3609: /*
3610: * Ajout d'un élément à la fin de la liste chaînée
3611: */
3612:
3613: l_element_courant = (*s_etat_processus).s_fichiers;
3614: while((*l_element_courant).suivant != NULL)
3615: {
3616: l_element_courant = (*l_element_courant).suivant;
3617: }
3618:
3619: if (((*l_element_courant).suivant =
3620: allocation_maillon(s_etat_processus)) == NULL)
3621: {
3622: (*s_etat_processus).erreur_systeme =
3623: d_es_allocation_memoire;
3624: return;
3625: }
3626:
3627: l_element_courant = (*l_element_courant).suivant;
3628: (*l_element_courant).suivant = NULL;
3629:
3630: if (((*l_element_courant).donnee =
3631: malloc(sizeof(struct_descripteur_fichier))) == NULL)
3632: {
3633: (*s_etat_processus).erreur_systeme =
3634: d_es_allocation_memoire;
3635: return;
3636: }
3637: }
3638:
3639: (*((struct_fichier *) (*s_objet_resultat).objet)).descripteur
3640: = prochain_descripteur;
3641: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
3642: .identifiant = prochain_descripteur;
3643:
3644: if (type_acces == 'S')
3645: {
3646: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
3647: .type = 'C';
3648: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
3649: .descripteur_c = descripteur;
3650: }
3651: else
3652: {
3653: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
3654: .type = 'S';
3655: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
3656: .descripteur_c = descripteur;
3657: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
3658: .descripteur_sqlite = sqlite;
3659: }
3660:
3661: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
3662: .pid = getpid();
3663: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
3664: .tid = pthread_self();
3665: (*((struct_descripteur_fichier *) (*l_element_courant).donnee))
3666: .effacement = (type_ouverture == 'S') ? 'Y' : 'N';
3667:
3668: (*((struct_descripteur_fichier *) (*l_element_courant)
3669: .donnee)).nom = nom;
3670: }
3671: else if (type_arguments == 'S')
3672: {
3673: /*
3674: * Traitement des sockets
3675: */
3676:
3677:
3678: inline logical1 options_socket()
3679: {
3680: /*
3681: * Options des sockets
3682: */
3683:
3684: # define WARNING(message) \
3685: if ((*s_etat_processus).langue != 'F') \
3686: printf("+++Warning : %s unavailable on host system\n", \
3687: message); \
3688: else \
3689: printf("+++Attention : %s non disponible sur le système " \
3690: "hôte\n", message)
3691:
3692: if (options[d_BIND_TO_DEVICE] == 'Y')
3693: {
3694: # ifdef SO_BINDTODEVICE
3695: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
3696: .objet)).socket, SOL_SOCKET, SO_BINDTODEVICE,
3697: peripherique, strlen(peripherique)) != 0)
3698: {
3699: liberation(s_etat_processus, s_objet_argument);
3700: liberation(s_etat_processus, s_objet_resultat);
3701:
3702: (*s_etat_processus).erreur_execution =
3703: d_ex_erreur_parametre_fichier;
3704: return(d_erreur);
3705: }
3706: # else
3707: WARNING("BIND TO DEVICE");
3708: # endif
3709: }
3710:
3711: if (options[d_BROADCAST] == 'Y')
3712: {
3713: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
3714: .objet)).socket, SOL_SOCKET, SO_BROADCAST,
3715: &drapeau, sizeof(drapeau)) != 0)
3716: {
3717: liberation(s_etat_processus, s_objet_argument);
3718: liberation(s_etat_processus, s_objet_resultat);
3719:
3720: (*s_etat_processus).erreur_execution =
3721: d_ex_erreur_parametre_fichier;
3722: return(d_erreur);
3723: }
3724: }
3725:
3726: if (options[d_DONT_ROUTE] == 'Y')
3727: {
3728: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
3729: .objet)).socket, SOL_SOCKET, SO_DONTROUTE,
3730: &drapeau, sizeof(drapeau)) != 0)
3731: {
3732: liberation(s_etat_processus, s_objet_argument);
3733: liberation(s_etat_processus, s_objet_resultat);
3734:
3735: (*s_etat_processus).erreur_execution =
3736: d_ex_erreur_parametre_fichier;
3737: return(d_erreur);
3738: }
3739: }
3740:
3741: if (options[d_KEEP_ALIVE] == 'Y')
3742: {
3743: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
3744: .objet)).socket, SOL_SOCKET, SO_KEEPALIVE,
3745: &drapeau, sizeof(drapeau)) != 0)
3746: {
3747: liberation(s_etat_processus, s_objet_argument);
3748: liberation(s_etat_processus, s_objet_resultat);
3749:
3750: (*s_etat_processus).erreur_execution =
3751: d_ex_erreur_parametre_fichier;
3752: return(d_erreur);
3753: }
3754: }
3755:
3756: if (options[d_PRIORITY] == 'Y')
3757: {
3758: # ifdef SO_PRIORITY
3759: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
3760: .objet)).socket, SOL_SOCKET, SO_PRIORITY,
3761: &priorite, sizeof(priorite)) != 0)
3762: {
3763: liberation(s_etat_processus, s_objet_argument);
3764: liberation(s_etat_processus, s_objet_resultat);
3765:
3766: (*s_etat_processus).erreur_execution =
3767: d_ex_erreur_parametre_fichier;
3768: return(d_erreur);
3769: }
3770: # else
3771: WARNING("PRIORITY");
3772: # endif
3773: }
3774:
3775: if (options[d_RECEIVE_BUFFER] == 'Y')
3776: {
3777: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
3778: .objet)).socket, SOL_SOCKET, SO_RCVBUF,
3779: &buffer_reception, sizeof(buffer_reception)) != 0)
3780: {
3781: liberation(s_etat_processus, s_objet_argument);
3782: liberation(s_etat_processus, s_objet_resultat);
3783:
3784: (*s_etat_processus).erreur_execution =
3785: d_ex_erreur_parametre_fichier;
3786: return(d_erreur);
3787: }
3788: }
3789:
3790: if (options[d_FORCE_RECEIVE_BUFFER] == 'Y')
3791: {
3792: # ifdef SO_RCVBUFFORCE
3793: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
3794: .objet)).socket, SOL_SOCKET, SO_RCVBUFFORCE,
3795: &buffer_reception, sizeof(buffer_reception))
3796: != 0)
3797: {
3798: liberation(s_etat_processus, s_objet_argument);
3799: liberation(s_etat_processus, s_objet_resultat);
3800:
3801: (*s_etat_processus).erreur_execution =
3802: d_ex_erreur_parametre_fichier;
3803: return(d_erreur);
3804: }
3805: # else
3806: WARNING("FORCE_RECEIVE_BUFFER");
3807: # endif
3808: }
3809:
3810: if (options[d_SEND_BUFFER] == 'Y')
3811: {
3812: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
3813: .objet)).socket, SOL_SOCKET, SO_SNDBUF,
3814: &buffer_emission, sizeof(buffer_emission)) != 0)
3815: {
3816: liberation(s_etat_processus, s_objet_argument);
3817: liberation(s_etat_processus, s_objet_resultat);
3818:
3819: (*s_etat_processus).erreur_execution =
3820: d_ex_erreur_parametre_fichier;
3821: return(d_erreur);
3822: }
3823: }
3824:
3825: if (options[d_FORCE_SEND_BUFFER] == 'Y')
3826: {
3827: # ifdef SO_SNDBUFFORCE
3828: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
3829: .objet)).socket, SOL_SOCKET, SO_SNDBUFFORCE,
3830: &buffer_emission, sizeof(buffer_emission)) != 0)
3831: {
3832: liberation(s_etat_processus, s_objet_argument);
3833: liberation(s_etat_processus, s_objet_resultat);
3834:
3835: (*s_etat_processus).erreur_execution =
3836: d_ex_erreur_parametre_fichier;
3837: return(d_erreur);
3838: }
3839: # else
3840: WARNING("FORCE_SEND_BUFFER");
3841: # endif
3842: }
3843:
3844: if (options[d_RECEIVING_TIMEOUT] == 'Y')
3845: {
3846: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
3847: .objet)).socket, SOL_SOCKET, SO_RCVTIMEO,
3848: &timeout_reception, sizeof(timeout_reception)) != 0)
3849: {
3850: liberation(s_etat_processus, s_objet_argument);
3851: liberation(s_etat_processus, s_objet_resultat);
3852:
3853: (*s_etat_processus).erreur_execution =
3854: d_ex_erreur_parametre_fichier;
3855: return(d_erreur);
3856: }
3857: }
3858:
3859: if (options[d_SENDING_TIMEOUT] == 'Y')
3860: {
3861: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
3862: .objet)).socket, SOL_SOCKET, SO_SNDTIMEO,
3863: &timeout_emission, sizeof(timeout_emission)) != 0)
3864: {
3865: liberation(s_etat_processus, s_objet_argument);
3866: liberation(s_etat_processus, s_objet_resultat);
3867:
3868: (*s_etat_processus).erreur_execution =
3869: d_ex_erreur_parametre_fichier;
3870: return(d_erreur);
3871: }
3872: }
3873:
3874: if (options[d_REUSE_ADDRESS] == 'Y')
3875: {
3876: if (setsockopt((*((struct_socket *) (*s_objet_resultat)
3877: .objet)).socket, SOL_SOCKET, SO_REUSEADDR,
3878: &drapeau, sizeof(drapeau)) != 0)
3879: {
3880: liberation(s_etat_processus, s_objet_argument);
3881: liberation(s_etat_processus, s_objet_resultat);
3882:
3883: (*s_etat_processus).erreur_execution =
3884: d_ex_erreur_parametre_fichier;
3885: return(d_erreur);
3886: }
3887: }
3888:
3889: return(d_absence_erreur);
3890: #undef WARNING
3891: }
3892:
3893: /*
3894: * Vérification de la cohérence des arguments et traitement
3895: * des valeurs par défaut.
3896: */
3897:
3898: if (format == ' ')
3899: {
3900: format = 'N';
3901: }
3902:
3903: if (protection == ' ')
3904: {
3905: protection = 'N';
3906: }
3907:
3908: if (type_domaine == ' ')
3909: {
3910: type_domaine = 'L';
3911: }
3912:
3913: if (type_socket == ' ')
3914: {
3915: type_socket = 'S';
3916: type = SOCK_STREAM;
3917: }
3918:
3919: if (nom != NULL)
3920: {
3921: if (strcmp(protocole, "") == 0)
3922: {
3923: strcpy(protocole, "UNIX");
3924: }
3925: }
3926: else
3927: {
3928: if (strcmp(protocole, "") == 0)
3929: {
3930: strcpy(protocole, "IPV4");
3931: }
3932: }
3933:
3934: if ((nom != NULL) && (hote != NULL))
3935: {
3936: liberation(s_etat_processus, s_objet_argument);
3937:
3938: (*s_etat_processus).erreur_execution =
3939: d_ex_erreur_parametre_fichier;
3940: return;
3941: }
3942:
3943: if ((nom != NULL) && (strcmp(protocole, "UNIX") != 0))
3944: {
3945: liberation(s_etat_processus, s_objet_argument);
3946:
3947: (*s_etat_processus).erreur_execution =
3948: d_ex_erreur_parametre_fichier;
3949: return;
3950: }
3951:
3952: if ((hote != NULL) && (strcmp(protocole, "UNIX") == 0))
3953: {
3954: liberation(s_etat_processus, s_objet_argument);
3955:
3956: (*s_etat_processus).erreur_execution =
3957: d_ex_erreur_parametre_fichier;
3958: return;
3959: }
3960:
3961: if ((nom != NULL) && (type_domaine == 'F') && (type_adresse != ' '))
3962: {
3963: liberation(s_etat_processus, s_objet_argument);
3964:
3965: (*s_etat_processus).erreur_execution =
3966: d_ex_erreur_parametre_fichier;
3967: return;
3968: }
3969:
3970: if ((presence_port == d_vrai) && (nom != NULL))
3971: {
3972: liberation(s_etat_processus, s_objet_argument);
3973:
3974: (*s_etat_processus).erreur_execution =
3975: d_ex_erreur_parametre_fichier;
3976: return;
3977: }
3978:
3979: if (((strcmp(protocole, "IPV4") == 0) && (type_adresse == '6')) ||
3980: ((strcmp(protocole, "IPV6") == 0) && (type_adresse == '4')))
3981: {
3982: liberation(s_etat_processus, s_objet_argument);
3983:
3984: (*s_etat_processus).erreur_execution =
3985: d_ex_erreur_parametre_fichier;
3986: return;
3987: }
3988:
3989: if ((nombre_maximal_connexions != 0) && ((type_socket != 'S') &&
3990: (type_socket != 'Q')))
3991: {
3992: liberation(s_etat_processus, s_objet_argument);
3993:
3994: (*s_etat_processus).erreur_execution =
3995: d_ex_erreur_parametre_fichier;
3996: return;
3997: }
3998:
3999: if (nombre_maximal_connexions == 0)
4000: {
4001: nombre_maximal_connexions = 1;
4002: }
4003:
4004: if (protocole_socket == NULL)
4005: {
4006: protocole_numerique = 0;
4007: }
4008: else
4009: {
4010: for(i = 0; i < strlen(protocole_socket); i++)
4011: {
4012: if ((protocole_socket[i] >= 'A') &&
4013: (protocole_socket[i] <= 'Z'))
4014: {
4015: protocole_socket[i] += 'a' - 'A';
4016: }
4017: }
4018:
4019: if (strcmp(protocole_socket, "ipv4") == 0)
4020: {
4021: protocole_socket[2] = d_code_fin_chaine;
4022: }
4023:
4024: if ((s_protocole = getprotobyname(protocole_socket)) == NULL)
4025: {
4026: liberation(s_etat_processus, s_objet_argument);
4027:
4028: (*s_etat_processus).erreur_execution =
4029: d_ex_erreur_parametre_fichier;
4030: return;
4031: }
4032:
4033: protocole_numerique = (*s_protocole).p_proto;
4034: }
4035:
4036: if ((s_objet_resultat = allocation(s_etat_processus, SCK))
4037: == NULL)
4038: {
4039: (*s_etat_processus).erreur_systeme =
4040: d_es_allocation_memoire;
4041: return;
4042: }
4043:
4044: if (((*((struct_socket *) (*s_objet_resultat).objet)).format =
4045: allocation(s_etat_processus, LST)) == NULL)
4046: {
4047: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
4048: return;
4049: }
4050:
4051: (*((struct_socket *) (*s_objet_resultat).objet)).protection
4052: = protection;
4053: (*(*((struct_socket *) (*s_objet_resultat).objet))
4054: .format).objet = NULL;
4055:
4056: switch(type_socket)
4057: {
4058: case 'S' :
4059: type = SOCK_STREAM;
4060: strcpy((*((struct_socket *) (*s_objet_resultat).objet)).
4061: type, "STREAM");
4062: break;
4063:
4064: case 'D' :
4065: type = SOCK_DGRAM;
4066: strcpy((*((struct_socket *) (*s_objet_resultat).objet)).
4067: type, "DATAGRAM");
4068: break;
4069:
4070: case 'Q' :
4071: strcpy((*((struct_socket *) (*s_objet_resultat).objet)).
4072: type, "SEQUENTIAL DATAGRAM");
4073: type = SOCK_SEQPACKET;
4074: break;
4075:
4076: case 'R' :
4077: type = SOCK_RAW;
4078: strcpy((*((struct_socket *) (*s_objet_resultat).objet)).
4079: type, "RAW");
4080: break;
4081:
4082: case 'M' :
4083: type = SOCK_RDM;
4084: strcpy((*((struct_socket *) (*s_objet_resultat).objet)).
4085: type, "ROBUST DATAGRAM");
4086: break;
4087:
4088: default :
4089: BUG(1, printf("type_socket=%c\n", type_socket));
4090: break;
4091: }
4092:
4093: if ((protection != 'N') && ((type_socket != 'S') &&
4094: (type_socket != 'Q')))
4095: {
4096: liberation(s_etat_processus, s_objet_argument);
4097: liberation(s_etat_processus, s_objet_resultat);
4098:
4099: (*s_etat_processus).erreur_execution =
4100: d_ex_erreur_parametre_fichier;
4101: return;
4102: }
4103:
4104: if (nom == NULL)
4105: {
4106: if (((*((struct_socket *) (*s_objet_resultat).objet)).adresse =
4107: malloc(sizeof(unsigned char))) == NULL)
4108: {
4109: (*s_etat_processus).erreur_systeme =
4110: d_es_allocation_memoire;
4111: return;
4112: }
4113:
4114: strcpy((*((struct_socket *) (*s_objet_resultat).objet)).adresse,
4115: "");
4116: }
4117: else
4118: {
4119: if (((*((struct_socket *) (*s_objet_resultat).objet)).adresse =
4120: transliteration(s_etat_processus, nom,
4121: d_locale, "UTF-8")) == NULL)
4122: {
4123: liberation(s_etat_processus, s_objet_argument);
4124: liberation(s_etat_processus, s_objet_resultat);
4125: return;
4126: }
4127: }
4128:
4129: if (((*((struct_socket *) (*s_objet_resultat).objet))
4130: .adresse_distante = malloc(sizeof(unsigned char))) == NULL)
4131: {
4132: (*s_etat_processus).erreur_systeme =
4133: d_es_allocation_memoire;
4134: return;
4135: }
4136:
4137: strcpy((*((struct_socket *) (*s_objet_resultat).objet))
4138: .adresse_distante, "");
4139:
4140: (*((struct_socket *) (*s_objet_resultat).objet)).localisation =
4141: type_domaine;
4142: (*((struct_socket *) (*s_objet_resultat).objet)).binaire =
4143: format;
4144: (*((struct_socket *) (*s_objet_resultat).objet)).pid =
4145: getpid();
4146: (*((struct_socket *) (*s_objet_resultat).objet)).tid =
4147: pthread_self();
4148: (*((struct_socket *) (*s_objet_resultat).objet)).socket_en_ecoute
4149: = 'Y';
4150: (*((struct_socket *) (*s_objet_resultat).objet)).socket_connectee
4151: = d_faux;
4152:
4153: if (type_domaine == 'L')
4154: { // Socket serveur
4155: if (nom != NULL)
4156: {
4157: /*
4158: * La socket locale est dans l'espace des noms.
4159: */
4160:
4161: if (((*((struct_socket *) (*s_objet_resultat).objet))
4162: .socket = socket(PF_UNIX, type,
4163: protocole_numerique)) == -1)
4164: {
4165: liberation(s_etat_processus, s_objet_argument);
4166: liberation(s_etat_processus, s_objet_resultat);
4167:
4168: (*s_etat_processus).erreur_execution =
4169: d_ex_erreur_acces_fichier;
4170: return;
4171: }
4172:
4173: (*((struct_socket *) (*s_objet_resultat).objet)).domaine
4174: = PF_UNIX;
4175: (*((struct_socket *) (*s_objet_resultat).objet)).effacement
4176: = 'Y';
4177:
4178: socket_unix.sun_family = AF_UNIX;
4179:
4180: pointeur = (*((struct_socket *)
4181: (*s_objet_resultat).objet)).adresse;
4182:
4183: while((*pointeur) == d_code_espace)
4184: {
4185: pointeur++;
4186: }
4187:
4188: strncpy(socket_unix.sun_path, pointeur, 108);
4189: socket_unix.sun_path[108 - 1] = d_code_fin_chaine;
4190:
4191: if (options_socket() == d_erreur)
4192: {
4193: liberation(s_etat_processus, s_objet_argument);
4194: liberation(s_etat_processus, s_objet_resultat);
4195:
4196: return;
4197: }
4198:
4199: if (bind((*((struct_socket *) (*s_objet_resultat).objet))
4200: .socket, (const struct sockaddr *) &socket_unix,
4201: sizeof(socket_unix)) != 0)
4202: {
4203: liberation(s_etat_processus, s_objet_argument);
4204: liberation(s_etat_processus, s_objet_resultat);
4205:
4206: (*s_etat_processus).erreur_execution =
4207: d_ex_erreur_acces_fichier;
4208: return;
4209: }
4210: }
4211: else
4212: {
4213: /*
4214: * La socket est une socket réseau locale. L'adresse
4215: * passée en argument est l'adresse sur laquelle
4216: * cette socket est à l'écoute.
4217: */
4218:
4219: (*((struct_socket *) (*s_objet_resultat).objet)).effacement
4220: = 'N';
4221:
4222: if (hote != NULL)
4223: { // Hôte défini par un nom
4224: resolution = NULL;
4225:
4226: if (getaddrinfo(hote, NULL, NULL, &resolution) != 0)
4227: {
4228: liberation(s_etat_processus, s_objet_argument);
4229: liberation(s_etat_processus, s_objet_resultat);
4230:
4231: if (resolution != NULL)
4232: {
4233: freeaddrinfo(resolution);
4234: }
4235:
4236: (*s_etat_processus).erreur_execution =
4237: d_ex_erreur_acces_fichier;
4238: return;
4239: }
4240:
4241: if (strcmp(protocole, "IPV4") == 0)
4242: { // Accès en IPv4
4243: resolution_courante = resolution;
4244:
4245: while(resolution_courante != NULL)
4246: {
4247: if ((*resolution_courante).ai_family ==
4248: AF_INET)
4249: {
4250: break;
4251: }
4252:
4253: resolution_courante = (*resolution_courante)
4254: .ai_next;
4255: }
4256:
4257: if (resolution_courante == NULL)
4258: {
4259: liberation(s_etat_processus, s_objet_argument);
4260: liberation(s_etat_processus, s_objet_resultat);
4261:
4262: freeaddrinfo(resolution);
4263:
4264: (*s_etat_processus).erreur_execution =
4265: d_ex_erreur_acces_fichier;
4266: return;
4267: }
4268:
4269: if (((*((struct_socket *)
4270: (*s_objet_resultat).objet))
4271: .socket = socket(PF_INET, type,
4272: protocole_numerique)) == -1)
4273: {
4274: liberation(s_etat_processus, s_objet_argument);
4275: liberation(s_etat_processus, s_objet_resultat);
4276:
4277: freeaddrinfo(resolution);
4278:
4279: (*s_etat_processus).erreur_execution =
4280: d_ex_erreur_acces_fichier;
4281: return;
4282: }
4283:
4284: (*((struct_socket *) (*s_objet_resultat).objet))
4285: .domaine = PF_INET;
4286:
4287: memset(&socket_ipv4, 0, sizeof(socket_ipv4));
4288: socket_ipv4.sin_family = AF_INET;
4289: socket_ipv4.sin_port = htons((uint16_t) port);
4290: socket_ipv4.sin_addr.s_addr =
4291: (*((struct sockaddr_in *)
4292: (*resolution_courante).ai_addr))
4293: .sin_addr.s_addr;
4294:
4295: if (options_socket() == d_erreur)
4296: {
4297: liberation(s_etat_processus, s_objet_argument);
4298: liberation(s_etat_processus, s_objet_resultat);
4299:
4300: freeaddrinfo(resolution);
4301: return;
4302: }
4303:
4304: if (bind((*((struct_socket *) (*s_objet_resultat)
4305: .objet)).socket, (const struct sockaddr *)
4306: &socket_ipv4, sizeof(socket_ipv4)) != 0)
4307: {
4308: liberation(s_etat_processus, s_objet_argument);
4309: liberation(s_etat_processus, s_objet_resultat);
4310:
4311: freeaddrinfo(resolution);
4312:
4313: (*s_etat_processus).erreur_execution =
4314: d_ex_erreur_acces_fichier;
4315: return;
4316: }
4317:
4318: if (((*((struct_socket *) (*s_objet_resultat)
4319: .objet)).adresse = malloc(22 *
4320: sizeof(unsigned char))) == NULL)
4321: {
4322: (*s_etat_processus).erreur_systeme =
4323: d_es_allocation_memoire;
4324: return;
4325: }
4326:
4327: sprintf((*((struct_socket *) (*s_objet_resultat)
4328: .objet)).adresse, "%d.%d.%d.%d",
4329: (ntohl((*((struct sockaddr_in *)
4330: (*resolution_courante).ai_addr)).sin_addr
4331: .s_addr) >> 24) & 0xFF,
4332: (ntohl((*((struct sockaddr_in *)
4333: (*resolution_courante).ai_addr)).sin_addr
4334: .s_addr) >> 16) & 0xFF,
4335: (ntohl((*((struct sockaddr_in *)
4336: (*resolution_courante).ai_addr)).sin_addr
4337: .s_addr) >> 8) & 0xFF,
4338: ntohl((*((struct sockaddr_in *)
4339: (*resolution_courante).ai_addr)).sin_addr
4340: .s_addr) & 0xFF);
4341: }
4342: else
4343: { // Accès en IPv6
4344: # ifdef IPV6
4345: resolution_courante = resolution;
4346:
4347: while(resolution_courante != NULL)
4348: {
4349: if ((*resolution_courante).ai_family ==
4350: AF_INET6)
4351: {
4352: break;
4353: }
4354:
4355: resolution_courante = (*resolution_courante)
4356: .ai_next;
4357: }
4358:
4359: if (resolution_courante == NULL)
4360: {
4361: liberation(s_etat_processus, s_objet_argument);
4362: liberation(s_etat_processus, s_objet_resultat);
4363:
4364: freeaddrinfo(resolution);
4365:
4366: (*s_etat_processus).erreur_execution =
4367: d_ex_erreur_acces_fichier;
4368: return;
4369: }
4370:
4371: if (((*((struct_socket *)
4372: (*s_objet_resultat).objet))
4373: .socket = socket(PF_INET6, type,
4374: protocole_numerique)) == -1)
4375: {
4376: liberation(s_etat_processus, s_objet_argument);
4377: liberation(s_etat_processus, s_objet_resultat);
4378:
4379: freeaddrinfo(resolution);
4380:
4381: (*s_etat_processus).erreur_execution =
4382: d_ex_erreur_acces_fichier;
4383: return;
4384: }
4385:
4386: (*((struct_socket *) (*s_objet_resultat).objet))
4387: .domaine = PF_INET6;
4388:
4389: memset(&socket_ipv6, 0, sizeof(socket_ipv6));
4390: socket_ipv6.sin6_family = AF_INET6;
4391: socket_ipv6.sin6_port = htons((uint16_t) port);
4392:
4393: for(i = 0; i < 16;
4394: socket_ipv6.sin6_addr.s6_addr[i] =
4395: (*((struct sockaddr_in6 *)
4396: (*resolution_courante).ai_addr))
4397: .sin6_addr.s6_addr[i], i++);
4398:
4399: if (options_socket() == d_erreur)
4400: {
4401: liberation(s_etat_processus, s_objet_argument);
4402: liberation(s_etat_processus, s_objet_resultat);
4403:
4404: freeaddrinfo(resolution);
4405: return;
4406: }
4407:
4408: if (bind((*((struct_socket *) (*s_objet_resultat)
4409: .objet)).socket, (const struct sockaddr *)
4410: &socket_ipv6, sizeof(socket_ipv6)) != 0)
4411: {
4412: liberation(s_etat_processus, s_objet_argument);
4413: liberation(s_etat_processus, s_objet_resultat);
4414:
4415: freeaddrinfo(resolution);
4416:
4417: (*s_etat_processus).erreur_execution =
4418: d_ex_erreur_acces_fichier;
4419: return;
4420: }
4421:
4422: if (((*((struct_socket *) (*s_objet_resultat)
4423: .objet)).adresse = malloc(55 *
4424: sizeof(unsigned char))) == NULL)
4425: {
4426: (*s_etat_processus).erreur_systeme =
4427: d_es_allocation_memoire;
4428: return;
4429: }
4430:
4431: for(i = 0; i < 16; i++)
4432: {
4433: sprintf((*((struct_socket *) (*s_objet_resultat)
4434: .objet)).adresse,
4435: (i == 0) ? "%s%X" : "%s:%X",
4436: (*((struct_socket *) (*s_objet_resultat)
4437: .objet)).adresse,
4438: (*((struct sockaddr_in6 *)
4439: (*resolution_courante).ai_addr))
4440: .sin6_addr.s6_addr[i]);
4441: }
4442: # else
4443: # endif
4444: }
4445:
4446: freeaddrinfo(resolution);
4447:
4448: sprintf((*((struct_socket *) (*s_objet_resultat)
4449: .objet)).adresse, "%s(%u)",
4450: (*((struct_socket *) (*s_objet_resultat)
4451: .objet)).adresse, (unsigned int) port);
4452: }
4453: else
4454: { // Hôte défini par une adresse
4455: if (strcmp(protocole, "IPV4") == 0)
4456: { // Accès en IPv4
4457: if (((*((struct_socket *) (*s_objet_resultat)
4458: .objet)).adresse = malloc(22 *
4459: sizeof(unsigned char))) == NULL)
4460: {
4461: (*s_etat_processus).erreur_systeme =
4462: d_es_allocation_memoire;
4463: return;
4464: }
4465:
4466: (*((struct_socket *) (*s_objet_resultat).objet))
4467: .adresse[0] = d_code_fin_chaine;
4468:
4469: for(i = 0; i < 4; i++)
4470: {
4471: sprintf((*((struct_socket *) (*s_objet_resultat)
4472: .objet)).adresse,
4473: (i == 0) ? "%s%d" : "%s.%d",
4474: (*((struct_socket *) (*s_objet_resultat)
4475: .objet)).adresse, (int) adresse[i]);
4476: }
4477:
4478: sprintf((*((struct_socket *) (*s_objet_resultat)
4479: .objet)).adresse, "%s(%u)",
4480: (*((struct_socket *) (*s_objet_resultat)
4481: .objet)).adresse, (unsigned int) port);
4482:
4483: if (((*((struct_socket *)
4484: (*s_objet_resultat).objet))
4485: .socket = socket(PF_INET, type,
4486: protocole_numerique)) == -1)
4487: {
4488: liberation(s_etat_processus, s_objet_argument);
4489: liberation(s_etat_processus, s_objet_resultat);
4490:
4491: (*s_etat_processus).erreur_execution =
4492: d_ex_erreur_acces_fichier;
4493: return;
4494: }
4495:
4496: (*((struct_socket *) (*s_objet_resultat).objet))
4497: .domaine = PF_INET;
4498:
4499: memset(&socket_ipv4, 0, sizeof(socket_ipv4));
4500: socket_ipv4.sin_family = AF_INET;
4501: socket_ipv4.sin_port = htons((uint16_t) port);
4502:
4503: adresse_ipv4 = 0;
4504: for(i = 0; i < 4; adresse_ipv4 =
4505: (256 * adresse_ipv4) + adresse[i++]);
4506:
4507: socket_ipv4.sin_addr.s_addr = htonl(adresse_ipv4);
4508:
4509: if (options_socket() == d_erreur)
4510: {
4511: liberation(s_etat_processus, s_objet_argument);
4512: liberation(s_etat_processus, s_objet_resultat);
4513:
4514: return;
4515: }
4516:
4517: if (bind((*((struct_socket *) (*s_objet_resultat)
4518: .objet)).socket, (const struct sockaddr *)
4519: &socket_ipv4, sizeof(socket_ipv4)) != 0)
4520: {
4521: liberation(s_etat_processus, s_objet_argument);
4522: liberation(s_etat_processus, s_objet_resultat);
4523:
4524: (*s_etat_processus).erreur_execution =
4525: d_ex_erreur_acces_fichier;
4526: return;
4527: }
4528: }
4529: else
4530: { // Accès en IPv6
4531: # ifdef IPV6
4532: if (((*((struct_socket *) (*s_objet_resultat)
4533: .objet)).adresse = malloc(55 *
4534: sizeof(unsigned char))) == NULL)
4535: {
4536: (*s_etat_processus).erreur_systeme =
4537: d_es_allocation_memoire;
4538: return;
4539: }
4540:
4541: (*((struct_socket *) (*s_objet_resultat).objet))
4542: .adresse[0] = d_code_fin_chaine;
4543:
4544: for(i = 0; i < 16; i++)
4545: {
4546: sprintf((*((struct_socket *) (*s_objet_resultat)
4547: .objet)).adresse,
4548: (i == 0) ? "%s%X" : "%s:%X",
4549: (*((struct_socket *) (*s_objet_resultat)
4550: .objet)).adresse, (unsigned int)
4551: adresse[i]);
4552: }
4553:
4554: sprintf((*((struct_socket *) (*s_objet_resultat)
4555: .objet)).adresse, "%s(%u)",
4556: (*((struct_socket *) (*s_objet_resultat)
4557: .objet)).adresse, (unsigned int) port);
4558:
4559: if (((*((struct_socket *)
4560: (*s_objet_resultat).objet))
4561: .socket = socket(PF_INET6, type,
4562: protocole_numerique)) == -1)
4563: {
4564: liberation(s_etat_processus, s_objet_argument);
4565: liberation(s_etat_processus, s_objet_resultat);
4566:
4567: (*s_etat_processus).erreur_execution =
4568: d_ex_erreur_acces_fichier;
4569: return;
4570: }
4571:
4572: (*((struct_socket *) (*s_objet_resultat).objet))
4573: .domaine = PF_INET6;
4574:
4575: memset(&socket_ipv6, 0, sizeof(socket_ipv6));
4576: socket_ipv6.sin6_family = AF_INET6;
4577: socket_ipv6.sin6_port = htons((uint16_t) port);
4578:
4579: for(i = 0; i < 16;
4580: socket_ipv6.sin6_addr.s6_addr[i] =
4581: (unsigned char) (adresse[i]), i++);
4582:
4583: if (options_socket() == d_erreur)
4584: {
4585: liberation(s_etat_processus, s_objet_argument);
4586: liberation(s_etat_processus, s_objet_resultat);
4587:
4588: return;
4589: }
4590:
4591: if (bind((*((struct_socket *) (*s_objet_resultat)
4592: .objet)).socket, (const struct sockaddr *)
4593: &socket_ipv6, sizeof(socket_ipv6)) != 0)
4594: {
4595: liberation(s_etat_processus, s_objet_argument);
4596: liberation(s_etat_processus, s_objet_resultat);
4597:
4598: (*s_etat_processus).erreur_execution =
4599: d_ex_erreur_acces_fichier;
4600: return;
4601: }
4602: # else
4603: # endif
4604: }
4605: }
4606:
4607: (*((struct_socket *) (*s_objet_resultat).objet)).effacement
4608: = 'N';
4609: }
4610:
4611: if ((type_socket == 'S') || (type_socket == 'Q'))
4612: {
4613: if (listen((*((struct_socket *) (*s_objet_resultat).objet))
4614: .socket, (int) nombre_maximal_connexions) != 0)
4615: {
4616: liberation(s_etat_processus, s_objet_argument);
4617: liberation(s_etat_processus, s_objet_resultat);
4618:
4619: (*s_etat_processus).erreur_execution =
4620: d_ex_erreur_acces_fichier;
4621: return;
4622: }
4623:
4624: (*((struct_socket *) (*s_objet_resultat).objet))
4625: .socket_connectee = d_vrai;
4626:
4627: if (protection == 'R')
4628: { // WRITEONLY
4629: if (shutdown((*((struct_socket *) (*s_objet_resultat)
4630: .objet)).socket, SHUT_RD) != 0)
4631: {
4632: liberation(s_etat_processus, s_objet_argument);
4633: liberation(s_etat_processus, s_objet_resultat);
4634:
4635: (*s_etat_processus).erreur_execution =
4636: d_ex_erreur_acces_fichier;
4637: return;
4638: }
4639: }
4640: else if (protection == 'W')
4641: { // READONLY
4642: if (shutdown((*((struct_socket *) (*s_objet_resultat)
4643: .objet)).socket, SHUT_WR) != 0)
4644: {
4645: liberation(s_etat_processus, s_objet_argument);
4646: liberation(s_etat_processus, s_objet_resultat);
4647:
4648: (*s_etat_processus).erreur_execution =
4649: d_ex_erreur_acces_fichier;
4650: return;
4651: }
4652: }
4653: else
4654: { // READWRITE
4655: }
4656: }
4657: }
4658: else
4659: { // Socket cliente
4660: (*((struct_socket *) (*s_objet_resultat).objet)).effacement
4661: = 'N';
4662:
4663: /*
4664: * Dans le cas où la socket n'est pas connectée, on
4665: * ne peut utiliser ni "NAME", ni "HOST", ni "PORT",
4666: * et encore moins spécifier une adresse. En effet, la cible
4667: * est défini par la commande TARGET.
4668: */
4669:
4670: if ((type_socket != 'S') && (type_socket != 'Q'))
4671: {
4672: if ((presence_port == d_vrai) || (hote != NULL) ||
4673: (nom != NULL) || (type_adresse != ' '))
4674: {
4675: liberation(s_etat_processus, s_objet_argument);
4676: liberation(s_etat_processus, s_objet_resultat);
4677:
4678: (*s_etat_processus).erreur_execution =
4679: d_ex_erreur_parametre_fichier;
4680: return;
4681: }
4682: }
4683:
4684: if (nom != NULL)
4685: {
4686: /*
4687: * La socket est dans l'espace des noms.
4688: */
4689:
4690: if (((*((struct_socket *) (*s_objet_resultat).objet))
4691: .socket = socket(PF_UNIX, type,
4692: protocole_numerique)) == -1)
4693: {
4694: liberation(s_etat_processus, s_objet_argument);
4695: liberation(s_etat_processus, s_objet_resultat);
4696:
4697: (*s_etat_processus).erreur_execution =
4698: d_ex_erreur_acces_fichier;
4699: return;
4700: }
4701:
4702: (*((struct_socket *) (*s_objet_resultat).objet))
4703: .domaine = PF_UNIX;
4704:
4705: socket_unix.sun_family = AF_UNIX;
4706: strncpy(socket_unix.sun_path, (*((struct_socket *)
4707: (*s_objet_resultat).objet)).adresse, 108);
4708: socket_unix.sun_path[108 - 1] = d_code_fin_chaine;
4709:
4710: if ((type_socket == 'S') || (type_socket == 'Q'))
4711: {
4712: if (connect((*((struct_socket *) (*s_objet_resultat)
4713: .objet)).socket, (const struct sockaddr *)
4714: &socket_unix, sizeof(socket_unix)) != 0)
4715: {
4716: liberation(s_etat_processus, s_objet_argument);
4717: liberation(s_etat_processus, s_objet_resultat);
4718:
4719: (*s_etat_processus).erreur_execution =
4720: d_ex_erreur_acces_fichier;
4721: return;
4722: }
4723:
4724: (*((struct_socket *) (*s_objet_resultat).objet))
4725: .socket_connectee = d_vrai;
4726: (*((struct_socket *) (*s_objet_resultat).objet))
4727: .socket_en_ecoute = 'N';
4728: }
4729: }
4730: else
4731: {
4732: /*
4733: * La socket est une socket réseau. L'adresse
4734: * passée en argument est l'adresse sur laquelle
4735: * cette socket est à l'écoute.
4736: */
4737:
4738: if (hote != NULL)
4739: { // Hôte défini par un nom
4740: resolution = NULL;
4741:
4742: if (getaddrinfo(hote, NULL, NULL, &resolution) != 0)
4743: {
4744: liberation(s_etat_processus, s_objet_argument);
4745: liberation(s_etat_processus, s_objet_resultat);
4746:
4747: if (resolution != NULL)
4748: {
4749: freeaddrinfo(resolution);
4750: }
4751:
4752: (*s_etat_processus).erreur_execution =
4753: d_ex_erreur_acces_fichier;
4754: return;
4755: }
4756:
4757: if (strcmp(protocole, "IPV4") == 0)
4758: { // Accès en IPv4
4759: resolution_courante = resolution;
4760:
4761: while(resolution_courante != NULL)
4762: {
4763: if ((*resolution_courante).ai_family ==
4764: AF_INET)
4765: {
4766: break;
4767: }
4768:
4769: resolution_courante = (*resolution_courante)
4770: .ai_next;
4771: }
4772:
4773: if (resolution_courante == NULL)
4774: {
4775: liberation(s_etat_processus, s_objet_argument);
4776: liberation(s_etat_processus, s_objet_resultat);
4777:
4778: freeaddrinfo(resolution);
4779:
4780: (*s_etat_processus).erreur_execution =
4781: d_ex_erreur_acces_fichier;
4782: return;
4783: }
4784:
4785: if (((*((struct_socket *)
4786: (*s_objet_resultat).objet))
4787: .socket = socket(PF_INET, type,
4788: protocole_numerique)) == -1)
4789: {
4790: liberation(s_etat_processus, s_objet_argument);
4791: liberation(s_etat_processus, s_objet_resultat);
4792:
4793: freeaddrinfo(resolution);
4794:
4795: (*s_etat_processus).erreur_execution =
4796: d_ex_erreur_acces_fichier;
4797: return;
4798: }
4799:
4800: (*((struct_socket *) (*s_objet_resultat).objet))
4801: .domaine = PF_INET;
4802:
4803: memset(&socket_ipv4, 0, sizeof(socket_ipv4));
4804: socket_ipv4.sin_family = AF_INET;
4805: socket_ipv4.sin_port = htons((uint16_t) port);
4806: socket_ipv4.sin_addr.s_addr =
4807: (*((struct sockaddr_in *)
4808: (*resolution_courante).ai_addr))
4809: .sin_addr.s_addr;
4810:
4811: if ((type_socket == 'S') || (type_socket == 'Q'))
4812: {
4813: if (connect((*((struct_socket *)
4814: (*s_objet_resultat).objet)).socket,
4815: (const struct sockaddr *)
4816: &socket_ipv4, sizeof(socket_ipv4)) != 0)
4817: {
4818: liberation(s_etat_processus,
4819: s_objet_argument);
4820: liberation(s_etat_processus,
4821: s_objet_resultat);
4822:
4823: freeaddrinfo(resolution);
4824:
4825: (*s_etat_processus).erreur_execution =
4826: d_ex_erreur_acces_fichier;
4827: return;
4828: }
4829:
4830: (*((struct_socket *) (*s_objet_resultat).objet))
4831: .socket_connectee = d_vrai;
4832: (*((struct_socket *) (*s_objet_resultat).objet))
4833: .socket_en_ecoute = 'N';
4834: }
4835:
4836: if (((*((struct_socket *) (*s_objet_resultat)
4837: .objet)).adresse = malloc(22 *
4838: sizeof(unsigned char))) == NULL)
4839: {
4840: (*s_etat_processus).erreur_systeme =
4841: d_es_allocation_memoire;
4842: return;
4843: }
4844:
4845: sprintf((*((struct_socket *) (*s_objet_resultat)
4846: .objet)).adresse, "%d.%d.%d.%d",
4847: (ntohl((*((struct sockaddr_in *)
4848: (*resolution_courante).ai_addr)).sin_addr
4849: .s_addr) >> 24) & 0xFF,
4850: (ntohl((*((struct sockaddr_in *)
4851: (*resolution_courante).ai_addr)).sin_addr
4852: .s_addr) >> 16) & 0xFF,
4853: (ntohl((*((struct sockaddr_in *)
4854: (*resolution_courante).ai_addr)).sin_addr
4855: .s_addr) >> 8) & 0xFF,
4856: ntohl((*((struct sockaddr_in *)
4857: (*resolution_courante).ai_addr)).sin_addr
4858: .s_addr) & 0xFF);
4859: }
4860: else
4861: { // Accès en IPv6
4862: # ifdef IPV6
4863: resolution_courante = resolution;
4864:
4865: while(resolution_courante != NULL)
4866: {
4867: if ((*resolution_courante).ai_family ==
4868: AF_INET6)
4869: {
4870: break;
4871: }
4872:
4873: resolution_courante = (*resolution_courante)
4874: .ai_next;
4875: }
4876:
4877: if (resolution_courante == NULL)
4878: {
4879: liberation(s_etat_processus, s_objet_argument);
4880: liberation(s_etat_processus, s_objet_resultat);
4881:
4882: freeaddrinfo(resolution);
4883:
4884: (*s_etat_processus).erreur_execution =
4885: d_ex_erreur_acces_fichier;
4886: return;
4887: }
4888:
4889: if (((*((struct_socket *)
4890: (*s_objet_resultat).objet))
4891: .socket = socket(PF_INET6, type,
4892: protocole_numerique)) == -1)
4893: {
4894: liberation(s_etat_processus, s_objet_argument);
4895: liberation(s_etat_processus, s_objet_resultat);
4896:
4897: freeaddrinfo(resolution);
4898:
4899: (*s_etat_processus).erreur_execution =
4900: d_ex_erreur_acces_fichier;
4901: return;
4902: }
4903:
4904: (*((struct_socket *) (*s_objet_resultat).objet))
4905: .domaine = PF_INET6;
4906:
4907: memset(&socket_ipv6, 0, sizeof(socket_ipv6));
4908: socket_ipv6.sin6_family = AF_INET6;
4909: socket_ipv6.sin6_port = htons((uint16_t) port);
4910:
4911: for(i = 0; i < 16;
4912: socket_ipv6.sin6_addr.s6_addr[i] =
4913: (*((struct sockaddr_in6 *)
4914: (*resolution_courante).ai_addr))
4915: .sin6_addr.s6_addr[i], i++);
4916:
4917: if ((type_socket == 'S') || (type_socket == 'Q'))
4918: {
4919: if (connect((*((struct_socket *)
4920: (*s_objet_resultat).objet)).socket,
4921: (const struct sockaddr *)
4922: &socket_ipv6, sizeof(socket_ipv6)) != 0)
4923: {
4924: liberation(s_etat_processus,
4925: s_objet_argument);
4926: liberation(s_etat_processus,
4927: s_objet_resultat);
4928:
4929: freeaddrinfo(resolution);
4930:
4931: (*s_etat_processus).erreur_execution =
4932: d_ex_erreur_acces_fichier;
4933: return;
4934: }
4935:
4936: (*((struct_socket *) (*s_objet_resultat).objet))
4937: .socket_connectee = d_vrai;
4938: (*((struct_socket *) (*s_objet_resultat).objet))
4939: .socket_en_ecoute = 'N';
4940: }
4941:
4942: if (((*((struct_socket *) (*s_objet_resultat)
4943: .objet)).adresse = malloc(55 *
4944: sizeof(unsigned char))) == NULL)
4945: {
4946: (*s_etat_processus).erreur_systeme =
4947: d_es_allocation_memoire;
4948: return;
4949: }
4950:
4951: for(i = 0; i < 16; i++)
4952: {
4953: sprintf((*((struct_socket *) (*s_objet_resultat)
4954: .objet)).adresse,
4955: (i == 0) ? "%s%X" : "%s:%X",
4956: (*((struct_socket *) (*s_objet_resultat)
4957: .objet)).adresse,
4958: (*((struct sockaddr_in6 *)
4959: (*resolution_courante).ai_addr))
4960: .sin6_addr.s6_addr[i]);
4961: }
4962: # else
4963: # endif
4964: }
4965:
4966: freeaddrinfo(resolution);
4967:
4968: sprintf((*((struct_socket *) (*s_objet_resultat)
4969: .objet)).adresse, "%s(%u)",
4970: (*((struct_socket *) (*s_objet_resultat)
4971: .objet)).adresse, (unsigned int) port);
4972: }
4973: else
4974: { // Hôte défini par une adresse
4975: if (strcmp(protocole, "IPV4") == 0)
4976: { // Accès en IPv4
4977: if (type_adresse == '4')
4978: {
4979: if (((*((struct_socket *) (*s_objet_resultat)
4980: .objet)).adresse = malloc(22 *
4981: sizeof(unsigned char))) == NULL)
4982: {
4983: (*s_etat_processus).erreur_systeme =
4984: d_es_allocation_memoire;
4985: return;
4986: }
4987:
4988: (*((struct_socket *) (*s_objet_resultat).objet))
4989: .adresse[0] = d_code_fin_chaine;
4990:
4991: for(i = 0; i < 4; i++)
4992: {
4993: sprintf((*((struct_socket *)
4994: (*s_objet_resultat).objet)).adresse,
4995: (i == 0) ? "%s%d" : "%s.%d",
4996: (*((struct_socket *)
4997: (*s_objet_resultat)
4998: .objet)).adresse, (int) adresse[i]);
4999: }
5000:
5001: sprintf((*((struct_socket *) (*s_objet_resultat)
5002: .objet)).adresse, "%s(%u)",
5003: (*((struct_socket *) (*s_objet_resultat)
5004: .objet)).adresse, (unsigned int) port);
5005: }
5006: else
5007: {
5008: if (((*((struct_socket *) (*s_objet_resultat)
5009: .objet)).adresse = malloc(
5010: sizeof(unsigned char))) == NULL)
5011: {
5012: (*s_etat_processus).erreur_systeme =
5013: d_es_allocation_memoire;
5014: return;
5015: }
5016:
5017: (*((struct_socket *) (*s_objet_resultat).objet))
5018: .adresse[0] = d_code_fin_chaine;
5019: }
5020:
5021: if (((*((struct_socket *)
5022: (*s_objet_resultat).objet))
5023: .socket = socket(PF_INET, type,
5024: protocole_numerique)) == -1)
5025: {
5026: liberation(s_etat_processus, s_objet_argument);
5027: liberation(s_etat_processus, s_objet_resultat);
5028:
5029: (*s_etat_processus).erreur_execution =
5030: d_ex_erreur_acces_fichier;
5031: return;
5032: }
5033:
5034: (*((struct_socket *) (*s_objet_resultat).objet))
5035: .domaine = PF_INET;
5036:
5037: memset(&socket_ipv4, 0, sizeof(socket_ipv4));
5038: socket_ipv4.sin_family = AF_INET;
5039: socket_ipv4.sin_port = htons((uint16_t) port);
5040:
5041: adresse_ipv4 = 0;
5042: for(i = 0; i < 4; adresse_ipv4 =
5043: (256 * adresse_ipv4) + adresse[i++]);
5044:
5045: socket_ipv4.sin_addr.s_addr = htonl(adresse_ipv4);
5046:
5047: if ((type_socket == 'S') || (type_socket == 'Q'))
5048: {
5049: if (connect((*((struct_socket *)
5050: (*s_objet_resultat).objet)).socket,
5051: (const struct sockaddr *)
5052: &socket_ipv4, sizeof(socket_ipv4)) != 0)
5053: {
5054: liberation(s_etat_processus,
5055: s_objet_argument);
5056: liberation(s_etat_processus,
5057: s_objet_resultat);
5058:
5059: (*s_etat_processus).erreur_execution =
5060: d_ex_erreur_acces_fichier;
5061: return;
5062: }
5063:
5064: (*((struct_socket *) (*s_objet_resultat).objet))
5065: .socket_connectee = d_vrai;
5066: (*((struct_socket *) (*s_objet_resultat).objet))
5067: .socket_en_ecoute = 'N';
5068: }
5069: }
5070: else if (strcmp(protocole, "IPV6") == 0)
5071: { // Accès en IPv6
5072: # ifdef IPV6
5073: if (type_adresse == '6')
5074: {
5075: if (((*((struct_socket *) (*s_objet_resultat)
5076: .objet)).adresse = malloc(55 *
5077: sizeof(unsigned char))) == NULL)
5078: {
5079: (*s_etat_processus).erreur_systeme =
5080: d_es_allocation_memoire;
5081: return;
5082: }
5083:
5084: (*((struct_socket *) (*s_objet_resultat).objet))
5085: .adresse[0] = d_code_fin_chaine;
5086:
5087: for(i = 0; i < 16; i++)
5088: {
5089: sprintf((*((struct_socket *)
5090: (*s_objet_resultat).objet)).adresse,
5091: (i == 0) ? "%s%X" : "%s:%X",
5092: (*((struct_socket *)
5093: (*s_objet_resultat)
5094: .objet)).adresse, (unsigned int)
5095: adresse[i]);
5096: }
5097:
5098: sprintf((*((struct_socket *) (*s_objet_resultat)
5099: .objet)).adresse, "%s(%u)",
5100: (*((struct_socket *) (*s_objet_resultat)
5101: .objet)).adresse, (unsigned int) port);
5102: }
5103: else
5104: {
5105: if (((*((struct_socket *) (*s_objet_resultat)
5106: .objet)).adresse = malloc(
5107: sizeof(unsigned char))) == NULL)
5108: {
5109: (*s_etat_processus).erreur_systeme =
5110: d_es_allocation_memoire;
5111: return;
5112: }
5113:
5114: (*((struct_socket *) (*s_objet_resultat).objet))
5115: .adresse[0] = d_code_fin_chaine;
5116: }
5117:
5118: if (((*((struct_socket *)
5119: (*s_objet_resultat).objet))
5120: .socket = socket(PF_INET6, type,
5121: protocole_numerique)) == -1)
5122: {
5123: liberation(s_etat_processus, s_objet_argument);
5124: liberation(s_etat_processus, s_objet_resultat);
5125:
5126: (*s_etat_processus).erreur_execution =
5127: d_ex_erreur_acces_fichier;
5128: return;
5129: }
5130:
5131: (*((struct_socket *) (*s_objet_resultat).objet))
5132: .domaine = PF_INET6;
5133:
5134: memset(&socket_ipv6, 0, sizeof(socket_ipv6));
5135: socket_ipv6.sin6_family = AF_INET6;
5136: socket_ipv6.sin6_port = htons((uint16_t) port);
5137:
5138: for(i = 0; i < 16;
5139: socket_ipv6.sin6_addr.s6_addr[i] =
5140: (unsigned char) (adresse[i]), i++);
5141:
5142: if ((type_socket == 'S') || (type_socket == 'Q'))
5143: {
5144: if (connect((*((struct_socket *)
5145: (*s_objet_resultat).objet)).socket,
5146: (const struct sockaddr *)
5147: &socket_ipv6, sizeof(socket_ipv6)) != 0)
5148: {
5149: liberation(s_etat_processus,
5150: s_objet_argument);
5151: liberation(s_etat_processus,
5152: s_objet_resultat);
5153:
5154: (*s_etat_processus).erreur_execution =
5155: d_ex_erreur_acces_fichier;
5156: return;
5157: }
5158:
5159: (*((struct_socket *) (*s_objet_resultat).objet))
5160: .socket_connectee = d_vrai;
5161: (*((struct_socket *) (*s_objet_resultat).objet))
5162: .socket_en_ecoute = 'N';
5163: }
5164: # else
5165: # endif
5166: }
5167: else
5168: { // Socket UNIX
5169: if (((*((struct_socket *) (*s_objet_resultat)
5170: .objet)).adresse = malloc(
5171: sizeof(unsigned char))) == NULL)
5172: {
5173: (*s_etat_processus).erreur_systeme =
5174: d_es_allocation_memoire;
5175: return;
5176: }
5177:
5178: (*((struct_socket *) (*s_objet_resultat).objet))
5179: .adresse[0] = d_code_fin_chaine;
5180:
5181: if (((*((struct_socket *)
5182: (*s_objet_resultat).objet))
5183: .socket = socket(PF_UNIX, type,
5184: protocole_numerique)) == -1)
5185: {
5186: liberation(s_etat_processus, s_objet_argument);
5187: liberation(s_etat_processus, s_objet_resultat);
5188:
5189: (*s_etat_processus).erreur_execution =
5190: d_ex_erreur_acces_fichier;
5191: return;
5192: }
5193: }
5194: }
5195:
5196: (*((struct_socket *) (*s_objet_resultat).objet)).effacement
5197: = 'N';
5198: }
5199:
5200: if ((type_socket == 'S') || (type_socket == 'Q'))
5201: {
5202: if (protection == 'R')
5203: { // WRITEONLY
5204: if (shutdown((*((struct_socket *) (*s_objet_resultat)
5205: .objet)).socket, SHUT_RD) != 0)
5206: {
5207: liberation(s_etat_processus, s_objet_argument);
5208: liberation(s_etat_processus, s_objet_resultat);
5209:
5210: (*s_etat_processus).erreur_execution =
5211: d_ex_erreur_acces_fichier;
5212: return;
5213: }
5214: }
5215: else if (protection == 'W')
5216: { // READONLY
5217: if (shutdown((*((struct_socket *) (*s_objet_resultat)
5218: .objet)).socket, SHUT_WR) != 0)
5219: {
5220: liberation(s_etat_processus, s_objet_argument);
5221: liberation(s_etat_processus, s_objet_resultat);
5222:
5223: (*s_etat_processus).erreur_execution =
5224: d_ex_erreur_acces_fichier;
5225: return;
5226: }
5227: }
5228: else
5229: { // READWRITE
5230: }
5231: }
5232: }
5233:
5234: /*
5235: * Gestion de la liste des sockets ouvertes
5236: */
5237:
5238: l_element_courant = (*s_etat_processus).s_sockets;
5239:
5240: if (l_element_courant == NULL)
5241: {
5242: if (((*s_etat_processus).s_sockets =
5243: allocation_maillon(s_etat_processus)) == NULL)
5244: {
5245: (*s_etat_processus).erreur_systeme =
5246: d_es_allocation_memoire;
5247: return;
5248: }
5249:
5250: (*(*s_etat_processus).s_sockets).suivant = NULL;
5251: l_element_courant = (*s_etat_processus).s_sockets;
5252: }
5253: else
5254: {
5255: /*
5256: * Ajout d'un élément à la fin de la liste chaînée
5257: */
5258:
5259: while((*l_element_courant).suivant != NULL)
5260: {
5261: l_element_courant = (*l_element_courant).suivant;
5262: }
5263:
5264: if (((*l_element_courant).suivant =
5265: allocation_maillon(s_etat_processus)) == NULL)
5266: {
5267: (*s_etat_processus).erreur_systeme =
5268: d_es_allocation_memoire;
5269: return;
5270: }
5271:
5272: l_element_courant = (*l_element_courant).suivant;
5273: (*l_element_courant).suivant = NULL;
5274: }
5275:
5276: if (((*l_element_courant).donnee = copie_objet(s_etat_processus,
5277: s_objet_resultat, 'O')) == NULL)
5278: {
5279: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
5280: return;
5281: }
5282:
5283: liberation(s_etat_processus, s_objet_argument);
5284: }
5285: else
5286: {
5287: liberation(s_etat_processus, s_objet_argument);
5288:
5289: (*s_etat_processus).erreur_execution =
5290: d_ex_erreur_parametre_fichier;
5291: return;
5292: }
5293: }
5294: else if ((*s_objet_argument).type == CHN)
5295: {
5296: if ((s_objet_resultat = allocation(s_etat_processus, SPH)) == NULL)
5297: {
5298: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
5299: return;
5300: }
5301:
5302: if (((*((struct_semaphore *) (*s_objet_resultat).objet)).nom =
5303: malloc((strlen((unsigned char *) (*s_objet_argument).objet)
5304: + 1) *sizeof(unsigned char))) == NULL)
5305: {
5306: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
5307: return;
5308: }
5309:
5310: strcpy((*((struct_semaphore *) (*s_objet_resultat).objet)).nom,
5311: (unsigned char *) (*s_objet_argument).objet);
5312:
5313: if (((*((struct_semaphore *) (*s_objet_resultat).objet)).semaphore =
5314: sem_open((*((struct_semaphore *) (*s_objet_resultat).objet))
5315: .nom, 0)) == SEM_FAILED)
5316: {
5317: if (errno == ENOMEM)
5318: {
5319: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
5320: return;
5321: }
5322:
5323: (*s_etat_processus).erreur_execution = d_ex_semaphore;
5324:
5325: liberation(s_etat_processus, s_objet_argument);
5326: liberation(s_etat_processus, s_objet_resultat);
5327: return;
5328: }
5329: }
5330: else
5331: {
5332: liberation(s_etat_processus, s_objet_argument);
5333:
5334: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
5335: return;
5336: }
5337:
5338: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
5339: s_objet_resultat) == d_erreur)
5340: {
5341: return;
5342: }
5343:
5344: return;
5345: }
5346:
5347: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>