1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
/*!
---------------------------------------------------------------------
Nom : <InitialiserSocketAsynchrone>
Creation : xxxx - fevrier 1997
But : Initialiser l'option de lecture asynchrone pour un socket.
Lorsqu'un fichier est en mode asynchrone, le systeme avise le
programme appelant lorsque le fichier est pret pour une lecture.
Parametres :
<requete> : numero du descripteur de fichier
<fonction> : fonction appelee lors de la reception du signal systeme
Retour : 0 si tout va bien
< 0 il y a eu erreur
> 0 : il y a deja des caracteres a lire sur le socket. Dans ce
cas, on retourne le nobre de caracteres disponibles sans
passer en mode asynchrone.
Remarques :
Aucune
Modifications :
Nom :
Date :
Description :
----------------------------------------------------------------------
!*/
int InitialiserSocketAsynchrone(int requete,void (*fonction)() )
{
pid_t pid;
int retour;
int bidon;
#ifdef DEBUGJS
fprintf (stderr, " ESSAI MISE SOKCET ASYNC");
#endif
/*
*On verifie s'il y a des caracteres a lire sur le conduit
*Si oui, on retourne le nombre de caracteres sans passer
*en mode asynchrone
*Ceci evite les interruptions lors de la lecture
*/
retour = ioctl(requete,FIONREAD,&bidon);
if ( retour != 0 )
{
#ifdef DEBUGJS
fprintf (stderr, " PEUT PAS METTRE SOCKET ASYNC : %d ERREUR %d",requete,retour);
#endif
return(retour);
}
if(bidon > 0 )
{
#ifdef DEBUGJS
fprintf (stderr, " PEUT PAS METTRE SOCKET ASYNC : %d reste qquechose a lire",requete);
#endif
return(bidon);
}
/*
*Il n'y a rien a lire, on passe en asynchrone
*Obtenir le numero de ce processus pour pouvoir le refiler
*a ioctl afin d'etre avise de tout changement sur le socket
*/
pid =getpid();
bidon = (int) pid;
#ifndef LINUX
retour = ioctl(requete,SIOCSPGRP,&bidon);
#else
retour = fcntl(requete,F_SETOWN,(long)bidon);
#endif
if ( retour < 0 )
return retour ;
/*
*Initialiser l'option asynchrone pour le socket
*/
#ifdef DEBUGJS
fprintf (stderr, " DECLENCHE");
#endif
#ifndef LINUX
bidon = 1;
retour = ioctl(requete,FIOASYNC,&bidon);
#else
bidon = O_ASYNC ;
retour = fcntl(requete,F_SETFL,(long)bidon);
#endif
#ifdef DEBUGJS
fprintf (stderr, " MISE SOCKET ASYNC : %d",retour);
if ( retour < 0 )
fprintf (stderr, " => ERREUR");
#endif
if ( retour < 0 )
return retour ;
else
{
#ifdef DEBUGJS
fprintf (stderr, " DECLENCHE SIGIO");
#endif
signal(SIGIO,fonction);
return (0);
}
} |
Partager