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