1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.11
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 'r->b'
29: ================================================================================
30: Entrées : pointeur sur une structure struct_processus
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_r_vers_b(struct_processus *s_etat_processus)
40: {
41: struct_objet *s_objet_argument;
42: struct_objet *s_objet_resultat;
43:
44: (*s_etat_processus).erreur_execution = d_ex;
45:
46: if ((*s_etat_processus).affichage_arguments == 'Y')
47: {
48: printf("\n R->B ");
49:
50: if ((*s_etat_processus).langue == 'F')
51: {
52: printf("(réel vers binaire)\n\n");
53: }
54: else
55: {
56: printf("(real to binary)\n\n");
57: }
58:
59: printf(" 1: %s\n", d_INT);
60: printf("-> 1: %s\n", d_BIN);
61:
62: return;
63: }
64: else if ((*s_etat_processus).test_instruction == 'Y')
65: {
66: (*s_etat_processus).nombre_arguments = -1;
67: return;
68: }
69:
70: if (test_cfsf(s_etat_processus, 31) == d_vrai)
71: {
72: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
73: {
74: return;
75: }
76: }
77:
78: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
79: &s_objet_argument) == d_erreur)
80: {
81: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
82: return;
83: }
84:
85: if ((*s_objet_argument).type == INT)
86: {
87: if ((s_objet_resultat = allocation(s_etat_processus, BIN)) == NULL)
88: {
89: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
90: return;
91: }
92:
93: if ((*((integer8 *) (*s_objet_argument).objet)) < 0)
94: {
95: (*((logical8 *) (*s_objet_resultat).objet)) = 0;
96: }
97: else
98: {
99: (*((logical8 *) (*s_objet_resultat).objet)) = (*((integer8 *)
100: (*s_objet_argument).objet));
101: }
102: }
103: else
104: {
105: liberation(s_etat_processus, s_objet_argument);
106:
107: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
108: return;
109: }
110:
111: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
112: s_objet_resultat) == d_erreur)
113: {
114: return;
115: }
116:
117: liberation(s_etat_processus, s_objet_argument);
118: return;
119: }
120:
121:
122: /*
123: ================================================================================
124: Fonction 'rl'
125: ================================================================================
126: Entrées : pointeur sur une structure struct_processus
127: --------------------------------------------------------------------------------
128: Sorties :
129: --------------------------------------------------------------------------------
130: Effets de bord : néant
131: ================================================================================
132: */
133:
134: void
135: instruction_rl(struct_processus *s_etat_processus)
136: {
137: logical8 masque;
138: logical8 tampon;
139:
140: struct_objet *s_copie;
141: struct_objet *s_objet;
142:
143: unsigned long i;
144: unsigned long j;
145: unsigned long longueur;
146:
147: (*s_etat_processus).erreur_execution = d_ex;
148:
149: if ((*s_etat_processus).affichage_arguments == 'Y')
150: {
151: printf("\n RL ");
152:
153: if ((*s_etat_processus).langue == 'F')
154: {
155: printf("(rotation à gauche)\n\n");
156: }
157: else
158: {
159: printf("(rotate left)\n\n");
160: }
161:
162: printf(" 1: %s\n", d_BIN);
163: printf("-> 1: %s\n", d_BIN);
164:
165: return;
166: }
167: else if ((*s_etat_processus).test_instruction == 'Y')
168: {
169: (*s_etat_processus).nombre_arguments = -1;
170: return;
171: }
172:
173: if (test_cfsf(s_etat_processus, 31) == d_vrai)
174: {
175: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
176: {
177: return;
178: }
179: }
180:
181: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
182: &s_objet) == d_erreur)
183: {
184: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
185: return;
186: }
187:
188: if ((*s_objet).type == BIN)
189: {
190: if ((s_copie = copie_objet(s_etat_processus, s_objet, 'O')) == NULL)
191: {
192: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
193: return;
194: }
195:
196: longueur = 1;
197: j = 1;
198:
199: for(i = 37; i <= 42; i++)
200: {
201: longueur += (test_cfsf(s_etat_processus, (unsigned char) i)
202: == d_vrai) ? j : 0;
203: j *= 2;
204: }
205:
206: tampon = (*((logical8 *) (*s_copie).objet));
207: masque = ((logical8) 1) << (longueur - 1);
208:
209: if ((tampon & masque) == 0)
210: {
211: tampon <<= 1;
212: }
213: else
214: {
215: tampon <<= 1;
216: tampon |= (logical8) 1;
217: }
218:
219: for(masque = 0, i = 0; i < longueur; i++)
220: {
221: masque <<= 1;
222: masque |= (logical8) 1;
223: }
224:
225: tampon &= masque;
226: (*((logical8 *) (*s_copie).objet)) = tampon;
227:
228: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
229: s_copie) == d_erreur)
230: {
231: return;
232: }
233: }
234: else
235: {
236: liberation(s_etat_processus, s_objet);
237:
238: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
239: return;
240: }
241:
242: liberation(s_etat_processus, s_objet);
243:
244: return;
245: }
246:
247:
248: /*
249: ================================================================================
250: Fonction 'rlb'
251: ================================================================================
252: Entrées : pointeur sur une structure struct_processus
253: --------------------------------------------------------------------------------
254: Sorties :
255: --------------------------------------------------------------------------------
256: Effets de bord : néant
257: ================================================================================
258: */
259:
260: void
261: instruction_rlb(struct_processus *s_etat_processus)
262: {
263: struct_liste_chainee *l_base_pile;
264:
265: unsigned long i;
266:
267: (*s_etat_processus).erreur_execution = d_ex;
268:
269: if ((*s_etat_processus).affichage_arguments == 'Y')
270: {
271: printf("\n RLB ");
272:
273: if ((*s_etat_processus).langue == 'F')
274: {
275: printf("(rotation d'un octet vers la gauche)\n\n");
276: }
277: else
278: {
279: printf("(rotate left byte)\n\n");
280: }
281:
282: printf(" 1: %s\n", d_BIN);
283: printf("-> 1: %s\n", d_BIN);
284:
285: return;
286: }
287: else if ((*s_etat_processus).test_instruction == 'Y')
288: {
289: (*s_etat_processus).nombre_arguments = -1;
290: return;
291: }
292:
293: if (test_cfsf(s_etat_processus, 31) == d_vrai)
294: {
295: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
296: {
297: return;
298: }
299: }
300:
301: l_base_pile = (*s_etat_processus).l_base_pile_last;
302: (*s_etat_processus).l_base_pile_last = NULL;
303:
304: for(i = 0; i < 8; i++)
305: {
306: instruction_rl(s_etat_processus);
307:
308: if (((*s_etat_processus).erreur_systeme != d_es) ||
309: ((*s_etat_processus).erreur_execution != d_ex))
310: {
311: break;
312: }
313: }
314:
315: if (test_cfsf(s_etat_processus, 31) == d_vrai)
316: {
317: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
318: {
319: return;
320: }
321: }
322:
323: (*s_etat_processus).l_base_pile_last = l_base_pile;
324: return;
325: }
326:
327:
328: /*
329: ================================================================================
330: Fonction 'rr'
331: ================================================================================
332: Entrées : pointeur sur une structure struct_processus
333: --------------------------------------------------------------------------------
334: Sorties :
335: --------------------------------------------------------------------------------
336: Effets de bord : néant
337: ================================================================================
338: */
339:
340: void
341: instruction_rr(struct_processus *s_etat_processus)
342: {
343: logical8 masque;
344: logical8 tampon;
345:
346: struct_objet *s_copie;
347: struct_objet *s_objet;
348:
349: unsigned long i;
350: unsigned long j;
351: unsigned long longueur;
352:
353: (*s_etat_processus).erreur_execution = d_ex;
354:
355: if ((*s_etat_processus).affichage_arguments == 'Y')
356: {
357: printf("\n RR ");
358:
359: if ((*s_etat_processus).langue == 'F')
360: {
361: printf("(rotation à droite)\n\n");
362: }
363: else
364: {
365: printf("(rotate right)\n\n");
366: }
367:
368: printf(" 1: %s\n", d_BIN);
369: printf("-> 1: %s\n", d_BIN);
370:
371: return;
372: }
373: else if ((*s_etat_processus).test_instruction == 'Y')
374: {
375: (*s_etat_processus).nombre_arguments = -1;
376: return;
377: }
378:
379: if (test_cfsf(s_etat_processus, 31) == d_vrai)
380: {
381: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
382: {
383: return;
384: }
385: }
386:
387: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
388: &s_objet) == d_erreur)
389: {
390: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
391: return;
392: }
393:
394: if ((*s_objet).type == BIN)
395: {
396: if ((s_copie = copie_objet(s_etat_processus, s_objet, 'O')) == NULL)
397: {
398: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
399: return;
400: }
401:
402: longueur = 1;
403: j = 1;
404:
405: for(i = 37; i <= 42; i++)
406: {
407: longueur += (test_cfsf(s_etat_processus, (unsigned char) i)
408: == d_vrai) ? j : 0;
409: j *= 2;
410: }
411:
412: tampon = (*((logical8 *) (*s_copie).objet));
413: masque = (logical8) 1;
414:
415: if ((tampon & masque) == 0)
416: {
417: tampon >>= 1;
418: }
419: else
420: {
421: tampon >>= 1;
422: tampon |= (((logical8) 1) << (longueur - 1));
423: }
424:
425: for(masque = 0, i = 0; i < longueur; i++)
426: {
427: masque <<= 1;
428: masque |= 1;
429: }
430:
431: tampon &= masque;
432: (*((logical8 *) (*s_copie).objet)) = tampon;
433:
434: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
435: s_copie) == d_erreur)
436: {
437: return;
438: }
439: }
440: else
441: {
442: liberation(s_etat_processus, s_objet);
443:
444: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
445: return;
446: }
447:
448: liberation(s_etat_processus, s_objet);
449:
450: return;
451: }
452:
453:
454: /*
455: ================================================================================
456: Fonction 'rrb'
457: ================================================================================
458: Entrées : pointeur sur une structure struct_processus
459: --------------------------------------------------------------------------------
460: Sorties :
461: --------------------------------------------------------------------------------
462: Effets de bord : néant
463: ================================================================================
464: */
465:
466: void
467: instruction_rrb(struct_processus *s_etat_processus)
468: {
469: struct_liste_chainee *l_base_pile;
470:
471: unsigned long i;
472:
473: (*s_etat_processus).erreur_execution = d_ex;
474:
475: if ((*s_etat_processus).affichage_arguments == 'Y')
476: {
477: printf("\n RRB ");
478:
479: if ((*s_etat_processus).langue == 'F')
480: {
481: printf("(rotation d'un octet vers la droite)\n\n");
482: }
483: else
484: {
485: printf("(rotate right byte)\n\n");
486: }
487:
488: printf(" 1: %s\n", d_BIN);
489: printf("-> 1: %s\n", d_BIN);
490:
491: return;
492: }
493: else if ((*s_etat_processus).test_instruction == 'Y')
494: {
495: (*s_etat_processus).nombre_arguments = -1;
496: return;
497: }
498:
499: if (test_cfsf(s_etat_processus, 31) == d_vrai)
500: {
501: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
502: {
503: return;
504: }
505: }
506:
507: l_base_pile = (*s_etat_processus).l_base_pile_last;
508: (*s_etat_processus).l_base_pile_last = NULL;
509:
510: for(i = 0; i < 8; i++)
511: {
512: instruction_rr(s_etat_processus);
513:
514: if (((*s_etat_processus).erreur_systeme != d_es) ||
515: ((*s_etat_processus).erreur_execution != d_ex))
516: {
517: break;
518: }
519: }
520:
521: if (test_cfsf(s_etat_processus, 31) == d_vrai)
522: {
523: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
524: {
525: return;
526: }
527: }
528:
529: (*s_etat_processus).l_base_pile_last = l_base_pile;
530: return;
531: }
532:
533:
534: /*
535: ================================================================================
536: Fonction 'redraw'
537: ================================================================================
538: Entrées : pointeur sur une structure struct_processus
539: --------------------------------------------------------------------------------
540: Sorties :
541: --------------------------------------------------------------------------------
542: Effets de bord : néant
543: ================================================================================
544: */
545:
546: void
547: instruction_redraw(struct_processus *s_etat_processus)
548: {
549: (*s_etat_processus).erreur_execution = d_ex;
550:
551: if ((*s_etat_processus).affichage_arguments == 'Y')
552: {
553: printf("\n REDRAW ");
554:
555: if ((*s_etat_processus).langue == 'F')
556: {
557: printf("(redessine une courbe)\n\n");
558: printf(" Aucun argument\n");
559: }
560: else
561: {
562: printf("(redraw a graphic)\n\n");
563: printf(" No argument\n");
564: }
565:
566: return;
567: }
568: else if ((*s_etat_processus).test_instruction == 'Y')
569: {
570: (*s_etat_processus).nombre_arguments = -1;
571: return;
572: }
573:
574: if (test_cfsf(s_etat_processus, 31) == d_vrai)
575: {
576: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
577: {
578: return;
579: }
580: }
581:
582: if ((*s_etat_processus).mise_a_jour_trace_requise == d_vrai)
583: {
584: (*s_etat_processus).erreur_execution = d_ex_graphique_memorise;
585: return;
586: }
587:
588: if ((*s_etat_processus).fichiers_graphiques != NULL)
589: {
590: appel_gnuplot(s_etat_processus, 'N');
591: }
592:
593: return;
594: }
595:
596:
597: /*
598: ================================================================================
599: Fonction 'remove'
600: ================================================================================
601: Entrées : pointeur sur une structure struct_processus
602: --------------------------------------------------------------------------------
603: Sorties :
604: --------------------------------------------------------------------------------
605: Effets de bord : néant
606: ================================================================================
607: */
608:
609: void
610: instruction_remove(struct_processus *s_etat_processus)
611: {
612: struct_objet *s_objet_argument;
613:
614: (*s_etat_processus).erreur_execution = d_ex;
615:
616: if ((*s_etat_processus).affichage_arguments == 'Y')
617: {
618: printf("\n REMOVE ");
619:
620: if ((*s_etat_processus).langue == 'F')
621: {
622: printf("(retrait d'une bibliothèque dynamique)\n\n");
623: }
624: else
625: {
626: printf("(remove a shared library)\n\n");
627: }
628:
629: printf(" 1: %s\n", d_SLB);
630:
631: return;
632: }
633: else if ((*s_etat_processus).test_instruction == 'Y')
634: {
635: (*s_etat_processus).nombre_arguments = -1;
636: return;
637: }
638:
639: if (test_cfsf(s_etat_processus, 31) == d_vrai)
640: {
641: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
642: {
643: return;
644: }
645: }
646:
647: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
648: &s_objet_argument) == d_erreur)
649: {
650: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
651: return;
652: }
653:
654: if ((*s_objet_argument).type == SLB)
655: {
656: /*
657: * On ne décharge que les bibliothèques qui ont été chargées dans
658: * le couple pid/tid courant.
659: */
660:
661: if (((*((struct_bibliotheque *) (*s_objet_argument).objet)).pid ==
662: getpid()) && (pthread_equal((*((struct_bibliotheque *)
663: (*s_objet_argument).objet)).tid, pthread_self()) != 0))
664: {
665: if (retrait_bibliotheque(s_etat_processus,
666: (*s_objet_argument).objet) == d_erreur)
667: {
668: liberation(s_etat_processus, s_objet_argument);
669:
670: return;
671: }
672: }
673: }
674: else
675: {
676: liberation(s_etat_processus, s_objet_argument);
677:
678: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
679: return;
680: }
681:
682: liberation(s_etat_processus, s_objet_argument);
683:
684: return;
685: }
686:
687:
688: /*
689: ================================================================================
690: Fonction 'relax'
691: ================================================================================
692: Entrées : pointeur sur une structure struct_processus
693: --------------------------------------------------------------------------------
694: Sorties :
695: --------------------------------------------------------------------------------
696: Effets de bord : néant
697: ================================================================================
698: */
699:
700: void
701: instruction_relax(struct_processus *s_etat_processus)
702: {
703: (*s_etat_processus).erreur_execution = d_ex;
704:
705: if ((*s_etat_processus).affichage_arguments == 'Y')
706: {
707: printf("\n RELAX ");
708:
709: if ((*s_etat_processus).langue == 'F')
710: {
711: printf("(ne fait rien)\n\n");
712: printf(" Aucun argument\n");
713: }
714: else
715: {
716: printf("(do nothing)\n\n");
717: printf(" No argument\n");
718: }
719:
720: return;
721: }
722: else if ((*s_etat_processus).test_instruction == 'Y')
723: {
724: (*s_etat_processus).nombre_arguments = 1;
725: return;
726: }
727:
728: /*
729: * Cette instruction ne fait rien. Elle existe pour être symétrique
730: * à l'instruction CHS et permet de traiter les équations de façon
731: * simple (Ex : '+pi'). En principe, elle n'a pas a être appelée
732: * directement par l'utilisateur.
733: */
734:
735: return;
736: }
737:
738:
739: /*
740: ================================================================================
741: Fonction 'rewind'
742: ================================================================================
743: Entrées : pointeur sur une structure struct_processus
744: --------------------------------------------------------------------------------
745: Sorties :
746: --------------------------------------------------------------------------------
747: Effets de bord : néant
748: ================================================================================
749: */
750:
751: void
752: instruction_rewind(struct_processus *s_etat_processus)
753: {
754: file *descripteur;
755:
756: struct_objet *s_objet_argument;
757:
758: (*s_etat_processus).erreur_execution = d_ex;
759:
760: if ((*s_etat_processus).affichage_arguments == 'Y')
761: {
762: printf("\n REWIND ");
763:
764: if ((*s_etat_processus).langue == 'F')
765: {
766: printf("(retour au début d'un fichier)\n\n");
767: }
768: else
769: {
770: printf("(rewind a file)\n\n");
771: }
772:
773: printf(" 1: %s\n", d_FCH);
774:
775: return;
776: }
777: else if ((*s_etat_processus).test_instruction == 'Y')
778: {
779: (*s_etat_processus).nombre_arguments = -1;
780: return;
781: }
782:
783: if (test_cfsf(s_etat_processus, 31) == d_vrai)
784: {
785: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
786: {
787: return;
788: }
789: }
790:
791: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
792: &s_objet_argument) == d_erreur)
793: {
794: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
795: return;
796: }
797:
798: if ((*s_objet_argument).type == FCH)
799: {
800: if ((descripteur = descripteur_fichier(s_etat_processus,
801: (struct_fichier *) (*s_objet_argument).objet)) == NULL)
802: {
803: return;
804: }
805:
806: if (fseek(descripteur, (long) 0, SEEK_SET) != 0)
807: {
808: liberation(s_etat_processus, s_objet_argument);
809:
810: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
811: return;
812: }
813: }
814: else
815: {
816: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
817: return;
818: }
819:
820: liberation(s_etat_processus, s_objet_argument);
821:
822: return;
823: }
824:
825:
826: /*
827: ================================================================================
828: Fonction 'read'
829: ================================================================================
830: Entrées : pointeur sur une structure struct_processus
831: --------------------------------------------------------------------------------
832: Sorties :
833: --------------------------------------------------------------------------------
834: Effets de bord : néant
835: ================================================================================
836: */
837:
838: void
839: instruction_read(struct_processus *s_etat_processus)
840: {
841: file *descripteur;
842:
843: logical1 indicateur_48;
844: logical1 presence_chaine;
845: logical1 presence_indicateur;
846:
847: long longueur_effective;
848: long longueur_enregistrement;
849: long longueur_questure;
850: long niveau;
851: long pointeur;
852: long position_finale;
853: long position_initiale;
854:
855: socklen_t longueur_adresse;
856:
857: struct flock lock;
858:
859: struct sockaddr_un adresse_unix;
860: struct sockaddr_in adresse_ipv4;
861: struct sockaddr_in6 adresse_ipv6;
862:
863: struct timespec attente;
864:
865: struct_objet *s_objet_adresse;
866: struct_objet *s_objet_argument;
867: struct_objet *s_objet_resultat;
868: struct_objet *s_objet_type;
869:
870: unsigned char caractere;
871: unsigned char *tampon_lecture;
872: unsigned char *tampon;
873:
874: unsigned long i;
875:
876: (*s_etat_processus).erreur_execution = d_ex;
877:
878: attente.tv_sec = 0;
879: attente.tv_nsec = GRANULARITE_us * 1000;
880:
881: if ((*s_etat_processus).affichage_arguments == 'Y')
882: {
883: printf("\n READ ");
884:
885: if ((*s_etat_processus).langue == 'F')
886: {
887: printf("(lecture d'un enregistrement d'un fichier)\n\n");
888: }
889: else
890: {
891: printf("(read a record of a file)\n\n");
892: }
893:
894: printf(" 1: %s, %s\n", d_FCH, d_SCK);
895: printf(" To be fixed !\n");
896:
897: return;
898: }
899: else if ((*s_etat_processus).test_instruction == 'Y')
900: {
901: (*s_etat_processus).nombre_arguments = -1;
902: return;
903: }
904:
905: if (test_cfsf(s_etat_processus, 31) == d_vrai)
906: {
907: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
908: {
909: return;
910: }
911: }
912:
913: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
914: &s_objet_argument) == d_erreur)
915: {
916: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
917: return;
918: }
919:
920: if ((*s_objet_argument).type == FCH)
921: {
922: /*
923: * Vérification des verrous
924: */
925:
926: lock.l_type = F_RDLCK;
927: lock.l_whence = SEEK_SET;
928: lock.l_start = 0;
929: lock.l_len = 0;
930: lock.l_pid = getpid();
931:
932: if ((descripteur = descripteur_fichier(s_etat_processus,
933: (struct_fichier *) (*s_objet_argument).objet)) == NULL)
934: {
935: return;
936: }
937:
938: if (fcntl(fileno(descripteur), F_GETLK, &lock) == -1)
939: {
940: liberation(s_etat_processus, s_objet_argument);
941:
942: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
943: return;
944: }
945:
946: if (lock.l_type != F_UNLCK)
947: {
948: liberation(s_etat_processus, s_objet_argument);
949:
950: (*s_etat_processus).erreur_execution =
951: d_ex_fichier_verrouille;
952: return;
953: }
954:
955: /*
956: * Vérification de l'autorisation de lecture
957: */
958:
959: if ((*((struct_fichier *) (*s_objet_argument).objet)).protection == 'W')
960: {
961: liberation(s_etat_processus, s_objet_argument);
962:
963: (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
964: return;
965: }
966: else if ((*((struct_fichier *) (*s_objet_argument).objet)).protection
967: == 'N')
968: {
969: if (fflush(descripteur) != 0)
970: {
971: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
972: return;
973: }
974: }
975:
976: if ((*((struct_fichier *) (*s_objet_argument).objet)).binaire == 'N')
977: {
978: /*
979: * Fichiers formatés
980: */
981:
982: if ((*((struct_fichier *) (*s_objet_argument).objet)).acces == 'S')
983: {
984: /*
985: * Fichiers séquentiels
986: */
987:
988: longueur_questure = 256;
989:
990: if ((tampon_lecture = malloc(longueur_questure *
991: sizeof(unsigned char))) == NULL)
992: {
993: (*s_etat_processus).erreur_systeme =
994: d_es_allocation_memoire;
995: return;
996: }
997:
998: if ((position_initiale = ftell(descripteur)) == -1)
999: {
1000: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1001: return;
1002: }
1003:
1004: do
1005: {
1006: longueur_effective = fread(tampon_lecture,
1007: (size_t) sizeof(unsigned char), longueur_questure,
1008: descripteur);
1009:
1010: pointeur = 0;
1011: presence_indicateur = d_faux;
1012:
1013: while(pointeur < longueur_effective)
1014: {
1015: if (tampon_lecture[pointeur] == '{')
1016: {
1017: presence_indicateur = d_vrai;
1018: break;
1019: }
1020:
1021: position_initiale++;
1022: pointeur++;
1023: }
1024:
1025: if (presence_indicateur == d_vrai)
1026: {
1027: break;
1028: }
1029: } while(longueur_effective == longueur_questure);
1030:
1031: if (presence_indicateur == d_faux)
1032: {
1033: liberation(s_etat_processus, s_objet_argument);
1034: free(tampon_lecture);
1035:
1036: (*s_etat_processus).erreur_execution =
1037: d_ex_fin_de_fichier_atteinte;
1038: return;
1039: }
1040:
1041: position_finale = position_initiale + 1;
1042: presence_chaine = d_faux;
1043: niveau = 1;
1044:
1045: if (fseek(descripteur, position_finale, SEEK_SET) != 0)
1046: {
1047: liberation(s_etat_processus, s_objet_argument);
1048: free(tampon_lecture);
1049:
1050: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1051: return;
1052: }
1053:
1054: do
1055: {
1056: longueur_effective = fread(tampon_lecture,
1057: (size_t) sizeof(unsigned char), longueur_questure,
1058: descripteur);
1059:
1060: pointeur = 0;
1061: presence_indicateur = d_faux;
1062:
1063: while(pointeur < longueur_effective)
1064: {
1065: if (tampon_lecture[pointeur] == '"')
1066: {
1067: presence_chaine = (presence_chaine == d_vrai)
1068: ? d_faux : d_vrai;
1069: }
1070: else
1071: {
1072: if (presence_chaine == d_faux)
1073: {
1074: if (tampon_lecture[pointeur] == '{')
1075: {
1076: niveau++;
1077: }
1078: else if (tampon_lecture[pointeur] == '}')
1079: {
1080: niveau--;
1081: }
1082: }
1083: }
1084:
1085: position_finale++;
1086: pointeur++;
1087:
1088: if (niveau == 0)
1089: {
1090: presence_indicateur = d_vrai;
1091: break;
1092: }
1093: }
1094:
1095: if (presence_indicateur == d_vrai)
1096: {
1097: break;
1098: }
1099: } while(longueur_effective == longueur_questure);
1100:
1101: if (presence_indicateur == d_faux)
1102: {
1103: liberation(s_etat_processus, s_objet_argument);
1104: free(tampon_lecture);
1105:
1106: (*s_etat_processus).erreur_execution =
1107: d_ex_fin_de_fichier_atteinte;
1108: return;
1109: }
1110:
1111: free(tampon_lecture);
1112: longueur_enregistrement = position_finale - position_initiale;
1113:
1114: if ((tampon_lecture = malloc((longueur_enregistrement + 1) *
1115: sizeof(unsigned char))) == NULL)
1116: {
1117: (*s_etat_processus).erreur_systeme =
1118: d_es_allocation_memoire;
1119: return;
1120: }
1121:
1122: if (fseek(descripteur, position_initiale, SEEK_SET) != 0)
1123: {
1124: liberation(s_etat_processus, s_objet_argument);
1125: free(tampon_lecture);
1126:
1127: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1128: return;
1129: }
1130:
1131: longueur_effective = fread(tampon_lecture,
1132: (size_t) sizeof(unsigned char),
1133: (size_t) longueur_enregistrement,
1134: descripteur);
1135:
1136: if (longueur_effective != longueur_enregistrement)
1137: {
1138: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1139: return;
1140: }
1141:
1142: tampon_lecture[longueur_enregistrement] = d_code_fin_chaine;
1143: tampon = (*s_etat_processus).instruction_courante;
1144: (*s_etat_processus).instruction_courante = tampon_lecture;
1145:
1146: indicateur_48 = test_cfsf(s_etat_processus, 48);
1147: cf(s_etat_processus, 48);
1148:
1149: recherche_type(s_etat_processus);
1150:
1151: if ((*s_etat_processus).erreur_execution != d_ex)
1152: {
1153: (*s_etat_processus).instruction_courante = tampon;
1154: free(tampon_lecture);
1155:
1156: liberation(s_etat_processus, s_objet_argument);
1157:
1158: return;
1159: }
1160:
1161: if (indicateur_48 == d_vrai)
1162: {
1163: sf(s_etat_processus, 48);
1164: }
1165: else
1166: {
1167: cf(s_etat_processus, 48);
1168: }
1169:
1170: (*s_etat_processus).instruction_courante = tampon;
1171: free(tampon_lecture);
1172: }
1173: else if ((*((struct_fichier *) (*s_objet_argument).objet)).acces
1174: == 'D')
1175: {
1176: }
1177: else
1178: {
1179: }
1180: }
1181: else if ((*((struct_fichier *) (*s_objet_argument).objet)).binaire
1182: == 'Y')
1183: {
1184: /*
1185: * Fichiers non formatés
1186: */
1187: }
1188: else
1189: {
1190: /*
1191: * Fichiers de type FLOW
1192: */
1193: }
1194: }
1195: else if ((*s_objet_argument).type == SCK)
1196: {
1197: /*
1198: * Vérification de l'autorisation de lecture
1199: */
1200:
1201: if ((*((struct_socket *) (*s_objet_argument).objet)).protection == 'W')
1202: {
1203: liberation(s_etat_processus, s_objet_argument);
1204:
1205: (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
1206: return;
1207: }
1208:
1209: /*
1210: * Vérification de l'écoute de la socket si celle-ci est connectée
1211: */
1212:
1213: if ((strcmp((*((struct_socket *) (*s_objet_argument).objet)).type,
1214: "STREAM") == 0) || (strcmp((*((struct_socket *)
1215: (*s_objet_argument).objet)).type, "SEQUENTIAL DATAGRAM") == 0))
1216: {
1217: if ((*((struct_socket *) (*s_objet_argument).objet))
1218: .socket_en_ecoute == 'Y')
1219: {
1220: liberation(s_etat_processus, s_objet_argument);
1221:
1222: (*s_etat_processus).erreur_execution = d_ex_socket_en_ecoute;
1223: return;
1224: }
1225: }
1226:
1227: if ((*((struct_socket *) (*s_objet_argument).objet)).binaire == 'N')
1228: { // Socket formatée
1229: longueur_questure = 256;
1230:
1231: do
1232: {
1233: if ((tampon_lecture = malloc((longueur_questure + 1) *
1234: sizeof(unsigned char))) == NULL)
1235: {
1236: (*s_etat_processus).erreur_systeme =
1237: d_es_allocation_memoire;
1238: return;
1239: }
1240:
1241: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1242: {
1243: (*s_etat_processus).erreur_systeme = d_es_processus;
1244: return;
1245: }
1246:
1247: for(;;)
1248: {
1249: if ((*((struct_socket *) (*s_objet_argument).objet)).domaine
1250: == PF_UNIX)
1251: {
1252: longueur_adresse = sizeof(adresse_unix);
1253: longueur_effective = recvfrom((*((struct_socket *)
1254: (*s_objet_argument).objet)).socket,
1255: tampon_lecture, longueur_questure,
1256: MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
1257: &adresse_unix, &longueur_adresse);
1258: }
1259: else if ((*((struct_socket *) (*s_objet_argument).objet))
1260: .domaine == PF_INET)
1261: {
1262: longueur_adresse = sizeof(adresse_ipv4);
1263: longueur_effective = recvfrom((*((struct_socket *)
1264: (*s_objet_argument).objet)).socket,
1265: tampon_lecture, longueur_questure,
1266: MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
1267: &adresse_ipv4, &longueur_adresse);
1268: }
1269: else if ((*((struct_socket *) (*s_objet_argument).objet))
1270: .domaine == PF_INET6)
1271: {
1272: longueur_adresse = sizeof(adresse_ipv6);
1273: longueur_effective = recvfrom((*((struct_socket *)
1274: (*s_objet_argument).objet)).socket,
1275: tampon_lecture, longueur_questure,
1276: MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
1277: &adresse_ipv6, &longueur_adresse);
1278: }
1279: else
1280: {
1281: free(tampon_lecture);
1282: liberation(s_etat_processus, s_objet_argument);
1283:
1284: while(sem_wait(&((*s_etat_processus)
1285: .semaphore_fork)) == -1)
1286: {
1287: if (errno != EINTR)
1288: {
1289: (*s_etat_processus).erreur_systeme =
1290: d_es_processus;
1291: return;
1292: }
1293: }
1294:
1295: (*s_etat_processus).erreur_execution =
1296: d_ex_erreur_acces_fichier;
1297: return;
1298: }
1299:
1300: if (longueur_effective < 0)
1301: {
1302: nanosleep(&attente, NULL);
1303: scrutation_injection(s_etat_processus);
1304: }
1305:
1306: if (((*s_etat_processus).var_volatile_requete_arret == -1)
1307: || (longueur_effective >= 0))
1308: {
1309: break;
1310: }
1311: }
1312:
1313: while(sem_wait(&((*s_etat_processus).semaphore_fork))
1314: == -1)
1315: {
1316: if (errno != EINTR)
1317: {
1318: (*s_etat_processus).erreur_systeme = d_es_processus;
1319: return;
1320: }
1321: }
1322:
1323: if ((*s_etat_processus).var_volatile_requete_arret == -1)
1324: {
1325:
1326: /*
1327: * Si le père tue le processus courant grâce au signal
1328: * SIGFSTOP, on ne renvoie pas d'erreur. Ce fonctionnement
1329: * correspond à l'utilisation de STOP sur le processus
1330: * en cours. La variable longueur_effective vaut '-1'.
1331: */
1332:
1333: free(tampon_lecture);
1334: liberation(s_etat_processus, s_objet_argument);
1335: return;
1336: }
1337:
1338: if (longueur_effective == -1)
1339: {
1340: free(tampon_lecture);
1341: liberation(s_etat_processus, s_objet_argument);
1342:
1343: (*s_etat_processus).erreur_execution =
1344: d_ex_erreur_acces_fichier;
1345: return;
1346: }
1347:
1348: position_initiale = 0;
1349: presence_indicateur = d_faux;
1350:
1351: do
1352: {
1353: if (tampon_lecture[position_initiale] == '{')
1354: {
1355: presence_indicateur = d_vrai;
1356: break;
1357: }
1358:
1359: position_initiale++;
1360: } while(position_initiale < longueur_effective);
1361:
1362:
1363: if (presence_indicateur == d_vrai)
1364: {
1365: position_finale = position_initiale + 1;
1366: presence_chaine = d_faux;
1367: presence_indicateur = d_faux;
1368: niveau = 1;
1369:
1370: while(position_finale < longueur_effective)
1371: {
1372: caractere = tampon_lecture[position_finale];
1373:
1374: if (caractere == '"')
1375: {
1376: presence_chaine = (presence_chaine == d_vrai)
1377: ? d_faux : d_vrai;
1378: }
1379: else
1380: {
1381: if (presence_chaine == d_faux)
1382: {
1383: if (caractere == '{')
1384: {
1385: niveau++;
1386: }
1387: else if (caractere == '}')
1388: {
1389: niveau--;
1390: }
1391: }
1392: }
1393:
1394: if (niveau == 0)
1395: {
1396: presence_indicateur = d_vrai;
1397: break;
1398: }
1399:
1400: position_finale++;
1401: }
1402: }
1403:
1404: if (presence_indicateur == d_faux)
1405: {
1406: if (longueur_effective < longueur_questure)
1407: {
1408: liberation(s_etat_processus, s_objet_argument);
1409: free(tampon_lecture);
1410:
1411: (*s_etat_processus).erreur_execution =
1412: d_ex_fin_de_fichier_atteinte;
1413: return;
1414: }
1415:
1416: free(tampon_lecture);
1417: longueur_questure *= 2;
1418: }
1419: } while(presence_indicateur == d_faux);
1420:
1421: tampon_lecture[++position_finale] = d_code_fin_chaine;
1422: tampon = (*s_etat_processus).instruction_courante;
1423: (*s_etat_processus).instruction_courante = &(tampon_lecture
1424: [position_initiale]);
1425:
1426: indicateur_48 = test_cfsf(s_etat_processus, 48);
1427: cf(s_etat_processus, 48);
1428:
1429: recherche_type(s_etat_processus);
1430:
1431: if ((*s_etat_processus).erreur_execution != d_ex)
1432: {
1433: (*s_etat_processus).instruction_courante = tampon;
1434: free(tampon_lecture);
1435:
1436: liberation(s_etat_processus, s_objet_argument);
1437:
1438: return;
1439: }
1440:
1441: if (indicateur_48 == d_vrai)
1442: {
1443: sf(s_etat_processus, 48);
1444: }
1445: else
1446: {
1447: cf(s_etat_processus, 48);
1448: }
1449:
1450: (*s_etat_processus).instruction_courante = tampon;
1451:
1452: /*
1453: * Création de la liste de sortie
1454: */
1455:
1456: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1457: &s_objet_type) == d_erreur)
1458: {
1459: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1460: return;
1461: }
1462:
1463: if ((s_objet_resultat = allocation(s_etat_processus, LST))
1464: == NULL)
1465: {
1466: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1467: return;
1468: }
1469:
1470: if (((*s_objet_resultat).objet =
1471: allocation_maillon(s_etat_processus)) == NULL)
1472: {
1473: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1474: return;
1475: }
1476:
1477: (*((struct_liste_chainee *) (*s_objet_resultat).objet))
1478: .donnee = s_objet_type;
1479:
1480: if (((*((struct_liste_chainee *) (*s_objet_resultat).objet))
1481: .suivant = allocation_maillon(s_etat_processus)) == NULL)
1482: {
1483: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1484: return;
1485: }
1486:
1487: (*(*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant)
1488: .suivant = NULL;
1489:
1490: if ((s_objet_adresse = allocation(s_etat_processus, LST))
1491: == NULL)
1492: {
1493: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1494: return;
1495: }
1496:
1497: (*(*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant)
1498: .donnee = s_objet_adresse;
1499:
1500: /*
1501: * Les informations concernant la cible sont valides si
1502: * la socket est non connectée et des domaines INET ou INET6.
1503: * Dans tous les autres cas, on renvoie une liste vide.
1504: */
1505:
1506: if (((*((struct_socket *) (*s_objet_argument).objet)).domaine
1507: == PF_UNIX) || (strcmp((*((struct_socket *)
1508: (*s_objet_argument).objet)).type, "STREAM") == 0) ||
1509: (strcmp((*((struct_socket *) (*s_objet_argument).objet))
1510: .type, "SEQUENTIAL DATAGRAM") == 0))
1511: {
1512: longueur_adresse = 0;
1513: recvfrom((*((struct_socket *)
1514: (*s_objet_argument).objet)).socket, tampon_lecture,
1515: position_finale, MSG_DONTWAIT,
1516: NULL, &longueur_adresse);
1517:
1518: (*s_objet_adresse).objet = NULL;
1519: }
1520: else if ((*((struct_socket *) (*s_objet_argument).objet))
1521: .domaine == PF_INET)
1522: {
1523: longueur_adresse = sizeof(adresse_ipv4);
1524: recvfrom((*((struct_socket *)
1525: (*s_objet_argument).objet)).socket, tampon_lecture,
1526: position_finale, MSG_DONTWAIT,
1527: (struct sockaddr *) &adresse_ipv4, &longueur_adresse);
1528:
1529: if (((*s_objet_adresse).objet =
1530: allocation_maillon(s_etat_processus)) == NULL)
1531: {
1532: (*s_etat_processus).erreur_systeme =
1533: d_es_allocation_memoire;
1534: return;
1535: }
1536:
1537: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
1538: .donnee = allocation(s_etat_processus, VIN)) == NULL)
1539: {
1540: (*s_etat_processus).erreur_systeme =
1541: d_es_allocation_memoire;
1542: return;
1543: }
1544:
1545: (*((struct_vecteur *) (*(*((struct_liste_chainee *)
1546: (*s_objet_adresse).objet)).donnee).objet)).taille = 4;
1547:
1548: if (((*((struct_vecteur *) (*(*((struct_liste_chainee *)
1549: (*s_objet_adresse).objet)).donnee).objet)).tableau =
1550: malloc(4 * sizeof(integer8))) == NULL)
1551: {
1552: (*s_etat_processus).erreur_systeme =
1553: d_es_allocation_memoire;
1554: return;
1555: }
1556:
1557: ((integer8 *) (*((struct_vecteur *)
1558: (*(*((struct_liste_chainee *) (*s_objet_adresse)
1559: .objet)).donnee).objet)).tableau)[0] =
1560: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 24) & 0xFF;
1561: ((integer8 *) (*((struct_vecteur *)
1562: (*(*((struct_liste_chainee *) (*s_objet_adresse)
1563: .objet)).donnee).objet)).tableau)[1] =
1564: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 16) & 0xFF;
1565: ((integer8 *) (*((struct_vecteur *)
1566: (*(*((struct_liste_chainee *) (*s_objet_adresse)
1567: .objet)).donnee).objet)).tableau)[2] =
1568: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 8) & 0xFF;
1569: ((integer8 *) (*((struct_vecteur *)
1570: (*(*((struct_liste_chainee *) (*s_objet_adresse)
1571: .objet)).donnee).objet)).tableau)[3] =
1572: ntohl(adresse_ipv4.sin_addr.s_addr) & 0xFF;
1573:
1574: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
1575: .suivant = allocation_maillon(s_etat_processus))
1576: == NULL)
1577: {
1578: (*s_etat_processus).erreur_systeme =
1579: d_es_allocation_memoire;
1580: return;
1581: }
1582:
1583: if (((*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
1584: .suivant).donnee = allocation(s_etat_processus, INT))
1585: == NULL)
1586: {
1587: (*s_etat_processus).erreur_systeme =
1588: d_es_allocation_memoire;
1589: return;
1590: }
1591:
1592: (*((integer8 *) (*(*(*((struct_liste_chainee *)
1593: (*s_objet_adresse) .objet)).suivant).donnee).objet)) =
1594: (integer8) ntohs(adresse_ipv4.sin_port);
1595:
1596: (*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
1597: .suivant).suivant = NULL;
1598: }
1599: else if ((*((struct_socket *) (*s_objet_argument).objet))
1600: .domaine == PF_INET6)
1601: {
1602: longueur_adresse = sizeof(adresse_ipv6);
1603: recvfrom((*((struct_socket *)
1604: (*s_objet_argument).objet)).socket, tampon_lecture,
1605: position_finale, MSG_DONTWAIT,
1606: (struct sockaddr *) &adresse_ipv6, &longueur_adresse);
1607:
1608: if (((*s_objet_adresse).objet =
1609: allocation_maillon(s_etat_processus)) == NULL)
1610: {
1611: (*s_etat_processus).erreur_systeme =
1612: d_es_allocation_memoire;
1613: return;
1614: }
1615:
1616: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
1617: .donnee = allocation(s_etat_processus, VIN)) == NULL)
1618: {
1619: (*s_etat_processus).erreur_systeme =
1620: d_es_allocation_memoire;
1621: return;
1622: }
1623:
1624: (*((struct_vecteur *) (*(*((struct_liste_chainee *)
1625: (*s_objet_adresse).objet)).donnee).objet)).taille = 16;
1626:
1627: if (((*((struct_vecteur *) (*(*((struct_liste_chainee *)
1628: (*s_objet_adresse).objet)).donnee).objet)).tableau =
1629: malloc(16 * sizeof(integer8))) == NULL)
1630: {
1631: (*s_etat_processus).erreur_systeme =
1632: d_es_allocation_memoire;
1633: return;
1634: }
1635:
1636: for(i = 0; i < 16; i++)
1637: {
1638: ((integer8 *) (*((struct_vecteur *)
1639: (*(*((struct_liste_chainee *) (*s_objet_adresse)
1640: .objet)).donnee).objet)).tableau)[0] =
1641: adresse_ipv6.sin6_addr.s6_addr[i];
1642: }
1643:
1644: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
1645: .suivant = allocation_maillon(s_etat_processus))
1646: == NULL)
1647: {
1648: (*s_etat_processus).erreur_systeme =
1649: d_es_allocation_memoire;
1650: return;
1651: }
1652:
1653: if (((*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
1654: .suivant).donnee = allocation(s_etat_processus, INT))
1655: == NULL)
1656: {
1657: (*s_etat_processus).erreur_systeme =
1658: d_es_allocation_memoire;
1659: return;
1660: }
1661:
1662: (*((integer8 *) (*(*(*((struct_liste_chainee *)
1663: (*s_objet_adresse) .objet)).suivant).donnee).objet)) =
1664: (integer8) ntohs(adresse_ipv6.sin6_port);
1665:
1666: (*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
1667: .suivant).suivant = NULL;
1668: }
1669: else
1670: {
1671: longueur_adresse = 0;
1672: recvfrom((*((struct_socket *)
1673: (*s_objet_argument).objet)).socket, tampon_lecture,
1674: position_finale, MSG_DONTWAIT,
1675: NULL, &longueur_adresse);
1676: }
1677:
1678: free(tampon_lecture);
1679:
1680: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1681: s_objet_resultat) == d_erreur)
1682: {
1683: return;
1684: }
1685: }
1686: else
1687: {
1688: /* FLOW ou UNFORMATTED */
1689: }
1690: }
1691: else
1692: {
1693: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1694: return;
1695: }
1696:
1697: liberation(s_etat_processus, s_objet_argument);
1698:
1699: return;
1700: }
1701:
1702: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>