Annotation of rpl/src/instructions_r4.c, revision 1.67
1.1 bertrand 1: /*
2: ================================================================================
1.65 bertrand 3: RPL/2 (R) version 4.1.12
1.48 bertrand 4: Copyright (C) 1989-2012 Dr. BERTRAND Joël
1.1 bertrand 5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
1.19 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 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: {
1.6 bertrand 849: const char *queue;
850:
1.28 bertrand 851: int c;
1.8 bertrand 852: int ios;
853:
1.55 bertrand 854: integer8 ancienne_longueur_effective;
1.8 bertrand 855: integer8 element;
1.46 bertrand 856: integer8 i;
1.8 bertrand 857: integer8 id;
858: integer8 position_clef;
1.46 bertrand 859: integer8 longueur_effective;
860: integer8 longueur_enregistrement;
861: integer8 longueur_questure;
862: integer8 niveau;
863: integer8 pointeur;
864: integer8 position_finale;
865: integer8 position_initiale;
866:
1.59 bertrand 867: logical1 format_degenere;
1.1 bertrand 868: logical1 indicateur_48;
869: logical1 presence_chaine;
870: logical1 presence_indicateur;
1.57 bertrand 871: logical1 trame_complete;
1.1 bertrand 872:
1.59 bertrand 873: long longueur;
874:
1.1 bertrand 875: socklen_t longueur_adresse;
876:
1.6 bertrand 877: sqlite3_stmt *ppStmt;
878:
1.1 bertrand 879: struct flock lock;
880:
1.54 bertrand 881: struct pollfd poll_fd;
882:
1.1 bertrand 883: struct sockaddr_un adresse_unix;
884: struct sockaddr_in adresse_ipv4;
1.19 bertrand 885: # ifdef IPV6
1.1 bertrand 886: struct sockaddr_in6 adresse_ipv6;
1.19 bertrand 887: # endif
1.1 bertrand 888:
889: struct timespec attente;
890:
1.5 bertrand 891: struct_descripteur_fichier *descripteur;
892:
1.8 bertrand 893: struct_liste_chainee *l_element_courant;
1.59 bertrand 894: struct_liste_chainee *l_element_courant_format;
1.8 bertrand 895: struct_liste_chainee *l_element_inclus;
1.46 bertrand 896: struct_liste_chainee *l_element_suivant;
1.8 bertrand 897:
1.1 bertrand 898: struct_objet *s_objet_adresse;
1.6 bertrand 899: struct_objet *s_objet_argument_1;
900: struct_objet *s_objet_argument_2;
1.46 bertrand 901: struct_objet *s_objet_element;
1.1 bertrand 902: struct_objet *s_objet_resultat;
903: struct_objet *s_objet_type;
904:
905: unsigned char caractere;
1.8 bertrand 906: unsigned char *clef_utf8;
1.6 bertrand 907: unsigned char *commande;
1.59 bertrand 908: unsigned char *format_chaine;
1.55 bertrand 909: unsigned char poubelle[256];
1.28 bertrand 910: unsigned char *ptr;
1.1 bertrand 911: unsigned char *tampon_lecture;
912: unsigned char *tampon;
1.8 bertrand 913: unsigned char *tampon2;
1.46 bertrand 914: unsigned char type_enregistrement;
1.1 bertrand 915:
916: (*s_etat_processus).erreur_execution = d_ex;
917:
918: if ((*s_etat_processus).affichage_arguments == 'Y')
919: {
920: printf("\n READ ");
921:
922: if ((*s_etat_processus).langue == 'F')
923: {
924: printf("(lecture d'un enregistrement d'un fichier)\n\n");
925: }
926: else
927: {
928: printf("(read a record of a file)\n\n");
929: }
930:
1.6 bertrand 931: printf(" 1: %s, %s\n\n", d_FCH, d_SCK);
1.1 bertrand 932:
1.8 bertrand 933: printf(" 2: %s, %s\n", d_INT, d_CHN);
1.6 bertrand 934: printf(" 1: %s\n", d_FCH);
1.1 bertrand 935: return;
936: }
937: else if ((*s_etat_processus).test_instruction == 'Y')
938: {
939: (*s_etat_processus).nombre_arguments = -1;
940: return;
941: }
942:
943: if (test_cfsf(s_etat_processus, 31) == d_vrai)
944: {
1.6 bertrand 945: if ((*s_etat_processus).l_base_pile == NULL)
1.1 bertrand 946: {
1.6 bertrand 947: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1.1 bertrand 948: return;
949: }
1.6 bertrand 950:
951: if ((*(*(*s_etat_processus).l_base_pile).donnee).type == FCH)
952: {
953: if ((*((struct_fichier *) (*(*(*s_etat_processus).l_base_pile)
954: .donnee).objet)).acces == 'S')
955: {
956: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
957: {
958: return;
959: }
960: }
961: else
962: {
963: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
964: {
965: return;
966: }
967: }
968: }
969: else
970: {
971: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
972: {
973: return;
974: }
975: }
1.1 bertrand 976: }
977:
978: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1.6 bertrand 979: &s_objet_argument_1) == d_erreur)
1.1 bertrand 980: {
981: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
982: return;
983: }
984:
1.6 bertrand 985: if ((*s_objet_argument_1).type == FCH)
1.1 bertrand 986: {
1.5 bertrand 987: if ((descripteur = descripteur_fichier(s_etat_processus,
1.6 bertrand 988: (struct_fichier *) (*s_objet_argument_1).objet)) == NULL)
1.5 bertrand 989: {
990: return;
991: }
992:
1.1 bertrand 993: /*
994: * Vérification des verrous
995: */
996:
997: lock.l_type = F_RDLCK;
998: lock.l_whence = SEEK_SET;
999: lock.l_start = 0;
1000: lock.l_len = 0;
1001: lock.l_pid = getpid();
1002:
1.5 bertrand 1003: if (fcntl(fileno((*descripteur).descripteur_c), F_GETLK, &lock)
1004: == -1)
1.1 bertrand 1005: {
1.6 bertrand 1006: liberation(s_etat_processus, s_objet_argument_1);
1.1 bertrand 1007:
1008: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1009: return;
1010: }
1011:
1012: if (lock.l_type != F_UNLCK)
1013: {
1.6 bertrand 1014: liberation(s_etat_processus, s_objet_argument_1);
1.1 bertrand 1015:
1016: (*s_etat_processus).erreur_execution =
1017: d_ex_fichier_verrouille;
1018: return;
1019: }
1020:
1021: /*
1022: * Vérification de l'autorisation de lecture
1023: */
1024:
1.6 bertrand 1025: if ((*((struct_fichier *) (*s_objet_argument_1).objet)).protection
1026: == 'W')
1.1 bertrand 1027: {
1.6 bertrand 1028: liberation(s_etat_processus, s_objet_argument_1);
1.1 bertrand 1029:
1030: (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
1031: return;
1032: }
1.6 bertrand 1033: else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).protection
1.1 bertrand 1034: == 'N')
1035: {
1.5 bertrand 1036: if ((*descripteur).type == 'C')
1.1 bertrand 1037: {
1.5 bertrand 1038: if (fflush((*descripteur).descripteur_c) != 0)
1039: {
1040: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1041: return;
1042: }
1.1 bertrand 1043: }
1044: }
1045:
1.6 bertrand 1046: if ((*((struct_fichier *) (*s_objet_argument_1).objet)).binaire == 'N')
1.1 bertrand 1047: {
1048: /*
1049: * Fichiers formatés
1050: */
1051:
1.6 bertrand 1052: if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces
1053: == 'S')
1.1 bertrand 1054: {
1055: /*
1056: * Fichiers séquentiels
1057: */
1058:
1059: longueur_questure = 256;
1060:
1061: if ((tampon_lecture = malloc(longueur_questure *
1062: sizeof(unsigned char))) == NULL)
1063: {
1064: (*s_etat_processus).erreur_systeme =
1065: d_es_allocation_memoire;
1066: return;
1067: }
1068:
1.5 bertrand 1069: BUG(((*descripteur).type != 'C'), uprintf("Bad filtype !\n"));
1070:
1071: if ((position_initiale = ftell((*descripteur).descripteur_c))
1072: == -1)
1.1 bertrand 1073: {
1074: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1075: return;
1076: }
1077:
1078: do
1079: {
1080: longueur_effective = fread(tampon_lecture,
1081: (size_t) sizeof(unsigned char), longueur_questure,
1.5 bertrand 1082: (*descripteur).descripteur_c);
1.1 bertrand 1083:
1084: pointeur = 0;
1085: presence_indicateur = d_faux;
1086:
1087: while(pointeur < longueur_effective)
1088: {
1089: if (tampon_lecture[pointeur] == '{')
1090: {
1091: presence_indicateur = d_vrai;
1092: break;
1093: }
1094:
1095: position_initiale++;
1096: pointeur++;
1097: }
1098:
1099: if (presence_indicateur == d_vrai)
1100: {
1101: break;
1102: }
1103: } while(longueur_effective == longueur_questure);
1104:
1105: if (presence_indicateur == d_faux)
1106: {
1.6 bertrand 1107: liberation(s_etat_processus, s_objet_argument_1);
1.1 bertrand 1108: free(tampon_lecture);
1109:
1110: (*s_etat_processus).erreur_execution =
1111: d_ex_fin_de_fichier_atteinte;
1112: return;
1113: }
1114:
1115: position_finale = position_initiale + 1;
1116: presence_chaine = d_faux;
1117: niveau = 1;
1118:
1.5 bertrand 1119: if (fseek((*descripteur).descripteur_c, position_finale,
1120: SEEK_SET) != 0)
1.1 bertrand 1121: {
1.6 bertrand 1122: liberation(s_etat_processus, s_objet_argument_1);
1.1 bertrand 1123: free(tampon_lecture);
1124:
1125: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1126: return;
1127: }
1128:
1129: do
1130: {
1131: longueur_effective = fread(tampon_lecture,
1132: (size_t) sizeof(unsigned char), longueur_questure,
1.5 bertrand 1133: (*descripteur).descripteur_c);
1.1 bertrand 1134:
1135: pointeur = 0;
1136: presence_indicateur = d_faux;
1137:
1138: while(pointeur < longueur_effective)
1139: {
1140: if (tampon_lecture[pointeur] == '"')
1141: {
1.7 bertrand 1142: if (pointeur > 0)
1143: {
1144: if (tampon_lecture[pointeur - 1] != '\\')
1145: {
1146: presence_chaine = (presence_chaine ==
1147: d_vrai) ? d_faux : d_vrai;
1148: }
1149: }
1150: else
1151: {
1152: presence_chaine = (presence_chaine == d_vrai)
1153: ? d_faux : d_vrai;
1154: }
1.1 bertrand 1155: }
1156: else
1157: {
1158: if (presence_chaine == d_faux)
1159: {
1160: if (tampon_lecture[pointeur] == '{')
1161: {
1162: niveau++;
1163: }
1164: else if (tampon_lecture[pointeur] == '}')
1165: {
1166: niveau--;
1167: }
1168: }
1169: }
1170:
1171: position_finale++;
1172: pointeur++;
1173:
1174: if (niveau == 0)
1175: {
1176: presence_indicateur = d_vrai;
1177: break;
1178: }
1179: }
1180:
1181: if (presence_indicateur == d_vrai)
1182: {
1183: break;
1184: }
1185: } while(longueur_effective == longueur_questure);
1186:
1187: if (presence_indicateur == d_faux)
1188: {
1.6 bertrand 1189: liberation(s_etat_processus, s_objet_argument_1);
1.1 bertrand 1190: free(tampon_lecture);
1191:
1192: (*s_etat_processus).erreur_execution =
1193: d_ex_fin_de_fichier_atteinte;
1194: return;
1195: }
1196:
1197: free(tampon_lecture);
1198: longueur_enregistrement = position_finale - position_initiale;
1199:
1200: if ((tampon_lecture = malloc((longueur_enregistrement + 1) *
1201: sizeof(unsigned char))) == NULL)
1202: {
1203: (*s_etat_processus).erreur_systeme =
1204: d_es_allocation_memoire;
1205: return;
1206: }
1207:
1.5 bertrand 1208: if (fseek((*descripteur).descripteur_c, position_initiale,
1209: SEEK_SET) != 0)
1.1 bertrand 1210: {
1.6 bertrand 1211: liberation(s_etat_processus, s_objet_argument_1);
1.1 bertrand 1212: free(tampon_lecture);
1213:
1214: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1215: return;
1216: }
1217:
1218: longueur_effective = fread(tampon_lecture,
1219: (size_t) sizeof(unsigned char),
1220: (size_t) longueur_enregistrement,
1.5 bertrand 1221: (*descripteur).descripteur_c);
1.1 bertrand 1222:
1223: if (longueur_effective != longueur_enregistrement)
1224: {
1225: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1226: return;
1227: }
1228:
1229: tampon_lecture[longueur_enregistrement] = d_code_fin_chaine;
1230: tampon = (*s_etat_processus).instruction_courante;
1.5 bertrand 1231:
1232: if (((*s_etat_processus).instruction_courante =
1233: transliteration(s_etat_processus, tampon_lecture,
1234: "UTF-8", d_locale)) == NULL)
1235: {
1.6 bertrand 1236: (*s_etat_processus).instruction_courante = tampon;
1237: liberation(s_etat_processus, s_objet_argument_1);
1.5 bertrand 1238: free(tampon_lecture);
1239: return;
1240: }
1.1 bertrand 1241:
1242: indicateur_48 = test_cfsf(s_etat_processus, 48);
1243: cf(s_etat_processus, 48);
1244:
1245: recherche_type(s_etat_processus);
1.5 bertrand 1246: free((*s_etat_processus).instruction_courante);
1.1 bertrand 1247:
1248: if ((*s_etat_processus).erreur_execution != d_ex)
1249: {
1.6 bertrand 1250: if (indicateur_48 == d_vrai)
1251: {
1252: sf(s_etat_processus, 48);
1253: }
1254: else
1255: {
1256: cf(s_etat_processus, 48);
1257: }
1258:
1.1 bertrand 1259: (*s_etat_processus).instruction_courante = tampon;
1260: free(tampon_lecture);
1261:
1.6 bertrand 1262: liberation(s_etat_processus, s_objet_argument_1);
1.1 bertrand 1263: return;
1264: }
1265:
1266: if (indicateur_48 == d_vrai)
1267: {
1268: sf(s_etat_processus, 48);
1269: }
1270: else
1271: {
1272: cf(s_etat_processus, 48);
1273: }
1274:
1275: (*s_etat_processus).instruction_courante = tampon;
1276: free(tampon_lecture);
1277: }
1.6 bertrand 1278: else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces
1.1 bertrand 1279: == 'D')
1280: {
1.6 bertrand 1281: BUG(((*descripteur).type != 'S'), uprintf("Bad filtype !\n"));
1282:
1283: if (depilement(s_etat_processus, &((*s_etat_processus)
1284: .l_base_pile), &s_objet_argument_2) == d_erreur)
1285: {
1286: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1287: return;
1288: }
1289:
1290: if ((*s_objet_argument_2).type != INT)
1291: {
1292: liberation(s_etat_processus, s_objet_argument_1);
1293: liberation(s_etat_processus, s_objet_argument_2);
1294:
1295: (*s_etat_processus).erreur_execution =
1296: d_ex_erreur_type_argument;
1297: return;
1298: }
1299:
1300: if (alsprintf(&commande, "select data from data where "
1301: "id = %lld", (*((integer8 *) (*s_objet_argument_2)
1302: .objet))) < 0)
1303: {
1304: (*s_etat_processus).erreur_systeme =
1305: d_es_allocation_memoire;
1306: return;
1307: }
1308:
1309: if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
1310: commande, strlen(commande), &ppStmt, &queue)
1311: != SQLITE_OK)
1312: {
1313: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1314: return;
1315: }
1316:
1317: switch(sqlite3_step(ppStmt))
1318: {
1319: case SQLITE_ROW:
1320: {
1321: // Résultat attendu
1322: break;
1323: }
1324:
1325: case SQLITE_DONE:
1326: {
1327: // Aucun enregistrement
1328: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
1329: {
1330: (*s_etat_processus).erreur_systeme =
1331: d_es_erreur_fichier;
1332: return;
1333: }
1334:
1335: free(commande);
1336:
1337: liberation(s_etat_processus, s_objet_argument_1);
1338: liberation(s_etat_processus, s_objet_argument_2);
1339:
1340: (*s_etat_processus).erreur_execution =
1341: d_ex_enregistrement_inexistant;
1342: return;
1343: }
1344:
1345: default:
1346: {
1347: (*s_etat_processus).erreur_systeme =
1348: d_es_erreur_fichier;
1349: return;
1350: }
1351: }
1352:
1353: if (sqlite3_column_type(ppStmt, 0) != SQLITE_TEXT)
1354: {
1355: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1356: return;
1357: }
1358:
1359: tampon = (*s_etat_processus).instruction_courante;
1360:
1361: if ((tampon_lecture = (unsigned char *)
1362: sqlite3_column_text(ppStmt, 0)) == NULL)
1363: {
1364: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1365: return;
1366: }
1367:
1368: if (((*s_etat_processus).instruction_courante =
1369: transliteration(s_etat_processus, tampon_lecture,
1370: "UTF-8", d_locale)) == NULL)
1371: {
1372: (*s_etat_processus).instruction_courante = tampon;
1373:
1374: liberation(s_etat_processus, s_objet_argument_1);
1375: liberation(s_etat_processus, s_objet_argument_2);
1376: free(commande);
1377: return;
1378: }
1379:
1380: indicateur_48 = test_cfsf(s_etat_processus, 48);
1381: cf(s_etat_processus, 48);
1382:
1383: recherche_type(s_etat_processus);
1384:
1385: if ((*s_etat_processus).erreur_execution != d_ex)
1386: {
1387: if (indicateur_48 == d_vrai)
1388: {
1389: sf(s_etat_processus, 48);
1390: }
1391: else
1392: {
1393: cf(s_etat_processus, 48);
1394: }
1395:
1396: liberation(s_etat_processus, s_objet_argument_1);
1397: liberation(s_etat_processus, s_objet_argument_2);
1398:
1399: free((*s_etat_processus).instruction_courante);
1400: free(commande);
1.8 bertrand 1401:
1402: (*s_etat_processus).instruction_courante = tampon;
1.6 bertrand 1403: return;
1404: }
1405:
1406: if (indicateur_48 == d_vrai)
1407: {
1408: sf(s_etat_processus, 48);
1409: }
1410: else
1411: {
1412: cf(s_etat_processus, 48);
1413: }
1414:
1415: free((*s_etat_processus).instruction_courante);
1416: liberation(s_etat_processus, s_objet_argument_2);
1417: (*s_etat_processus).instruction_courante = tampon;
1418:
1419: if (sqlite3_step(ppStmt) != SQLITE_DONE)
1420: {
1421: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1422: return;
1423: }
1424:
1425: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
1426: {
1427: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1428: return;
1429: }
1430:
1431: free(commande);
1.1 bertrand 1432: }
1433: else
1434: {
1.8 bertrand 1435: BUG(((*descripteur).type != 'S'), uprintf("Bad filtype !\n"));
1436:
1437: if (depilement(s_etat_processus, &((*s_etat_processus)
1438: .l_base_pile), &s_objet_argument_2) == d_erreur)
1439: {
1440: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1441: return;
1442: }
1443:
1444: if ((*s_objet_argument_2).type != CHN)
1445: {
1446: liberation(s_etat_processus, s_objet_argument_1);
1447: liberation(s_etat_processus, s_objet_argument_2);
1448:
1449: (*s_etat_processus).erreur_execution =
1450: d_ex_erreur_type_argument;
1451: return;
1452: }
1453:
1454: // Récupération de la position de la clef
1455:
1456: if (alsprintf(&commande, "select key from control "
1457: "where id = 1") < 0)
1458: {
1459: (*s_etat_processus).erreur_systeme =
1460: d_es_allocation_memoire;
1461: return;
1462: }
1463:
1464: if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
1465: commande, strlen(commande), &ppStmt, &queue)
1466: != SQLITE_OK)
1467: {
1468: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1469: return;
1470: }
1471:
1472: if (sqlite3_step(ppStmt) != SQLITE_ROW)
1473: {
1474: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1475: return;
1476: }
1477:
1478: if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER)
1479: {
1480: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1481: return;
1482: }
1483:
1484: position_clef = sqlite3_column_int64(ppStmt, 0);
1485:
1486: if (sqlite3_step(ppStmt) != SQLITE_DONE)
1487: {
1488: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1489: return;
1490: }
1491:
1492: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
1493: {
1494: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1495: return;
1496: }
1497:
1498: free(commande);
1499:
1500: if ((clef_utf8 = transliteration(s_etat_processus,
1501: (unsigned char *) (*s_objet_argument_2).objet,
1502: d_locale, "UTF-8")) == NULL)
1503: {
1504: liberation(s_etat_processus, s_objet_argument_1);
1505: liberation(s_etat_processus, s_objet_argument_2);
1506:
1507: return;
1508: }
1509:
1510: // Récupération de l'identifiant de la clef
1511:
1512: if (alsprintf(&commande, "select id from key where key = "
1513: "'{ \"%s\" }'", clef_utf8) < 0)
1514: {
1515: (*s_etat_processus).erreur_systeme =
1516: d_es_allocation_memoire;
1517: return;
1518: }
1519:
1520: if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
1521: commande, strlen(commande), &ppStmt, &queue)
1522: != SQLITE_OK)
1523: {
1524: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1525: return;
1526: }
1527:
1528: switch(sqlite3_step(ppStmt))
1529: {
1530: case SQLITE_ROW:
1531: {
1532: // Résultat attendu : une clef correspond.
1533: break;
1534: }
1535:
1536: case SQLITE_DONE:
1537: {
1538: // Aucun enregistrement
1539: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
1540: {
1541: (*s_etat_processus).erreur_systeme =
1542: d_es_erreur_fichier;
1543: return;
1544: }
1545:
1546: free(clef_utf8);
1547: free(commande);
1548:
1549: liberation(s_etat_processus, s_objet_argument_1);
1550: liberation(s_etat_processus, s_objet_argument_2);
1551:
1552: (*s_etat_processus).erreur_execution =
1553: d_ex_enregistrement_inexistant;
1554: return;
1555: }
1556:
1557: default:
1558: {
1559: (*s_etat_processus).erreur_systeme =
1560: d_es_erreur_fichier;
1561: return;
1562: }
1563: }
1564:
1565: if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER)
1566: {
1567: free(clef_utf8);
1568: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1569: return;
1570: }
1571:
1572: id = sqlite3_column_int64(ppStmt, 0);
1573:
1574: if (sqlite3_step(ppStmt) != SQLITE_DONE)
1575: {
1576: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1577: return;
1578: }
1579:
1580: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
1581: {
1582: (*s_etat_processus).erreur_systeme =
1583: d_es_erreur_fichier;
1584: return;
1585: }
1586:
1587: free(commande);
1588:
1589: if (alsprintf(&commande, "select data from data where "
1590: "key_id = %lld order by sequence asc", id) < 0)
1591: {
1592: (*s_etat_processus).erreur_systeme =
1593: d_es_allocation_memoire;
1594: return;
1595: }
1596:
1597: if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
1598: commande, strlen(commande), &ppStmt, &queue)
1599: != SQLITE_OK)
1600: {
1601: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1602: return;
1603: }
1604:
1605: element = 1;
1606:
1607: do
1608: {
1609: switch(ios = sqlite3_step(ppStmt))
1610: {
1611: case SQLITE_ROW:
1612: {
1613: // Donnée supplémentaire
1614:
1615: if (sqlite3_column_type(ppStmt, 0) != SQLITE_TEXT)
1616: {
1617: (*s_etat_processus).erreur_systeme =
1618: d_es_erreur_fichier;
1619: return;
1620: }
1621:
1622: tampon = (*s_etat_processus).instruction_courante;
1623:
1624: if ((tampon_lecture = (unsigned char *)
1625: sqlite3_column_text(ppStmt, 0)) == NULL)
1626: {
1627: (*s_etat_processus).erreur_systeme =
1628: d_es_erreur_fichier;
1629: return;
1630: }
1631:
1632: if (((*s_etat_processus).instruction_courante =
1633: transliteration(s_etat_processus,
1634: tampon_lecture,
1635: "UTF-8", d_locale)) == NULL)
1636: {
1637: (*s_etat_processus).instruction_courante =
1638: tampon;
1639:
1640: liberation(s_etat_processus,
1641: s_objet_argument_1);
1642: liberation(s_etat_processus,
1643: s_objet_argument_2);
1644:
1645: free(commande);
1646: free(clef_utf8);
1647: return;
1648: }
1649:
1650: indicateur_48 = test_cfsf(s_etat_processus, 48);
1651: cf(s_etat_processus, 48);
1652:
1653: recherche_type(s_etat_processus);
1654:
1655: if ((*s_etat_processus).erreur_execution != d_ex)
1656: {
1657: if (indicateur_48 == d_vrai)
1658: {
1659: sf(s_etat_processus, 48);
1660: }
1661: else
1662: {
1663: cf(s_etat_processus, 48);
1664: }
1665:
1666: liberation(s_etat_processus,
1667: s_objet_argument_1);
1668: liberation(s_etat_processus,
1669: s_objet_argument_2);
1670:
1671: free((*s_etat_processus).instruction_courante);
1672: free(commande);
1673: free(clef_utf8);
1674:
1675: (*s_etat_processus).instruction_courante =
1676: tampon;
1677: return;
1678: }
1679:
1680: if (indicateur_48 == d_vrai)
1681: {
1682: sf(s_etat_processus, 48);
1683: }
1684: else
1685: {
1686: cf(s_etat_processus, 48);
1687: }
1688:
1689: free((*s_etat_processus).instruction_courante);
1690: (*s_etat_processus).instruction_courante = tampon;
1691:
1692: element++;
1693:
1694: // Inscription de la clef
1695:
1696: if (element == position_clef)
1697: {
1698: if (((*s_etat_processus).instruction_courante =
1699: transliteration(s_etat_processus,
1700: clef_utf8, "UTF-8", d_locale)) == NULL)
1701: {
1702: (*s_etat_processus).instruction_courante =
1703: tampon;
1704:
1705: liberation(s_etat_processus,
1706: s_objet_argument_1);
1707: liberation(s_etat_processus,
1708: s_objet_argument_2);
1709:
1710: free(commande);
1711: free(clef_utf8);
1712: return;
1713: }
1714:
1715: if (alsprintf(&tampon2, "{ \"%s\" }",
1716: (*s_etat_processus)
1717: .instruction_courante) < 0)
1718: {
1719: (*s_etat_processus).erreur_systeme =
1720: d_es_allocation_memoire;
1721: return;
1722: }
1723:
1724: free((*s_etat_processus).instruction_courante);
1725: (*s_etat_processus).instruction_courante
1726: = tampon2;
1727:
1728: indicateur_48 = test_cfsf(s_etat_processus, 48);
1729: cf(s_etat_processus, 48);
1730:
1731: recherche_type(s_etat_processus);
1732:
1733: if ((*s_etat_processus).erreur_execution
1734: != d_ex)
1735: {
1736: if (indicateur_48 == d_vrai)
1737: {
1738: sf(s_etat_processus, 48);
1739: }
1740: else
1741: {
1742: cf(s_etat_processus, 48);
1743: }
1744:
1745: liberation(s_etat_processus,
1746: s_objet_argument_1);
1747: liberation(s_etat_processus,
1748: s_objet_argument_2);
1749:
1750: free((*s_etat_processus)
1751: .instruction_courante);
1752: free(commande);
1753: free(clef_utf8);
1754:
1755: (*s_etat_processus).instruction_courante =
1756: tampon;
1757: return;
1758: }
1759:
1760: if (indicateur_48 == d_vrai)
1761: {
1762: sf(s_etat_processus, 48);
1763: }
1764: else
1765: {
1766: cf(s_etat_processus, 48);
1767: }
1768:
1769: free((*s_etat_processus).instruction_courante);
1770: (*s_etat_processus).instruction_courante =
1771: tampon;
1772:
1773: element++;
1774: }
1775:
1776: break;
1777: }
1778:
1779: case SQLITE_DONE:
1780: {
1781: // Fin de la liste
1782: break;
1783: }
1784:
1785: default:
1786: {
1787: (*s_etat_processus).erreur_systeme =
1788: d_es_erreur_fichier;
1789: return;
1790: }
1791: }
1792: } while(ios != SQLITE_DONE);
1793:
1794: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
1795: {
1796: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1797: return;
1798: }
1799:
1800: free(commande);
1801: free(clef_utf8);
1802:
1803: liberation(s_etat_processus, s_objet_argument_2);
1804:
1805: if ((s_objet_resultat = allocation(s_etat_processus, LST))
1806: == NULL)
1807: {
1808: (*s_etat_processus).erreur_systeme =
1809: d_es_allocation_memoire;
1810: return;
1811: }
1812:
1813: l_element_courant = NULL;
1.9 bertrand 1814: l_element_inclus = NULL;
1.8 bertrand 1815:
1816: for(element--; element > 0; element--)
1817: {
1818: if (depilement(s_etat_processus, &((*s_etat_processus)
1819: .l_base_pile), &s_objet_argument_2) == d_erreur)
1820: {
1821: (*s_etat_processus).erreur_systeme =
1822: d_es_erreur_fichier;
1823: return;
1824: }
1825:
1826: if ((*s_objet_argument_2).type != LST)
1827: {
1828: (*s_etat_processus).erreur_systeme =
1829: d_es_erreur_fichier;
1830: return;
1831: }
1832:
1833: l_element_inclus = (*s_objet_argument_2).objet;
1834:
1835: if (l_element_inclus != NULL)
1836: {
1837: while(l_element_inclus != NULL)
1838: {
1839: if ((*l_element_inclus).suivant == NULL)
1840: {
1841: (*l_element_inclus).suivant = l_element_courant;
1842: break;
1843: }
1844:
1845: l_element_inclus = (*l_element_inclus).suivant;
1846: }
1847:
1848: l_element_courant = (*s_objet_argument_2).objet;
1849: (*s_objet_argument_2).objet = NULL;
1850: }
1851:
1852: liberation(s_etat_processus, s_objet_argument_2);
1853: }
1854:
1855: (*s_objet_resultat).objet = l_element_inclus;
1856:
1857: if (empilement(s_etat_processus,
1858: &((*s_etat_processus).l_base_pile),
1859: s_objet_resultat) == d_erreur)
1860: {
1861: return;
1862: }
1.1 bertrand 1863: }
1864: }
1.6 bertrand 1865: else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).binaire
1.1 bertrand 1866: == 'Y')
1867: {
1868: /*
1869: * Fichiers non formatés
1870: */
1.46 bertrand 1871:
1872: if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces
1873: == 'S')
1874: {
1875: /*
1876: * Fichiers séquentiels
1877: *
1878: * Les fichiers séquentiels non formatés contiennent comme
1879: * les fichiers séquentiels formatés leurs enregistrements
1880: * sous la forme de listes les unes derrières les autres.
1881: *
1882: * Le quartet de poids fort du premier octet à lire
1883: * doit donc être égal à 0100. Si ce n'est pas le cas,
1884: * il sera impossible de lire le fichier et on renvoie
1885: * immédiatement une erreur. Si on lit dans le fichier
1886: * la valeur attendue, on récupère la longueur en octet
1887: * de l'enregistrement puis on le lit.
1888: */
1889:
1890: BUG(((*descripteur).type != 'C'), uprintf("Bad filtype !\n"));
1891:
1892: if (fread(&type_enregistrement, (size_t) sizeof(unsigned char),
1893: 1, (*descripteur).descripteur_c) != 1)
1894: {
1895: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1896: return;
1897: }
1898:
1899: if ((type_enregistrement & 0xF0) != 0x40)
1900: {
1901: // L'enregistrement trouvé n'est pas une liste.
1902: // Tout porte à croire que le fichier est corrompu.
1903: (*s_etat_processus).erreur_execution =
1904: d_ex_fichier_corrompu;
1905: return;
1906: }
1907:
1908: switch(type_enregistrement)
1909: {
1910: unsigned char taille_enregistrement[8];
1911:
1912: case 0x48:
1913: {
1914: if (fread(taille_enregistrement,
1915: (size_t) sizeof(unsigned char),
1916: 1, (*descripteur).descripteur_c) != 1)
1917: {
1918: (*s_etat_processus).erreur_systeme =
1919: d_es_erreur_fichier;
1920: return;
1921: }
1922:
1923: longueur_enregistrement = taille_enregistrement[0];
1924: break;
1925: }
1926:
1927: case 0x49:
1928: {
1929: if (fread(taille_enregistrement,
1930: (size_t) sizeof(unsigned char),
1931: 2, (*descripteur).descripteur_c) != 2)
1932: {
1933: (*s_etat_processus).erreur_systeme =
1934: d_es_erreur_fichier;
1935: return;
1936: }
1937:
1938: // A FAIRE conversion de taille_enregistrement en longueur_enregistrement
1939: break;
1940: }
1941:
1942: case 0x4A:
1943: {
1944: if (fread(taille_enregistrement,
1945: (size_t) sizeof(unsigned char),
1946: 4, (*descripteur).descripteur_c) != 4)
1947: {
1948: (*s_etat_processus).erreur_systeme =
1949: d_es_erreur_fichier;
1950: return;
1951: }
1952:
1953: // A FAIRE conversion de taille_enregistrement en longueur_enregistrement
1954: break;
1955: }
1956:
1957: case 0x4B:
1958: {
1959: if (fread(taille_enregistrement,
1960: (size_t) sizeof(unsigned char),
1961: 8, (*descripteur).descripteur_c) != 8)
1962: {
1963: (*s_etat_processus).erreur_systeme =
1964: d_es_erreur_fichier;
1965: return;
1966: }
1967:
1968: // A FAIRE conversion de taille_enregistrement en longueur_enregistrement
1969: break;
1970: }
1971:
1972: default:
1973: {
1974: longueur_enregistrement = type_enregistrement & 0x07;
1975: }
1976: }
1977:
1978: printf("L=%d\n", longueur_enregistrement);
1979: // La variable longueur_enregistrement contient le nombre
1980: // d'éléments à lire dans le fichier pour générer la liste
1981: // contenant l'enregistrement.
1982:
1983: if ((s_objet_resultat = allocation(s_etat_processus, LST))
1984: == NULL)
1985: {
1986: (*s_etat_processus).erreur_systeme =
1987: d_es_allocation_memoire;
1988: return;
1989: }
1990:
1991: for(i = 0; i < longueur_enregistrement; i++)
1992: {
1993: /* A FAIRE
1994: s_objet_element = decodage_enregistrement(s_etat_processus,
1995: (*descripteur).descripteur_c);
1996: */
1997: s_objet_element = NULL;
1998:
1999: if (s_objet_element == NULL)
2000: {
2001: liberation(s_etat_processus, s_objet_resultat);
2002: return;
2003: }
2004:
2005: if ((*s_objet_resultat).objet == NULL)
2006: {
2007: if (((*s_objet_resultat).objet = allocation_maillon(
2008: s_etat_processus)) == NULL)
2009: {
2010: (*s_etat_processus).erreur_systeme =
2011: d_es_allocation_memoire;
2012: return;
2013: }
2014:
2015: (*((struct_liste_chainee *) (*s_objet_resultat).objet))
2016: .donnee = s_objet_element;
2017: l_element_courant = (*s_objet_resultat).objet;
2018: }
2019: else
2020: {
2021: if ((l_element_suivant = allocation_maillon(
2022: s_etat_processus)) == NULL)
2023: {
2024: (*s_etat_processus).erreur_systeme =
2025: d_es_allocation_memoire;
2026: return;
2027: }
2028:
2029: (*l_element_courant).suivant = l_element_suivant;
2030: (*l_element_suivant).donnee = s_objet_element;
2031: l_element_courant = l_element_suivant;
2032: }
2033: }
2034:
2035: // On saute les caractère des gestion de la commande
2036: // BACKSPACE.
2037: // A FAIRE
2038: }
1.1 bertrand 2039: }
2040: else
2041: {
2042: /*
2043: * Fichiers de type FLOW
2044: */
1.28 bertrand 2045:
2046: if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces
2047: == 'S')
2048: {
2049: /*
2050: * Fichiers séquentiels
2051: */
2052:
2053: BUG(((*descripteur).type != 'C'), uprintf("Bad filtype !\n"));
2054: longueur_enregistrement = 0;
2055:
2056: if ((position_initiale = ftell((*descripteur).descripteur_c))
2057: == -1)
2058: {
2059: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
2060: return;
2061: }
2062:
1.59 bertrand 2063: l_element_courant_format = (struct_liste_chainee *)
2064: (*(*((struct_fichier *) (*s_objet_argument_1).objet))
2065: .format).objet;
2066: l_element_courant = NULL;
1.28 bertrand 2067:
2068: if ((s_objet_resultat = allocation(s_etat_processus, LST))
2069: == NULL)
2070: {
2071: (*s_etat_processus).erreur_systeme =
2072: d_es_allocation_memoire;
2073: return;
2074: }
2075:
1.59 bertrand 2076: while(l_element_courant_format != NULL)
1.28 bertrand 2077: {
1.59 bertrand 2078: if ((*(*l_element_courant_format).donnee).type != CHN)
2079: {
2080: liberation(s_etat_processus, s_objet_argument_1);
2081: liberation(s_etat_processus, s_objet_resultat);
2082:
2083: (*s_etat_processus).erreur_execution =
2084: d_ex_erreur_type_argument;
2085: return;
2086: }
2087:
2088: if ((format_chaine = conversion_majuscule((unsigned char *)
2089: (*(*l_element_courant_format).donnee).objet))
2090: == NULL)
2091: {
2092: (*s_etat_processus).erreur_systeme =
2093: d_es_allocation_memoire;
2094: return;
2095: }
2096:
2097: if (strncmp("LENGTH*(", format_chaine, 8) != 0)
2098: {
2099: liberation(s_etat_processus, s_objet_argument_1);
2100: liberation(s_etat_processus, s_objet_resultat);
2101: free(format_chaine);
2102:
2103: (*s_etat_processus).erreur_execution =
2104: d_ex_erreur_format_fichier;
2105: return;
2106: }
2107:
2108: longueur = strlen(format_chaine);
2109:
1.60 bertrand 2110: if (format_chaine[longueur - 1] != ')')
1.59 bertrand 2111: {
2112: liberation(s_etat_processus, s_objet_argument_1);
2113: liberation(s_etat_processus, s_objet_resultat);
2114: free(format_chaine);
2115:
2116: (*s_etat_processus).erreur_execution =
2117: d_ex_erreur_format_fichier;
2118: return;
2119: }
2120:
2121: format_chaine[longueur] = d_code_fin_chaine;
2122:
2123: if (format_chaine[8] == '*')
2124: {
2125: format_degenere = d_vrai;
2126: }
2127: else
2128: {
2129: // Détermination de la longueur
2130: format_degenere = d_faux;
2131:
2132: if (sscanf(&(format_chaine[8]), "%ld", &longueur) != 1)
2133: {
2134: liberation(s_etat_processus, s_objet_argument_1);
2135: liberation(s_etat_processus, s_objet_resultat);
2136: free(format_chaine);
2137:
2138: (*s_etat_processus).erreur_execution =
2139: d_ex_erreur_format_fichier;
2140: return;
2141: }
2142: }
2143:
2144: free(format_chaine);
2145:
2146: if (format_degenere == d_vrai)
2147: {
2148: do
2149: {
2150: c = getc((*descripteur).descripteur_c);
2151: longueur_enregistrement++;
2152: } while((c != '\n') && (c != EOF));
2153:
2154: if (fseek((*descripteur).descripteur_c,
2155: position_initiale, SEEK_SET) != 0)
2156: {
2157: liberation(s_etat_processus, s_objet_argument_1);
2158: liberation(s_etat_processus, s_objet_resultat);
2159:
2160: (*s_etat_processus).erreur_systeme =
2161: d_es_erreur_fichier;
2162: return;
2163: }
2164: }
2165: else
2166: {
2167: longueur_enregistrement = longueur;
2168: }
2169:
2170: if ((tampon_lecture = malloc((longueur_enregistrement)
2171: * sizeof(unsigned char))) == NULL)
2172: {
2173: (*s_etat_processus).erreur_systeme =
2174: d_es_allocation_memoire;
2175: return;
2176: }
2177:
2178: longueur_effective = fread(tampon_lecture,
2179: (size_t) sizeof(unsigned char),
2180: (size_t) longueur_enregistrement,
2181: (*descripteur).descripteur_c);
2182:
2183: if (l_element_courant == NULL)
2184: {
2185: // Premier maillon de la liste
2186: if (((*s_objet_resultat).objet =
2187: allocation_maillon(s_etat_processus)) == NULL)
2188: {
2189: (*s_etat_processus).erreur_systeme =
2190: d_es_allocation_memoire;
2191: return;
2192: }
2193:
2194: l_element_courant = (*s_objet_resultat).objet;
2195: }
2196: else
2197: {
2198: if (((*l_element_courant).suivant =
2199: allocation_maillon(s_etat_processus)) == NULL)
2200: {
2201: (*s_etat_processus).erreur_systeme =
2202: d_es_allocation_memoire;
2203: return;
2204: }
2205:
2206: l_element_courant = (*l_element_courant).suivant;
2207: }
2208:
2209: (*l_element_courant).suivant = NULL;
2210:
2211: if (((*l_element_courant).donnee =
2212: allocation(s_etat_processus, CHN)) == NULL)
2213: {
2214: (*s_etat_processus).erreur_systeme =
2215: d_es_allocation_memoire;
2216: return;
2217: }
1.28 bertrand 2218:
1.59 bertrand 2219: if (format_degenere == d_vrai)
2220: {
2221: if (((*(*l_element_courant).donnee).objet =
2222: analyse_flux(s_etat_processus, tampon_lecture,
2223: longueur_enregistrement - 1)) == NULL)
2224: {
2225: return;
2226: }
2227: }
2228: else
2229: {
2230: if (((*(*l_element_courant).donnee).objet =
2231: analyse_flux(s_etat_processus, tampon_lecture,
2232: longueur_enregistrement)) == NULL)
2233: {
2234: return;
2235: }
2236: }
1.28 bertrand 2237:
1.59 bertrand 2238: free(tampon_lecture);
1.28 bertrand 2239:
1.59 bertrand 2240: l_element_courant_format =
2241: (*l_element_courant_format).suivant;
1.28 bertrand 2242: }
2243:
2244: if (empilement(s_etat_processus,
2245: &((*s_etat_processus).l_base_pile),
2246: s_objet_resultat) == d_erreur)
2247: {
2248: return;
2249: }
2250: }
2251: else
2252: {
2253: liberation(s_etat_processus, s_objet_argument_1);
2254:
2255: (*s_etat_processus).erreur_execution =
2256: d_ex_erreur_type_fichier;
2257: return;
2258: }
1.1 bertrand 2259: }
2260: }
1.6 bertrand 2261: else if ((*s_objet_argument_1).type == SCK)
1.1 bertrand 2262: {
2263: /*
2264: * Vérification de l'autorisation de lecture
2265: */
2266:
1.6 bertrand 2267: if ((*((struct_socket *) (*s_objet_argument_1).objet)).protection
2268: == 'W')
1.1 bertrand 2269: {
1.6 bertrand 2270: liberation(s_etat_processus, s_objet_argument_1);
1.1 bertrand 2271:
2272: (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
2273: return;
2274: }
2275:
2276: /*
2277: * Vérification de l'écoute de la socket si celle-ci est connectée
2278: */
2279:
1.6 bertrand 2280: if ((strcmp((*((struct_socket *) (*s_objet_argument_1).objet)).type,
1.1 bertrand 2281: "STREAM") == 0) || (strcmp((*((struct_socket *)
1.6 bertrand 2282: (*s_objet_argument_1).objet)).type, "SEQUENTIAL DATAGRAM")
2283: == 0))
1.1 bertrand 2284: {
1.6 bertrand 2285: if ((*((struct_socket *) (*s_objet_argument_1).objet))
1.1 bertrand 2286: .socket_en_ecoute == 'Y')
2287: {
1.6 bertrand 2288: liberation(s_etat_processus, s_objet_argument_1);
1.1 bertrand 2289:
2290: (*s_etat_processus).erreur_execution = d_ex_socket_en_ecoute;
2291: return;
2292: }
2293: }
2294:
1.6 bertrand 2295: if ((*((struct_socket *) (*s_objet_argument_1).objet)).binaire == 'N')
1.1 bertrand 2296: { // Socket formatée
2297: longueur_questure = 256;
1.55 bertrand 2298: longueur_effective = 0;
2299: tampon_lecture = NULL;
1.1 bertrand 2300:
1.56 bertrand 2301: attente.tv_sec = 0;
2302: attente.tv_nsec = GRANULARITE_us * 1000;
2303:
1.57 bertrand 2304: trame_complete = d_faux;
2305: position_initiale = 0;
2306: position_finale = 0;
2307:
1.1 bertrand 2308: do
2309: {
1.55 bertrand 2310: presence_indicateur = d_faux;
2311:
2312: if ((tampon_lecture = realloc(tampon_lecture,
1.57 bertrand 2313: (longueur_effective + longueur_questure + 1)
1.55 bertrand 2314: * sizeof(unsigned char))) == NULL)
1.1 bertrand 2315: {
2316: (*s_etat_processus).erreur_systeme =
2317: d_es_allocation_memoire;
2318: return;
2319: }
2320:
1.44 bertrand 2321: # ifndef SEMAPHORES_NOMMES
2322: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
2323: # else
2324: if (sem_post((*s_etat_processus).semaphore_fork) != 0)
2325: # endif
1.1 bertrand 2326: {
2327: (*s_etat_processus).erreur_systeme = d_es_processus;
2328: return;
2329: }
2330:
1.55 bertrand 2331: if ((*((struct_socket *) (*s_objet_argument_1).objet))
2332: .domaine == PF_UNIX)
2333: {
2334: longueur_adresse = sizeof(adresse_unix);
1.57 bertrand 2335:
2336: do
2337: {
2338: ios = recvfrom((*((struct_socket *)
2339: (*s_objet_argument_1).objet)).socket,
2340: tampon_lecture + longueur_effective,
2341: longueur_questure,
2342: MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
2343: &adresse_unix, &longueur_adresse);
2344: } while((ios == -1) && (errno == EINTR));
1.55 bertrand 2345: }
2346: else if ((*((struct_socket *) (*s_objet_argument_1).objet))
2347: .domaine == PF_INET)
2348: {
2349: longueur_adresse = sizeof(adresse_ipv4);
1.57 bertrand 2350:
2351: do
2352: {
2353: ios = recvfrom((*((struct_socket *)
2354: (*s_objet_argument_1).objet)).socket,
2355: tampon_lecture + longueur_effective,
2356: longueur_questure,
2357: MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
2358: &adresse_ipv4, &longueur_adresse);
2359: } while((ios == -1) && (errno == EINTR));
1.55 bertrand 2360: }
2361: else if ((*((struct_socket *) (*s_objet_argument_1).objet))
2362: .domaine == PF_INET6)
2363: {
2364: # ifdef IPV6
2365: longueur_adresse = sizeof(adresse_ipv6);
1.57 bertrand 2366:
2367: do
2368: {
2369: ios = recvfrom((*((struct_socket *)
2370: (*s_objet_argument_1).objet)).socket,
2371: tampon_lecture + longueur_effective,
2372: longueur_questure,
2373: MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
2374: &adresse_ipv6, &longueur_adresse);
2375: } while((ios == -1) && (errno == EINTR));
1.55 bertrand 2376: # else
2377: if ((*s_etat_processus).langue == 'F')
2378: {
2379: printf("+++Attention : Support du protocole"
2380: " IPv6 indisponible\n");
2381: }
2382: else
2383: {
2384: printf("+++Warning : IPv6 support "
2385: "unavailable\n");
2386: }
2387:
2388: longueur_adresse = 0;
2389: longueur_effective = 0;
2390: ios = 0;
2391: # endif
2392: }
2393: else
2394: {
2395: free(tampon_lecture);
2396: liberation(s_etat_processus, s_objet_argument_1);
2397:
2398: # ifndef SEMAPHORES_NOMMES
2399: while(sem_wait(&((*s_etat_processus)
2400: .semaphore_fork)) != 0)
2401: # else
2402: while(sem_wait((*s_etat_processus)
2403: .semaphore_fork) != 0)
2404: # endif
2405: {
2406: (*s_etat_processus).erreur_systeme =
2407: d_es_processus;
2408: }
2409:
2410: (*s_etat_processus).erreur_execution =
2411: d_ex_erreur_acces_fichier;
2412: return;
2413: }
2414:
2415: if (ios < 0)
2416: {
2417: nanosleep(&attente, NULL);
2418: INCR_GRANULARITE(attente.tv_nsec);
2419: scrutation_injection(s_etat_processus);
2420: }
1.56 bertrand 2421: else
2422: {
2423: attente.tv_sec = 0;
2424: attente.tv_nsec = GRANULARITE_us * 1000;
2425: }
1.55 bertrand 2426:
2427: if ((*s_etat_processus).var_volatile_requete_arret == -1)
2428: {
1.62 bertrand 2429: if (ios >= 0)
2430: {
2431: longueur_effective += ios;
2432: }
2433:
1.55 bertrand 2434: break;
2435: }
2436:
2437: // Une donnée a été reçue.
2438:
2439: if (ios >= 0)
1.1 bertrand 2440: {
1.55 bertrand 2441: ancienne_longueur_effective = longueur_effective;
2442: longueur_effective += ios;
2443: position_initiale = 0;
2444: presence_indicateur = d_faux;
2445:
2446: do
2447: {
2448: if (tampon_lecture[position_initiale] == '{')
2449: {
2450: presence_indicateur = d_vrai;
2451: break;
2452: }
2453:
2454: position_initiale++;
2455: } while(position_initiale < longueur_effective);
2456:
2457: if (presence_indicateur == d_vrai)
2458: {
2459: position_finale = position_initiale + 1;
2460: presence_chaine = d_faux;
2461: presence_indicateur = d_faux;
2462: niveau = 1;
2463:
2464: while(position_finale < longueur_effective)
2465: {
2466: caractere = tampon_lecture[position_finale];
2467:
2468: if (caractere == '"')
2469: {
1.59 bertrand 2470: if (position_finale > 0)
2471: {
2472: if (tampon_lecture[position_finale - 1]
2473: != '\\')
2474: {
2475: presence_chaine = (presence_chaine ==
2476: d_vrai) ? d_faux : d_vrai;
2477: }
2478: }
2479: else
2480: {
2481: presence_chaine =
2482: (presence_chaine == d_vrai)
2483: ? d_faux : d_vrai;
2484: }
1.55 bertrand 2485: }
2486: else
2487: {
2488: if (presence_chaine == d_faux)
2489: {
2490: if (caractere == '{')
2491: {
2492: niveau++;
2493: }
2494: else if (caractere == '}')
2495: {
2496: niveau--;
2497: }
2498: }
2499: }
2500:
2501: if (niveau == 0)
2502: {
2503: presence_indicateur = d_vrai;
1.57 bertrand 2504: trame_complete = d_vrai;
1.55 bertrand 2505: break;
2506: }
2507:
2508: position_finale++;
2509: }
2510: }
2511:
2512: // On retire du buffer position_finale -
2513: // ancienne_longueur_effective octets.
2514:
1.6 bertrand 2515: if ((*((struct_socket *) (*s_objet_argument_1).objet))
2516: .domaine == PF_UNIX)
1.1 bertrand 2517: {
2518: longueur_adresse = sizeof(adresse_unix);
1.57 bertrand 2519:
2520: do
2521: {
2522: ios = recvfrom((*((struct_socket *)
2523: (*s_objet_argument_1).objet)).socket,
2524: poubelle, position_finale
2525: - ancienne_longueur_effective,
2526: MSG_DONTWAIT, (struct sockaddr *)
2527: &adresse_unix, &longueur_adresse);
1.62 bertrand 2528: } while((ios == -1) && (errno == EINTR));
1.1 bertrand 2529: }
1.55 bertrand 2530: else if ((*((struct_socket *) (*s_objet_argument_1)
2531: .objet)).domaine == PF_INET)
1.1 bertrand 2532: {
2533: longueur_adresse = sizeof(adresse_ipv4);
1.57 bertrand 2534:
2535: do
2536: {
2537: ios = recvfrom((*((struct_socket *)
2538: (*s_objet_argument_1).objet)).socket,
2539: poubelle, position_finale
2540: - ancienne_longueur_effective,
2541: MSG_DONTWAIT, (struct sockaddr *)
2542: &adresse_ipv4, &longueur_adresse);
1.62 bertrand 2543: } while((ios == -1) && (errno == EINTR));
1.1 bertrand 2544: }
1.55 bertrand 2545: else if ((*((struct_socket *) (*s_objet_argument_1)
2546: .objet)) .domaine == PF_INET6)
1.1 bertrand 2547: {
1.19 bertrand 2548: # ifdef IPV6
1.1 bertrand 2549: longueur_adresse = sizeof(adresse_ipv6);
1.57 bertrand 2550:
2551: do
2552: {
2553: ios = recvfrom((*((struct_socket *)
2554: (*s_objet_argument_1).objet)).socket,
2555: poubelle, position_finale
2556: - ancienne_longueur_effective,
2557: MSG_DONTWAIT, (struct sockaddr *)
2558: &adresse_ipv6, &longueur_adresse);
1.62 bertrand 2559: } while((ios == -1) && (errno == EINTR));
1.19 bertrand 2560: # else
1.21 bertrand 2561: if ((*s_etat_processus).langue == 'F')
2562: {
2563: printf("+++Attention : Support du protocole"
1.22 bertrand 2564: " IPv6 indisponible\n");
1.21 bertrand 2565: }
2566: else
2567: {
1.23 bertrand 2568: printf("+++Warning : IPv6 support "
1.21 bertrand 2569: "unavailable\n");
2570: }
1.51 bertrand 2571:
2572: longueur_adresse = 0;
1.19 bertrand 2573: # endif
1.1 bertrand 2574: }
1.55 bertrand 2575:
2576: if (presence_indicateur == d_faux)
1.1 bertrand 2577: {
1.55 bertrand 2578: poll_fd.fd = (*((struct_socket *)
2579: (*s_objet_argument_1).objet)).socket;
2580: poll_fd.events = POLLIN;
1.1 bertrand 2581:
1.63 bertrand 2582: while((ios = poll(&poll_fd, 1, 10000)) <= 0)
1.1 bertrand 2583: {
1.55 bertrand 2584: // La fin de la trame n'est pas atteinte
2585: // et il reste quelque chose à lire.
1.1 bertrand 2586:
1.55 bertrand 2587: switch(ios)
2588: {
2589: case EINTR:
2590: {
1.62 bertrand 2591: if ((*s_etat_processus)
2592: .var_volatile_requete_arret == -1)
2593: {
2594: liberation(s_etat_processus,
2595: s_objet_argument_1);
2596: free(tampon_lecture);
2597: return;
2598: }
2599:
1.55 bertrand 2600: break;
2601: }
1.1 bertrand 2602:
1.55 bertrand 2603: case 0:
2604: {
2605: liberation(s_etat_processus,
2606: s_objet_argument_1);
2607: free(tampon_lecture);
1.1 bertrand 2608:
1.55 bertrand 2609: (*s_etat_processus).erreur_execution =
2610: d_ex_fin_de_fichier_atteinte;
2611: return;
2612: }
2613: }
2614: }
1.1 bertrand 2615: }
2616: }
2617:
1.44 bertrand 2618: # ifndef SEMAPHORES_NOMMES
2619: while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
2620: # else
2621: while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
2622: # endif
1.1 bertrand 2623: {
1.44 bertrand 2624: if (errno == EINTR)
1.43 bertrand 2625: {
2626: (*s_etat_processus).erreur_systeme = d_es_processus;
2627: return;
2628: }
1.1 bertrand 2629: }
2630:
2631: if ((*s_etat_processus).var_volatile_requete_arret == -1)
2632: {
2633:
2634: /*
2635: * Si le père tue le processus courant grâce au signal
2636: * SIGFSTOP, on ne renvoie pas d'erreur. Ce fonctionnement
2637: * correspond à l'utilisation de STOP sur le processus
2638: * en cours. La variable longueur_effective vaut '-1'.
2639: */
2640:
2641: free(tampon_lecture);
1.6 bertrand 2642: liberation(s_etat_processus, s_objet_argument_1);
1.1 bertrand 2643: return;
2644: }
2645:
2646: if (longueur_effective == -1)
2647: {
2648: free(tampon_lecture);
1.6 bertrand 2649: liberation(s_etat_processus, s_objet_argument_1);
1.1 bertrand 2650:
2651: (*s_etat_processus).erreur_execution =
2652: d_ex_erreur_acces_fichier;
2653: return;
2654: }
1.57 bertrand 2655: } while(trame_complete == d_faux);
1.1 bertrand 2656:
2657: tampon_lecture[++position_finale] = d_code_fin_chaine;
2658: tampon = (*s_etat_processus).instruction_courante;
2659: (*s_etat_processus).instruction_courante = &(tampon_lecture
2660: [position_initiale]);
2661:
2662: indicateur_48 = test_cfsf(s_etat_processus, 48);
2663: cf(s_etat_processus, 48);
2664:
2665: recherche_type(s_etat_processus);
2666:
2667: if ((*s_etat_processus).erreur_execution != d_ex)
2668: {
2669: (*s_etat_processus).instruction_courante = tampon;
2670: free(tampon_lecture);
2671:
1.57 bertrand 2672: if (indicateur_48 == d_vrai)
2673: {
2674: sf(s_etat_processus, 48);
2675: }
2676: else
2677: {
2678: cf(s_etat_processus, 48);
2679: }
2680:
2681: if ((*s_etat_processus).var_volatile_requete_arret == -1)
2682: {
2683: (*s_etat_processus).erreur_execution = d_ex;
2684: }
2685:
1.6 bertrand 2686: liberation(s_etat_processus, s_objet_argument_1);
1.1 bertrand 2687: return;
2688: }
2689:
2690: if (indicateur_48 == d_vrai)
2691: {
2692: sf(s_etat_processus, 48);
2693: }
2694: else
2695: {
2696: cf(s_etat_processus, 48);
2697: }
2698:
2699: (*s_etat_processus).instruction_courante = tampon;
2700:
2701: /*
2702: * Création de la liste de sortie
2703: */
2704:
2705: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2706: &s_objet_type) == d_erreur)
2707: {
2708: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2709: return;
2710: }
2711:
2712: if ((s_objet_resultat = allocation(s_etat_processus, LST))
2713: == NULL)
2714: {
2715: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2716: return;
2717: }
2718:
2719: if (((*s_objet_resultat).objet =
2720: allocation_maillon(s_etat_processus)) == NULL)
2721: {
2722: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2723: return;
2724: }
2725:
2726: (*((struct_liste_chainee *) (*s_objet_resultat).objet))
2727: .donnee = s_objet_type;
2728:
2729: if (((*((struct_liste_chainee *) (*s_objet_resultat).objet))
2730: .suivant = allocation_maillon(s_etat_processus)) == NULL)
2731: {
2732: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2733: return;
2734: }
2735:
2736: (*(*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant)
2737: .suivant = NULL;
2738:
2739: if ((s_objet_adresse = allocation(s_etat_processus, LST))
2740: == NULL)
2741: {
2742: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2743: return;
2744: }
2745:
2746: (*(*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant)
2747: .donnee = s_objet_adresse;
2748:
2749: /*
2750: * Les informations concernant la cible sont valides si
2751: * la socket est non connectée et des domaines INET ou INET6.
2752: * Dans tous les autres cas, on renvoie une liste vide.
2753: */
2754:
1.6 bertrand 2755: if (((*((struct_socket *) (*s_objet_argument_1).objet)).domaine
1.1 bertrand 2756: == PF_UNIX) || (strcmp((*((struct_socket *)
1.6 bertrand 2757: (*s_objet_argument_1).objet)).type, "STREAM") == 0) ||
2758: (strcmp((*((struct_socket *) (*s_objet_argument_1).objet))
1.1 bertrand 2759: .type, "SEQUENTIAL DATAGRAM") == 0))
2760: {
2761: (*s_objet_adresse).objet = NULL;
2762: }
1.6 bertrand 2763: else if ((*((struct_socket *) (*s_objet_argument_1).objet))
1.1 bertrand 2764: .domaine == PF_INET)
2765: {
2766: if (((*s_objet_adresse).objet =
2767: allocation_maillon(s_etat_processus)) == NULL)
2768: {
2769: (*s_etat_processus).erreur_systeme =
2770: d_es_allocation_memoire;
2771: return;
2772: }
2773:
2774: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
2775: .donnee = allocation(s_etat_processus, VIN)) == NULL)
2776: {
2777: (*s_etat_processus).erreur_systeme =
2778: d_es_allocation_memoire;
2779: return;
2780: }
2781:
2782: (*((struct_vecteur *) (*(*((struct_liste_chainee *)
2783: (*s_objet_adresse).objet)).donnee).objet)).taille = 4;
2784:
2785: if (((*((struct_vecteur *) (*(*((struct_liste_chainee *)
2786: (*s_objet_adresse).objet)).donnee).objet)).tableau =
2787: malloc(4 * sizeof(integer8))) == NULL)
2788: {
2789: (*s_etat_processus).erreur_systeme =
2790: d_es_allocation_memoire;
2791: return;
2792: }
2793:
2794: ((integer8 *) (*((struct_vecteur *)
2795: (*(*((struct_liste_chainee *) (*s_objet_adresse)
2796: .objet)).donnee).objet)).tableau)[0] =
2797: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 24) & 0xFF;
2798: ((integer8 *) (*((struct_vecteur *)
2799: (*(*((struct_liste_chainee *) (*s_objet_adresse)
2800: .objet)).donnee).objet)).tableau)[1] =
2801: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 16) & 0xFF;
2802: ((integer8 *) (*((struct_vecteur *)
2803: (*(*((struct_liste_chainee *) (*s_objet_adresse)
2804: .objet)).donnee).objet)).tableau)[2] =
2805: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 8) & 0xFF;
2806: ((integer8 *) (*((struct_vecteur *)
2807: (*(*((struct_liste_chainee *) (*s_objet_adresse)
2808: .objet)).donnee).objet)).tableau)[3] =
2809: ntohl(adresse_ipv4.sin_addr.s_addr) & 0xFF;
2810:
2811: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
2812: .suivant = allocation_maillon(s_etat_processus))
2813: == NULL)
2814: {
2815: (*s_etat_processus).erreur_systeme =
2816: d_es_allocation_memoire;
2817: return;
2818: }
2819:
2820: if (((*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
2821: .suivant).donnee = allocation(s_etat_processus, INT))
2822: == NULL)
2823: {
2824: (*s_etat_processus).erreur_systeme =
2825: d_es_allocation_memoire;
2826: return;
2827: }
2828:
2829: (*((integer8 *) (*(*(*((struct_liste_chainee *)
1.6 bertrand 2830: (*s_objet_adresse).objet)).suivant).donnee).objet)) =
1.1 bertrand 2831: (integer8) ntohs(adresse_ipv4.sin_port);
2832:
2833: (*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
2834: .suivant).suivant = NULL;
2835: }
1.6 bertrand 2836: else if ((*((struct_socket *) (*s_objet_argument_1).objet))
1.1 bertrand 2837: .domaine == PF_INET6)
2838: {
1.19 bertrand 2839: # ifdef IPV6
1.1 bertrand 2840: if (((*s_objet_adresse).objet =
2841: allocation_maillon(s_etat_processus)) == NULL)
2842: {
2843: (*s_etat_processus).erreur_systeme =
2844: d_es_allocation_memoire;
2845: return;
2846: }
2847:
2848: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
2849: .donnee = allocation(s_etat_processus, VIN)) == NULL)
2850: {
2851: (*s_etat_processus).erreur_systeme =
2852: d_es_allocation_memoire;
2853: return;
2854: }
2855:
2856: (*((struct_vecteur *) (*(*((struct_liste_chainee *)
2857: (*s_objet_adresse).objet)).donnee).objet)).taille = 16;
2858:
2859: if (((*((struct_vecteur *) (*(*((struct_liste_chainee *)
2860: (*s_objet_adresse).objet)).donnee).objet)).tableau =
2861: malloc(16 * sizeof(integer8))) == NULL)
2862: {
2863: (*s_etat_processus).erreur_systeme =
2864: d_es_allocation_memoire;
2865: return;
2866: }
2867:
2868: for(i = 0; i < 16; i++)
2869: {
2870: ((integer8 *) (*((struct_vecteur *)
2871: (*(*((struct_liste_chainee *) (*s_objet_adresse)
2872: .objet)).donnee).objet)).tableau)[0] =
2873: adresse_ipv6.sin6_addr.s6_addr[i];
2874: }
2875:
2876: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
2877: .suivant = allocation_maillon(s_etat_processus))
2878: == NULL)
2879: {
2880: (*s_etat_processus).erreur_systeme =
2881: d_es_allocation_memoire;
2882: return;
2883: }
2884:
2885: if (((*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
2886: .suivant).donnee = allocation(s_etat_processus, INT))
2887: == NULL)
2888: {
2889: (*s_etat_processus).erreur_systeme =
2890: d_es_allocation_memoire;
2891: return;
2892: }
2893:
2894: (*((integer8 *) (*(*(*((struct_liste_chainee *)
1.6 bertrand 2895: (*s_objet_adresse).objet)).suivant).donnee).objet)) =
1.1 bertrand 2896: (integer8) ntohs(adresse_ipv6.sin6_port);
2897:
2898: (*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
2899: .suivant).suivant = NULL;
1.19 bertrand 2900: # else
1.21 bertrand 2901: if ((*s_etat_processus).langue == 'F')
2902: {
2903: printf("+++Attention : Support du protocole"
1.22 bertrand 2904: " IPv6 indisponible\n");
1.21 bertrand 2905: }
2906: else
2907: {
1.23 bertrand 2908: printf("+++Warning : IPv6 support "
1.21 bertrand 2909: "unavailable\n");
2910: }
1.19 bertrand 2911: # endif
1.1 bertrand 2912: }
2913: else
2914: {
2915: longueur_adresse = 0;
2916: recvfrom((*((struct_socket *)
1.6 bertrand 2917: (*s_objet_argument_1).objet)).socket, tampon_lecture,
1.1 bertrand 2918: position_finale, MSG_DONTWAIT,
2919: NULL, &longueur_adresse);
2920: }
2921:
2922: free(tampon_lecture);
2923:
2924: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2925: s_objet_resultat) == d_erreur)
2926: {
2927: return;
2928: }
2929: }
1.28 bertrand 2930: else if ((*((struct_socket *) (*s_objet_argument_1).objet)).binaire
2931: == 'Y')
2932: { // UNFORMATTED
2933: }
1.1 bertrand 2934: else
1.28 bertrand 2935: { // FLOW
2936: longueur_questure = 256;
2937:
2938: do
2939: {
2940: if ((tampon_lecture = malloc((longueur_questure + 1) *
2941: sizeof(unsigned char))) == NULL)
2942: {
2943: (*s_etat_processus).erreur_systeme =
2944: d_es_allocation_memoire;
2945: return;
2946: }
2947:
1.44 bertrand 2948: # ifndef SEMAPHORES_NOMMES
2949: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
2950: # else
2951: if (sem_post((*s_etat_processus).semaphore_fork) != 0)
2952: # endif
1.28 bertrand 2953: {
2954: (*s_etat_processus).erreur_systeme = d_es_processus;
2955: return;
2956: }
2957:
1.30 bertrand 2958: attente.tv_sec = 0;
2959: attente.tv_nsec = GRANULARITE_us * 1000;
2960:
1.28 bertrand 2961: for(;;)
2962: {
2963: if ((*((struct_socket *) (*s_objet_argument_1).objet))
2964: .domaine == PF_UNIX)
2965: {
2966: longueur_adresse = sizeof(adresse_unix);
2967: longueur_effective = recvfrom((*((struct_socket *)
2968: (*s_objet_argument_1).objet)).socket,
2969: tampon_lecture, longueur_questure,
2970: MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
2971: &adresse_unix, &longueur_adresse);
2972: }
2973: else if ((*((struct_socket *) (*s_objet_argument_1).objet))
2974: .domaine == PF_INET)
2975: {
2976: longueur_adresse = sizeof(adresse_ipv4);
2977: longueur_effective = recvfrom((*((struct_socket *)
2978: (*s_objet_argument_1).objet)).socket,
2979: tampon_lecture, longueur_questure,
2980: MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
2981: &adresse_ipv4, &longueur_adresse);
2982: }
2983: else if ((*((struct_socket *) (*s_objet_argument_1).objet))
2984: .domaine == PF_INET6)
2985: {
2986: # ifdef IPV6
2987: longueur_adresse = sizeof(adresse_ipv6);
2988: longueur_effective = recvfrom((*((struct_socket *)
2989: (*s_objet_argument_1).objet)).socket,
2990: tampon_lecture, longueur_questure,
2991: MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
2992: &adresse_ipv6, &longueur_adresse);
2993: # else
2994: if ((*s_etat_processus).langue == 'F')
2995: {
2996: printf("+++Attention : Support du protocole"
2997: " IPv6 indisponible\n");
2998: }
2999: else
3000: {
3001: printf("+++Warning : IPv6 support "
3002: "unavailable\n");
3003: }
1.51 bertrand 3004:
3005: longueur_adresse = 0;
3006: longueur_effective = 0;
1.28 bertrand 3007: # endif
3008: }
3009: else
3010: {
3011: free(tampon_lecture);
3012: liberation(s_etat_processus, s_objet_argument_1);
3013:
1.44 bertrand 3014: # ifndef SEMAPHORES_NOMMES
3015: while(sem_wait(&((*s_etat_processus)
3016: .semaphore_fork)) != 0)
3017: # else
3018: while(sem_wait((*s_etat_processus)
3019: .semaphore_fork) != 0)
3020: # endif
1.28 bertrand 3021: {
1.43 bertrand 3022: if (errno != EINTR)
3023: {
3024: (*s_etat_processus).erreur_systeme =
3025: d_es_processus;
3026: return;
3027: }
1.28 bertrand 3028: }
3029:
3030: (*s_etat_processus).erreur_execution =
3031: d_ex_erreur_acces_fichier;
3032: return;
3033: }
3034:
3035: if (longueur_effective < 0)
3036: {
3037: nanosleep(&attente, NULL);
1.30 bertrand 3038: INCR_GRANULARITE(attente.tv_nsec);
1.28 bertrand 3039: scrutation_injection(s_etat_processus);
3040: }
3041:
3042: if (((*s_etat_processus).var_volatile_requete_arret == -1)
3043: || (longueur_effective >= 0))
3044: {
3045: break;
3046: }
3047: }
3048:
1.44 bertrand 3049: # ifndef SEMAPHORES_NOMMES
3050: while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
3051: # else
3052: while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
3053: # endif
1.28 bertrand 3054: {
1.43 bertrand 3055: if (errno != EINTR)
3056: {
3057: (*s_etat_processus).erreur_systeme = d_es_processus;
3058: return;
3059: }
1.28 bertrand 3060: }
3061:
3062: if ((*s_etat_processus).var_volatile_requete_arret == -1)
3063: {
3064:
3065: /*
3066: * Si le père tue le processus courant grâce au signal
3067: * SIGFSTOP, on ne renvoie pas d'erreur. Ce fonctionnement
3068: * correspond à l'utilisation de STOP sur le processus
3069: * en cours. La variable longueur_effective vaut '-1'.
3070: */
3071:
3072: free(tampon_lecture);
3073: liberation(s_etat_processus, s_objet_argument_1);
3074: return;
3075: }
3076:
3077: if (longueur_effective == -1)
3078: {
3079: free(tampon_lecture);
3080: liberation(s_etat_processus, s_objet_argument_1);
3081:
3082: (*s_etat_processus).erreur_execution =
3083: d_ex_erreur_acces_fichier;
3084: return;
3085: }
3086:
3087: if (longueur_effective == longueur_questure)
3088: {
3089: free(tampon_lecture);
3090: longueur_questure *= 2;
3091: }
3092: } while(longueur_effective == longueur_questure);
3093:
3094: longueur_enregistrement = 1;
3095:
3096: for(i = 0; i < longueur_effective; i++)
3097: {
3098: if (isprint(tampon_lecture[i]) != 0)
3099: {
3100: longueur_enregistrement += 4;
3101: }
3102: else
3103: {
3104: longueur_enregistrement++;
3105: }
3106: }
3107:
3108: /*
3109: * Création de la liste de sortie
3110: */
3111:
3112: if ((s_objet_type = allocation(s_etat_processus, CHN)) == NULL)
3113: {
3114: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3115: return;
3116: }
3117:
3118: if (((*s_objet_type).objet = malloc(longueur_enregistrement *
3119: sizeof(unsigned char))) == NULL)
3120: {
3121: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3122: return;
3123: }
3124:
3125: ptr = (*s_objet_type).objet;
3126:
3127: for(i = 0; i < longueur_effective; i++)
3128: {
3129: if (isprint(tampon_lecture[i]) != 0)
3130: {
3131: (*ptr) = tampon_lecture[i];
3132: ptr++;
3133: }
3134: else
3135: {
3136: (*ptr) = '\\';
3137: ptr++;
3138: (*ptr) = 'x';
3139: ptr++;
3140: sprintf(ptr, "%02X", tampon_lecture[i]);
3141: ptr += 2;
3142: }
3143: }
3144:
3145: (*ptr) = d_code_fin_chaine;
3146:
3147: if ((s_objet_resultat = allocation(s_etat_processus, LST))
3148: == NULL)
3149: {
3150: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3151: return;
3152: }
3153:
3154: if (((*s_objet_resultat).objet =
3155: allocation_maillon(s_etat_processus)) == NULL)
3156: {
3157: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3158: return;
3159: }
3160:
3161: (*((struct_liste_chainee *) (*s_objet_resultat).objet))
3162: .donnee = s_objet_type;
3163:
3164: if (((*((struct_liste_chainee *) (*s_objet_resultat).objet))
3165: .suivant = allocation_maillon(s_etat_processus)) == NULL)
3166: {
3167: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3168: return;
3169: }
3170:
3171: (*(*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant)
3172: .suivant = NULL;
3173:
3174: if ((s_objet_adresse = allocation(s_etat_processus, LST))
3175: == NULL)
3176: {
3177: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3178: return;
3179: }
3180:
3181: (*(*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant)
3182: .donnee = s_objet_adresse;
3183:
3184: /*
3185: * Les informations concernant la cible sont valides si
1.30 bertrand 3186: * la socket est non connectée et que les domaines sont
3187: * INET ou INET6.
1.28 bertrand 3188: * Dans tous les autres cas, on renvoie une liste vide.
3189: */
3190:
3191: if (((*((struct_socket *) (*s_objet_argument_1).objet)).domaine
3192: == PF_UNIX) || (strcmp((*((struct_socket *)
3193: (*s_objet_argument_1).objet)).type, "STREAM") == 0) ||
3194: (strcmp((*((struct_socket *) (*s_objet_argument_1).objet))
3195: .type, "SEQUENTIAL DATAGRAM") == 0))
3196: {
1.30 bertrand 3197: // POSITION_FINALE peut être utilisée sans être initialisée !
3198: // virer position_finale pour longueur_effective
1.28 bertrand 3199: longueur_adresse = 0;
3200: recvfrom((*((struct_socket *)
3201: (*s_objet_argument_1).objet)).socket, tampon_lecture,
3202: position_finale, MSG_DONTWAIT,
3203: NULL, &longueur_adresse);
3204:
3205: (*s_objet_adresse).objet = NULL;
3206: }
3207: else if ((*((struct_socket *) (*s_objet_argument_1).objet))
3208: .domaine == PF_INET)
3209: {
3210: longueur_adresse = sizeof(adresse_ipv4);
3211: recvfrom((*((struct_socket *)
3212: (*s_objet_argument_1).objet)).socket, tampon_lecture,
3213: position_finale, MSG_DONTWAIT,
3214: (struct sockaddr *) &adresse_ipv4, &longueur_adresse);
3215:
3216: if (((*s_objet_adresse).objet =
3217: allocation_maillon(s_etat_processus)) == NULL)
3218: {
3219: (*s_etat_processus).erreur_systeme =
3220: d_es_allocation_memoire;
3221: return;
3222: }
3223:
3224: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
3225: .donnee = allocation(s_etat_processus, VIN)) == NULL)
3226: {
3227: (*s_etat_processus).erreur_systeme =
3228: d_es_allocation_memoire;
3229: return;
3230: }
3231:
3232: (*((struct_vecteur *) (*(*((struct_liste_chainee *)
3233: (*s_objet_adresse).objet)).donnee).objet)).taille = 4;
3234:
3235: if (((*((struct_vecteur *) (*(*((struct_liste_chainee *)
3236: (*s_objet_adresse).objet)).donnee).objet)).tableau =
3237: malloc(4 * sizeof(integer8))) == NULL)
3238: {
3239: (*s_etat_processus).erreur_systeme =
3240: d_es_allocation_memoire;
3241: return;
3242: }
3243:
3244: ((integer8 *) (*((struct_vecteur *)
3245: (*(*((struct_liste_chainee *) (*s_objet_adresse)
3246: .objet)).donnee).objet)).tableau)[0] =
3247: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 24) & 0xFF;
3248: ((integer8 *) (*((struct_vecteur *)
3249: (*(*((struct_liste_chainee *) (*s_objet_adresse)
3250: .objet)).donnee).objet)).tableau)[1] =
3251: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 16) & 0xFF;
3252: ((integer8 *) (*((struct_vecteur *)
3253: (*(*((struct_liste_chainee *) (*s_objet_adresse)
3254: .objet)).donnee).objet)).tableau)[2] =
3255: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 8) & 0xFF;
3256: ((integer8 *) (*((struct_vecteur *)
3257: (*(*((struct_liste_chainee *) (*s_objet_adresse)
3258: .objet)).donnee).objet)).tableau)[3] =
3259: ntohl(adresse_ipv4.sin_addr.s_addr) & 0xFF;
3260:
3261: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
3262: .suivant = allocation_maillon(s_etat_processus))
3263: == NULL)
3264: {
3265: (*s_etat_processus).erreur_systeme =
3266: d_es_allocation_memoire;
3267: return;
3268: }
3269:
3270: if (((*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
3271: .suivant).donnee = allocation(s_etat_processus, INT))
3272: == NULL)
3273: {
3274: (*s_etat_processus).erreur_systeme =
3275: d_es_allocation_memoire;
3276: return;
3277: }
3278:
3279: (*((integer8 *) (*(*(*((struct_liste_chainee *)
3280: (*s_objet_adresse).objet)).suivant).donnee).objet)) =
3281: (integer8) ntohs(adresse_ipv4.sin_port);
3282:
3283: (*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
3284: .suivant).suivant = NULL;
3285: }
3286: else if ((*((struct_socket *) (*s_objet_argument_1).objet))
3287: .domaine == PF_INET6)
3288: {
3289: # ifdef IPV6
3290: longueur_adresse = sizeof(adresse_ipv6);
3291: recvfrom((*((struct_socket *)
3292: (*s_objet_argument_1).objet)).socket, tampon_lecture,
3293: position_finale, MSG_DONTWAIT,
3294: (struct sockaddr *) &adresse_ipv6, &longueur_adresse);
3295:
3296: if (((*s_objet_adresse).objet =
3297: allocation_maillon(s_etat_processus)) == NULL)
3298: {
3299: (*s_etat_processus).erreur_systeme =
3300: d_es_allocation_memoire;
3301: return;
3302: }
3303:
3304: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
3305: .donnee = allocation(s_etat_processus, VIN)) == NULL)
3306: {
3307: (*s_etat_processus).erreur_systeme =
3308: d_es_allocation_memoire;
3309: return;
3310: }
3311:
3312: (*((struct_vecteur *) (*(*((struct_liste_chainee *)
3313: (*s_objet_adresse).objet)).donnee).objet)).taille = 16;
3314:
3315: if (((*((struct_vecteur *) (*(*((struct_liste_chainee *)
3316: (*s_objet_adresse).objet)).donnee).objet)).tableau =
3317: malloc(16 * sizeof(integer8))) == NULL)
3318: {
3319: (*s_etat_processus).erreur_systeme =
3320: d_es_allocation_memoire;
3321: return;
3322: }
3323:
3324: for(i = 0; i < 16; i++)
3325: {
3326: ((integer8 *) (*((struct_vecteur *)
3327: (*(*((struct_liste_chainee *) (*s_objet_adresse)
3328: .objet)).donnee).objet)).tableau)[0] =
3329: adresse_ipv6.sin6_addr.s6_addr[i];
3330: }
3331:
3332: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
3333: .suivant = allocation_maillon(s_etat_processus))
3334: == NULL)
3335: {
3336: (*s_etat_processus).erreur_systeme =
3337: d_es_allocation_memoire;
3338: return;
3339: }
3340:
3341: if (((*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
3342: .suivant).donnee = allocation(s_etat_processus, INT))
3343: == NULL)
3344: {
3345: (*s_etat_processus).erreur_systeme =
3346: d_es_allocation_memoire;
3347: return;
3348: }
3349:
3350: (*((integer8 *) (*(*(*((struct_liste_chainee *)
3351: (*s_objet_adresse).objet)).suivant).donnee).objet)) =
3352: (integer8) ntohs(adresse_ipv6.sin6_port);
3353:
3354: (*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
3355: .suivant).suivant = NULL;
3356: # else
3357: if ((*s_etat_processus).langue == 'F')
3358: {
3359: printf("+++Attention : Support du protocole"
3360: " IPv6 indisponible\n");
3361: }
3362: else
3363: {
3364: printf("+++Warning : IPv6 support "
3365: "unavailable\n");
3366: }
3367: # endif
3368: }
3369: else
3370: {
3371: longueur_adresse = 0;
3372: recvfrom((*((struct_socket *)
3373: (*s_objet_argument_1).objet)).socket, tampon_lecture,
3374: position_finale, MSG_DONTWAIT,
3375: NULL, &longueur_adresse);
3376: }
3377:
3378: free(tampon_lecture);
3379:
3380: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
3381: s_objet_resultat) == d_erreur)
3382: {
3383: return;
3384: }
1.1 bertrand 3385: }
3386: }
3387: else
3388: {
3389: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
3390: return;
3391: }
3392:
1.6 bertrand 3393: liberation(s_etat_processus, s_objet_argument_1);
1.1 bertrand 3394:
3395: return;
3396: }
3397:
3398: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>