Annotation of rpl/src/instructions_r4.c, revision 1.5
1.1 bertrand 1: /*
2: ================================================================================
1.4 bertrand 3: RPL/2 (R) version 4.0.12
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 '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: {
1.5 ! bertrand 754: struct_descripteur_fichier *descripteur;
1.1 bertrand 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:
1.5 ! bertrand 806: if ((*descripteur).type == 'C')
! 807: {
! 808: if (fseek((*descripteur).descripteur_c, (long) 0, SEEK_SET) != 0)
! 809: {
! 810: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 811: return;
! 812: }
! 813: }
! 814: else
1.1 bertrand 815: {
816: liberation(s_etat_processus, s_objet_argument);
817:
1.5 ! bertrand 818: (*s_etat_processus).erreur_execution = d_ex_erreur_type_fichier;
1.1 bertrand 819: return;
820: }
821: }
822: else
823: {
824: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
825: return;
826: }
827:
828: liberation(s_etat_processus, s_objet_argument);
829:
830: return;
831: }
832:
833:
834: /*
835: ================================================================================
836: Fonction 'read'
837: ================================================================================
838: Entrées : pointeur sur une structure struct_processus
839: --------------------------------------------------------------------------------
840: Sorties :
841: --------------------------------------------------------------------------------
842: Effets de bord : néant
843: ================================================================================
844: */
845:
846: void
847: instruction_read(struct_processus *s_etat_processus)
848: {
849: logical1 indicateur_48;
850: logical1 presence_chaine;
851: logical1 presence_indicateur;
852:
853: long longueur_effective;
854: long longueur_enregistrement;
855: long longueur_questure;
856: long niveau;
857: long pointeur;
858: long position_finale;
859: long position_initiale;
860:
861: socklen_t longueur_adresse;
862:
863: struct flock lock;
864:
865: struct sockaddr_un adresse_unix;
866: struct sockaddr_in adresse_ipv4;
867: struct sockaddr_in6 adresse_ipv6;
868:
869: struct timespec attente;
870:
1.5 ! bertrand 871: struct_descripteur_fichier *descripteur;
! 872:
1.1 bertrand 873: struct_objet *s_objet_adresse;
874: struct_objet *s_objet_argument;
875: struct_objet *s_objet_resultat;
876: struct_objet *s_objet_type;
877:
878: unsigned char caractere;
879: unsigned char *tampon_lecture;
880: unsigned char *tampon;
881:
882: unsigned long i;
883:
884: (*s_etat_processus).erreur_execution = d_ex;
885:
886: attente.tv_sec = 0;
887: attente.tv_nsec = GRANULARITE_us * 1000;
888:
889: if ((*s_etat_processus).affichage_arguments == 'Y')
890: {
891: printf("\n READ ");
892:
893: if ((*s_etat_processus).langue == 'F')
894: {
895: printf("(lecture d'un enregistrement d'un fichier)\n\n");
896: }
897: else
898: {
899: printf("(read a record of a file)\n\n");
900: }
901:
902: printf(" 1: %s, %s\n", d_FCH, d_SCK);
903: printf(" To be fixed !\n");
904:
905: return;
906: }
907: else if ((*s_etat_processus).test_instruction == 'Y')
908: {
909: (*s_etat_processus).nombre_arguments = -1;
910: return;
911: }
912:
913: if (test_cfsf(s_etat_processus, 31) == d_vrai)
914: {
915: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
916: {
917: return;
918: }
919: }
920:
921: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
922: &s_objet_argument) == d_erreur)
923: {
924: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
925: return;
926: }
927:
928: if ((*s_objet_argument).type == FCH)
929: {
1.5 ! bertrand 930: if ((descripteur = descripteur_fichier(s_etat_processus,
! 931: (struct_fichier *) (*s_objet_argument).objet)) == NULL)
! 932: {
! 933: return;
! 934: }
! 935:
1.1 bertrand 936: /*
937: * Vérification des verrous
938: */
939:
940: lock.l_type = F_RDLCK;
941: lock.l_whence = SEEK_SET;
942: lock.l_start = 0;
943: lock.l_len = 0;
944: lock.l_pid = getpid();
945:
1.5 ! bertrand 946: if (fcntl(fileno((*descripteur).descripteur_c), F_GETLK, &lock)
! 947: == -1)
1.1 bertrand 948: {
949: liberation(s_etat_processus, s_objet_argument);
950:
951: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
952: return;
953: }
954:
955: if (lock.l_type != F_UNLCK)
956: {
957: liberation(s_etat_processus, s_objet_argument);
958:
959: (*s_etat_processus).erreur_execution =
960: d_ex_fichier_verrouille;
961: return;
962: }
963:
964: /*
965: * Vérification de l'autorisation de lecture
966: */
967:
968: if ((*((struct_fichier *) (*s_objet_argument).objet)).protection == 'W')
969: {
970: liberation(s_etat_processus, s_objet_argument);
971:
972: (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
973: return;
974: }
975: else if ((*((struct_fichier *) (*s_objet_argument).objet)).protection
976: == 'N')
977: {
1.5 ! bertrand 978: if ((*descripteur).type == 'C')
1.1 bertrand 979: {
1.5 ! bertrand 980: if (fflush((*descripteur).descripteur_c) != 0)
! 981: {
! 982: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 983: return;
! 984: }
1.1 bertrand 985: }
986: }
987:
988: if ((*((struct_fichier *) (*s_objet_argument).objet)).binaire == 'N')
989: {
990: /*
991: * Fichiers formatés
992: */
993:
994: if ((*((struct_fichier *) (*s_objet_argument).objet)).acces == 'S')
995: {
996: /*
997: * Fichiers séquentiels
998: */
999:
1000: longueur_questure = 256;
1001:
1002: if ((tampon_lecture = malloc(longueur_questure *
1003: sizeof(unsigned char))) == NULL)
1004: {
1005: (*s_etat_processus).erreur_systeme =
1006: d_es_allocation_memoire;
1007: return;
1008: }
1009:
1.5 ! bertrand 1010: BUG(((*descripteur).type != 'C'), uprintf("Bad filtype !\n"));
! 1011:
! 1012: if ((position_initiale = ftell((*descripteur).descripteur_c))
! 1013: == -1)
1.1 bertrand 1014: {
1015: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1016: return;
1017: }
1018:
1019: do
1020: {
1021: longueur_effective = fread(tampon_lecture,
1022: (size_t) sizeof(unsigned char), longueur_questure,
1.5 ! bertrand 1023: (*descripteur).descripteur_c);
1.1 bertrand 1024:
1025: pointeur = 0;
1026: presence_indicateur = d_faux;
1027:
1028: while(pointeur < longueur_effective)
1029: {
1030: if (tampon_lecture[pointeur] == '{')
1031: {
1032: presence_indicateur = d_vrai;
1033: break;
1034: }
1035:
1036: position_initiale++;
1037: pointeur++;
1038: }
1039:
1040: if (presence_indicateur == d_vrai)
1041: {
1042: break;
1043: }
1044: } while(longueur_effective == longueur_questure);
1045:
1046: if (presence_indicateur == d_faux)
1047: {
1048: liberation(s_etat_processus, s_objet_argument);
1049: free(tampon_lecture);
1050:
1051: (*s_etat_processus).erreur_execution =
1052: d_ex_fin_de_fichier_atteinte;
1053: return;
1054: }
1055:
1056: position_finale = position_initiale + 1;
1057: presence_chaine = d_faux;
1058: niveau = 1;
1059:
1.5 ! bertrand 1060: if (fseek((*descripteur).descripteur_c, position_finale,
! 1061: SEEK_SET) != 0)
1.1 bertrand 1062: {
1063: liberation(s_etat_processus, s_objet_argument);
1064: free(tampon_lecture);
1065:
1066: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1067: return;
1068: }
1069:
1070: do
1071: {
1072: longueur_effective = fread(tampon_lecture,
1073: (size_t) sizeof(unsigned char), longueur_questure,
1.5 ! bertrand 1074: (*descripteur).descripteur_c);
1.1 bertrand 1075:
1076: pointeur = 0;
1077: presence_indicateur = d_faux;
1078:
1079: while(pointeur < longueur_effective)
1080: {
1081: if (tampon_lecture[pointeur] == '"')
1082: {
1083: presence_chaine = (presence_chaine == d_vrai)
1084: ? d_faux : d_vrai;
1085: }
1086: else
1087: {
1088: if (presence_chaine == d_faux)
1089: {
1090: if (tampon_lecture[pointeur] == '{')
1091: {
1092: niveau++;
1093: }
1094: else if (tampon_lecture[pointeur] == '}')
1095: {
1096: niveau--;
1097: }
1098: }
1099: }
1100:
1101: position_finale++;
1102: pointeur++;
1103:
1104: if (niveau == 0)
1105: {
1106: presence_indicateur = d_vrai;
1107: break;
1108: }
1109: }
1110:
1111: if (presence_indicateur == d_vrai)
1112: {
1113: break;
1114: }
1115: } while(longueur_effective == longueur_questure);
1116:
1117: if (presence_indicateur == d_faux)
1118: {
1119: liberation(s_etat_processus, s_objet_argument);
1120: free(tampon_lecture);
1121:
1122: (*s_etat_processus).erreur_execution =
1123: d_ex_fin_de_fichier_atteinte;
1124: return;
1125: }
1126:
1127: free(tampon_lecture);
1128: longueur_enregistrement = position_finale - position_initiale;
1129:
1130: if ((tampon_lecture = malloc((longueur_enregistrement + 1) *
1131: sizeof(unsigned char))) == NULL)
1132: {
1133: (*s_etat_processus).erreur_systeme =
1134: d_es_allocation_memoire;
1135: return;
1136: }
1137:
1.5 ! bertrand 1138: if (fseek((*descripteur).descripteur_c, position_initiale,
! 1139: SEEK_SET) != 0)
1.1 bertrand 1140: {
1141: liberation(s_etat_processus, s_objet_argument);
1142: free(tampon_lecture);
1143:
1144: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1145: return;
1146: }
1147:
1148: longueur_effective = fread(tampon_lecture,
1149: (size_t) sizeof(unsigned char),
1150: (size_t) longueur_enregistrement,
1.5 ! bertrand 1151: (*descripteur).descripteur_c);
1.1 bertrand 1152:
1153: if (longueur_effective != longueur_enregistrement)
1154: {
1155: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1156: return;
1157: }
1158:
1159: tampon_lecture[longueur_enregistrement] = d_code_fin_chaine;
1160: tampon = (*s_etat_processus).instruction_courante;
1.5 ! bertrand 1161:
! 1162: if (((*s_etat_processus).instruction_courante =
! 1163: transliteration(s_etat_processus, tampon_lecture,
! 1164: "UTF-8", d_locale)) == NULL)
! 1165: {
! 1166: liberation(s_etat_processus, s_objet_argument);
! 1167: free(tampon_lecture);
! 1168: return;
! 1169: }
1.1 bertrand 1170:
1171: indicateur_48 = test_cfsf(s_etat_processus, 48);
1172: cf(s_etat_processus, 48);
1173:
1174: recherche_type(s_etat_processus);
1.5 ! bertrand 1175: free((*s_etat_processus).instruction_courante);
1.1 bertrand 1176:
1177: if ((*s_etat_processus).erreur_execution != d_ex)
1178: {
1179: (*s_etat_processus).instruction_courante = tampon;
1180: free(tampon_lecture);
1181:
1182: liberation(s_etat_processus, s_objet_argument);
1183:
1184: return;
1185: }
1186:
1187: if (indicateur_48 == d_vrai)
1188: {
1189: sf(s_etat_processus, 48);
1190: }
1191: else
1192: {
1193: cf(s_etat_processus, 48);
1194: }
1195:
1196: (*s_etat_processus).instruction_courante = tampon;
1197: free(tampon_lecture);
1198: }
1199: else if ((*((struct_fichier *) (*s_objet_argument).objet)).acces
1200: == 'D')
1201: {
1202: }
1203: else
1204: {
1205: }
1206: }
1207: else if ((*((struct_fichier *) (*s_objet_argument).objet)).binaire
1208: == 'Y')
1209: {
1210: /*
1211: * Fichiers non formatés
1212: */
1213: }
1214: else
1215: {
1216: /*
1217: * Fichiers de type FLOW
1218: */
1219: }
1220: }
1221: else if ((*s_objet_argument).type == SCK)
1222: {
1223: /*
1224: * Vérification de l'autorisation de lecture
1225: */
1226:
1227: if ((*((struct_socket *) (*s_objet_argument).objet)).protection == 'W')
1228: {
1229: liberation(s_etat_processus, s_objet_argument);
1230:
1231: (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
1232: return;
1233: }
1234:
1235: /*
1236: * Vérification de l'écoute de la socket si celle-ci est connectée
1237: */
1238:
1239: if ((strcmp((*((struct_socket *) (*s_objet_argument).objet)).type,
1240: "STREAM") == 0) || (strcmp((*((struct_socket *)
1241: (*s_objet_argument).objet)).type, "SEQUENTIAL DATAGRAM") == 0))
1242: {
1243: if ((*((struct_socket *) (*s_objet_argument).objet))
1244: .socket_en_ecoute == 'Y')
1245: {
1246: liberation(s_etat_processus, s_objet_argument);
1247:
1248: (*s_etat_processus).erreur_execution = d_ex_socket_en_ecoute;
1249: return;
1250: }
1251: }
1252:
1253: if ((*((struct_socket *) (*s_objet_argument).objet)).binaire == 'N')
1254: { // Socket formatée
1255: longueur_questure = 256;
1256:
1257: do
1258: {
1259: if ((tampon_lecture = malloc((longueur_questure + 1) *
1260: sizeof(unsigned char))) == NULL)
1261: {
1262: (*s_etat_processus).erreur_systeme =
1263: d_es_allocation_memoire;
1264: return;
1265: }
1266:
1267: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1268: {
1269: (*s_etat_processus).erreur_systeme = d_es_processus;
1270: return;
1271: }
1272:
1273: for(;;)
1274: {
1275: if ((*((struct_socket *) (*s_objet_argument).objet)).domaine
1276: == PF_UNIX)
1277: {
1278: longueur_adresse = sizeof(adresse_unix);
1279: longueur_effective = recvfrom((*((struct_socket *)
1280: (*s_objet_argument).objet)).socket,
1281: tampon_lecture, longueur_questure,
1282: MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
1283: &adresse_unix, &longueur_adresse);
1284: }
1285: else if ((*((struct_socket *) (*s_objet_argument).objet))
1286: .domaine == PF_INET)
1287: {
1288: longueur_adresse = sizeof(adresse_ipv4);
1289: longueur_effective = recvfrom((*((struct_socket *)
1290: (*s_objet_argument).objet)).socket,
1291: tampon_lecture, longueur_questure,
1292: MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
1293: &adresse_ipv4, &longueur_adresse);
1294: }
1295: else if ((*((struct_socket *) (*s_objet_argument).objet))
1296: .domaine == PF_INET6)
1297: {
1298: longueur_adresse = sizeof(adresse_ipv6);
1299: longueur_effective = recvfrom((*((struct_socket *)
1300: (*s_objet_argument).objet)).socket,
1301: tampon_lecture, longueur_questure,
1302: MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
1303: &adresse_ipv6, &longueur_adresse);
1304: }
1305: else
1306: {
1307: free(tampon_lecture);
1308: liberation(s_etat_processus, s_objet_argument);
1309:
1310: while(sem_wait(&((*s_etat_processus)
1311: .semaphore_fork)) == -1)
1312: {
1313: if (errno != EINTR)
1314: {
1315: (*s_etat_processus).erreur_systeme =
1316: d_es_processus;
1317: return;
1318: }
1319: }
1320:
1321: (*s_etat_processus).erreur_execution =
1322: d_ex_erreur_acces_fichier;
1323: return;
1324: }
1325:
1326: if (longueur_effective < 0)
1327: {
1328: nanosleep(&attente, NULL);
1329: scrutation_injection(s_etat_processus);
1330: }
1331:
1332: if (((*s_etat_processus).var_volatile_requete_arret == -1)
1333: || (longueur_effective >= 0))
1334: {
1335: break;
1336: }
1337: }
1338:
1339: while(sem_wait(&((*s_etat_processus).semaphore_fork))
1340: == -1)
1341: {
1342: if (errno != EINTR)
1343: {
1344: (*s_etat_processus).erreur_systeme = d_es_processus;
1345: return;
1346: }
1347: }
1348:
1349: if ((*s_etat_processus).var_volatile_requete_arret == -1)
1350: {
1351:
1352: /*
1353: * Si le père tue le processus courant grâce au signal
1354: * SIGFSTOP, on ne renvoie pas d'erreur. Ce fonctionnement
1355: * correspond à l'utilisation de STOP sur le processus
1356: * en cours. La variable longueur_effective vaut '-1'.
1357: */
1358:
1359: free(tampon_lecture);
1360: liberation(s_etat_processus, s_objet_argument);
1361: return;
1362: }
1363:
1364: if (longueur_effective == -1)
1365: {
1366: free(tampon_lecture);
1367: liberation(s_etat_processus, s_objet_argument);
1368:
1369: (*s_etat_processus).erreur_execution =
1370: d_ex_erreur_acces_fichier;
1371: return;
1372: }
1373:
1374: position_initiale = 0;
1375: presence_indicateur = d_faux;
1376:
1377: do
1378: {
1379: if (tampon_lecture[position_initiale] == '{')
1380: {
1381: presence_indicateur = d_vrai;
1382: break;
1383: }
1384:
1385: position_initiale++;
1386: } while(position_initiale < longueur_effective);
1387:
1388:
1389: if (presence_indicateur == d_vrai)
1390: {
1391: position_finale = position_initiale + 1;
1392: presence_chaine = d_faux;
1393: presence_indicateur = d_faux;
1394: niveau = 1;
1395:
1396: while(position_finale < longueur_effective)
1397: {
1398: caractere = tampon_lecture[position_finale];
1399:
1400: if (caractere == '"')
1401: {
1402: presence_chaine = (presence_chaine == d_vrai)
1403: ? d_faux : d_vrai;
1404: }
1405: else
1406: {
1407: if (presence_chaine == d_faux)
1408: {
1409: if (caractere == '{')
1410: {
1411: niveau++;
1412: }
1413: else if (caractere == '}')
1414: {
1415: niveau--;
1416: }
1417: }
1418: }
1419:
1420: if (niveau == 0)
1421: {
1422: presence_indicateur = d_vrai;
1423: break;
1424: }
1425:
1426: position_finale++;
1427: }
1428: }
1429:
1430: if (presence_indicateur == d_faux)
1431: {
1432: if (longueur_effective < longueur_questure)
1433: {
1434: liberation(s_etat_processus, s_objet_argument);
1435: free(tampon_lecture);
1436:
1437: (*s_etat_processus).erreur_execution =
1438: d_ex_fin_de_fichier_atteinte;
1439: return;
1440: }
1441:
1442: free(tampon_lecture);
1443: longueur_questure *= 2;
1444: }
1445: } while(presence_indicateur == d_faux);
1446:
1447: tampon_lecture[++position_finale] = d_code_fin_chaine;
1448: tampon = (*s_etat_processus).instruction_courante;
1449: (*s_etat_processus).instruction_courante = &(tampon_lecture
1450: [position_initiale]);
1451:
1452: indicateur_48 = test_cfsf(s_etat_processus, 48);
1453: cf(s_etat_processus, 48);
1454:
1455: recherche_type(s_etat_processus);
1456:
1457: if ((*s_etat_processus).erreur_execution != d_ex)
1458: {
1459: (*s_etat_processus).instruction_courante = tampon;
1460: free(tampon_lecture);
1461:
1462: liberation(s_etat_processus, s_objet_argument);
1463:
1464: return;
1465: }
1466:
1467: if (indicateur_48 == d_vrai)
1468: {
1469: sf(s_etat_processus, 48);
1470: }
1471: else
1472: {
1473: cf(s_etat_processus, 48);
1474: }
1475:
1476: (*s_etat_processus).instruction_courante = tampon;
1477:
1478: /*
1479: * Création de la liste de sortie
1480: */
1481:
1482: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1483: &s_objet_type) == d_erreur)
1484: {
1485: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1486: return;
1487: }
1488:
1489: if ((s_objet_resultat = allocation(s_etat_processus, LST))
1490: == NULL)
1491: {
1492: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1493: return;
1494: }
1495:
1496: if (((*s_objet_resultat).objet =
1497: allocation_maillon(s_etat_processus)) == NULL)
1498: {
1499: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1500: return;
1501: }
1502:
1503: (*((struct_liste_chainee *) (*s_objet_resultat).objet))
1504: .donnee = s_objet_type;
1505:
1506: if (((*((struct_liste_chainee *) (*s_objet_resultat).objet))
1507: .suivant = allocation_maillon(s_etat_processus)) == NULL)
1508: {
1509: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1510: return;
1511: }
1512:
1513: (*(*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant)
1514: .suivant = NULL;
1515:
1516: if ((s_objet_adresse = allocation(s_etat_processus, LST))
1517: == NULL)
1518: {
1519: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1520: return;
1521: }
1522:
1523: (*(*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant)
1524: .donnee = s_objet_adresse;
1525:
1526: /*
1527: * Les informations concernant la cible sont valides si
1528: * la socket est non connectée et des domaines INET ou INET6.
1529: * Dans tous les autres cas, on renvoie une liste vide.
1530: */
1531:
1532: if (((*((struct_socket *) (*s_objet_argument).objet)).domaine
1533: == PF_UNIX) || (strcmp((*((struct_socket *)
1534: (*s_objet_argument).objet)).type, "STREAM") == 0) ||
1535: (strcmp((*((struct_socket *) (*s_objet_argument).objet))
1536: .type, "SEQUENTIAL DATAGRAM") == 0))
1537: {
1538: longueur_adresse = 0;
1539: recvfrom((*((struct_socket *)
1540: (*s_objet_argument).objet)).socket, tampon_lecture,
1541: position_finale, MSG_DONTWAIT,
1542: NULL, &longueur_adresse);
1543:
1544: (*s_objet_adresse).objet = NULL;
1545: }
1546: else if ((*((struct_socket *) (*s_objet_argument).objet))
1547: .domaine == PF_INET)
1548: {
1549: longueur_adresse = sizeof(adresse_ipv4);
1550: recvfrom((*((struct_socket *)
1551: (*s_objet_argument).objet)).socket, tampon_lecture,
1552: position_finale, MSG_DONTWAIT,
1553: (struct sockaddr *) &adresse_ipv4, &longueur_adresse);
1554:
1555: if (((*s_objet_adresse).objet =
1556: allocation_maillon(s_etat_processus)) == NULL)
1557: {
1558: (*s_etat_processus).erreur_systeme =
1559: d_es_allocation_memoire;
1560: return;
1561: }
1562:
1563: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
1564: .donnee = allocation(s_etat_processus, VIN)) == NULL)
1565: {
1566: (*s_etat_processus).erreur_systeme =
1567: d_es_allocation_memoire;
1568: return;
1569: }
1570:
1571: (*((struct_vecteur *) (*(*((struct_liste_chainee *)
1572: (*s_objet_adresse).objet)).donnee).objet)).taille = 4;
1573:
1574: if (((*((struct_vecteur *) (*(*((struct_liste_chainee *)
1575: (*s_objet_adresse).objet)).donnee).objet)).tableau =
1576: malloc(4 * sizeof(integer8))) == NULL)
1577: {
1578: (*s_etat_processus).erreur_systeme =
1579: d_es_allocation_memoire;
1580: return;
1581: }
1582:
1583: ((integer8 *) (*((struct_vecteur *)
1584: (*(*((struct_liste_chainee *) (*s_objet_adresse)
1585: .objet)).donnee).objet)).tableau)[0] =
1586: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 24) & 0xFF;
1587: ((integer8 *) (*((struct_vecteur *)
1588: (*(*((struct_liste_chainee *) (*s_objet_adresse)
1589: .objet)).donnee).objet)).tableau)[1] =
1590: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 16) & 0xFF;
1591: ((integer8 *) (*((struct_vecteur *)
1592: (*(*((struct_liste_chainee *) (*s_objet_adresse)
1593: .objet)).donnee).objet)).tableau)[2] =
1594: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 8) & 0xFF;
1595: ((integer8 *) (*((struct_vecteur *)
1596: (*(*((struct_liste_chainee *) (*s_objet_adresse)
1597: .objet)).donnee).objet)).tableau)[3] =
1598: ntohl(adresse_ipv4.sin_addr.s_addr) & 0xFF;
1599:
1600: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
1601: .suivant = allocation_maillon(s_etat_processus))
1602: == NULL)
1603: {
1604: (*s_etat_processus).erreur_systeme =
1605: d_es_allocation_memoire;
1606: return;
1607: }
1608:
1609: if (((*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
1610: .suivant).donnee = allocation(s_etat_processus, INT))
1611: == NULL)
1612: {
1613: (*s_etat_processus).erreur_systeme =
1614: d_es_allocation_memoire;
1615: return;
1616: }
1617:
1618: (*((integer8 *) (*(*(*((struct_liste_chainee *)
1619: (*s_objet_adresse) .objet)).suivant).donnee).objet)) =
1620: (integer8) ntohs(adresse_ipv4.sin_port);
1621:
1622: (*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
1623: .suivant).suivant = NULL;
1624: }
1625: else if ((*((struct_socket *) (*s_objet_argument).objet))
1626: .domaine == PF_INET6)
1627: {
1628: longueur_adresse = sizeof(adresse_ipv6);
1629: recvfrom((*((struct_socket *)
1630: (*s_objet_argument).objet)).socket, tampon_lecture,
1631: position_finale, MSG_DONTWAIT,
1632: (struct sockaddr *) &adresse_ipv6, &longueur_adresse);
1633:
1634: if (((*s_objet_adresse).objet =
1635: allocation_maillon(s_etat_processus)) == NULL)
1636: {
1637: (*s_etat_processus).erreur_systeme =
1638: d_es_allocation_memoire;
1639: return;
1640: }
1641:
1642: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
1643: .donnee = allocation(s_etat_processus, VIN)) == NULL)
1644: {
1645: (*s_etat_processus).erreur_systeme =
1646: d_es_allocation_memoire;
1647: return;
1648: }
1649:
1650: (*((struct_vecteur *) (*(*((struct_liste_chainee *)
1651: (*s_objet_adresse).objet)).donnee).objet)).taille = 16;
1652:
1653: if (((*((struct_vecteur *) (*(*((struct_liste_chainee *)
1654: (*s_objet_adresse).objet)).donnee).objet)).tableau =
1655: malloc(16 * sizeof(integer8))) == NULL)
1656: {
1657: (*s_etat_processus).erreur_systeme =
1658: d_es_allocation_memoire;
1659: return;
1660: }
1661:
1662: for(i = 0; i < 16; i++)
1663: {
1664: ((integer8 *) (*((struct_vecteur *)
1665: (*(*((struct_liste_chainee *) (*s_objet_adresse)
1666: .objet)).donnee).objet)).tableau)[0] =
1667: adresse_ipv6.sin6_addr.s6_addr[i];
1668: }
1669:
1670: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
1671: .suivant = allocation_maillon(s_etat_processus))
1672: == NULL)
1673: {
1674: (*s_etat_processus).erreur_systeme =
1675: d_es_allocation_memoire;
1676: return;
1677: }
1678:
1679: if (((*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
1680: .suivant).donnee = allocation(s_etat_processus, INT))
1681: == NULL)
1682: {
1683: (*s_etat_processus).erreur_systeme =
1684: d_es_allocation_memoire;
1685: return;
1686: }
1687:
1688: (*((integer8 *) (*(*(*((struct_liste_chainee *)
1689: (*s_objet_adresse) .objet)).suivant).donnee).objet)) =
1690: (integer8) ntohs(adresse_ipv6.sin6_port);
1691:
1692: (*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
1693: .suivant).suivant = NULL;
1694: }
1695: else
1696: {
1697: longueur_adresse = 0;
1698: recvfrom((*((struct_socket *)
1699: (*s_objet_argument).objet)).socket, tampon_lecture,
1700: position_finale, MSG_DONTWAIT,
1701: NULL, &longueur_adresse);
1702: }
1703:
1704: free(tampon_lecture);
1705:
1706: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1707: s_objet_resultat) == d_erreur)
1708: {
1709: return;
1710: }
1711: }
1712: else
1713: {
1714: /* FLOW ou UNFORMATTED */
1715: }
1716: }
1717: else
1718: {
1719: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1720: return;
1721: }
1722:
1723: liberation(s_etat_processus, s_objet_argument);
1724:
1725: return;
1726: }
1727:
1728: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>