summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile2
-rw-r--r--src/ivy.c158
-rw-r--r--src/ivysocket.c7
3 files changed, 132 insertions, 35 deletions
diff --git a/src/Makefile b/src/Makefile
index 871af95..a07acd7 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -66,7 +66,7 @@ REGEXP= -DUSE_PCRE_REGEX -DPCRE_OPT=$(PCRE_OPT)
# on activeTCL , set #define CHANNEL to null, and add ivyloop.o in the ivytcl target,
# see below
CHANNEL = -DTCL_CHANNEL_INTEGRATION
-CFLAGS = -g -Wall #-DDEBUG
+CFLAGS = -g -Wall -DDEBUG
OBJ = ivyloop.o timer.o ivysocket.o ivybind.o ivy.o
GOBJ = ivyloop.o timer.o ivysocket.o ivybind.o givy.o
diff --git a/src/ivy.c b/src/ivy.c
index edc2d0c..66f980f 100644
--- a/src/ivy.c
+++ b/src/ivy.c
@@ -241,10 +241,33 @@ static void SortClients()
}
static void MsgSendTo( Client client, MsgType msgtype, int id, const char *message )
{
+ char * packet;
+ char * ptr;
+ int len;
+ int len_arg;
+ len_arg = strlen( message );
+ len = 3 * sizeof ( ushort ) + len_arg;
+ packet = malloc ( len ); /* TODO free packet */
+
+#ifdef DEBUG
+ printf( "Sending message type=%d id=%d '%s'\n",msgtype,id,message);
+#endif
+ ptr = packet;
+ *((ushort *) ptr)++ = htons( (ushort)msgtype );
+ *((ushort *) ptr)++ = htons( (ushort)id );
+ *((ushort *) ptr)++ = htons( (ushort)len_arg );
+ if ( len_arg )
+ {
+ strncpy( ptr, message , len_arg);
+ }
+ SocketSendRaw( client, packet, len );
+#ifdef OLD
SocketSend( client, "%d%c%d%c%s%c",
msgtype, MESSAGE_SEPARATOR,
id, MESSAGE_SEPARATOR,
message, MESSAGE_TERMINATOR);
+#endif
+ free( packet );
}
static void IvyCleanup()
@@ -284,9 +307,11 @@ static int MsgCall (const char *message, MsgSndPtr msg, Client client)
// il faut essayer d'envoyer le message en une seule fois sur la socket
// pour eviter au maximun de passer dans le select plusieur fois par message du protocole Ivy
// pour eviter la latence ( PB de perfo detecte par ivyperf ping roudtrip )
+#ifdef OLD
offset += make_message_var( &buffer, &size, offset, "%d%c%d",
Msg, MESSAGE_SEPARATOR,
msg->id);
+#endif
#ifdef DEBUG
printf( "Send matching args count %d\n",rc-1);
#endif
@@ -295,16 +320,20 @@ static int MsgCall (const char *message, MsgSndPtr msg, Client client)
IvyBindingGetMatch( msg->bind, message, index, &arg, &arglen );
#ifdef DEBUG
- printf ("Send matching arg%d '%.*s'\n",arglen, arg);
+ printf ("Send matching arg%d '%.*s'\n",index,arglen, arg);
#endif
- offset += make_message_var( &buffer, &size, offset, "%c%.*s",
- MESSAGE_SEPARATOR,
- arglen, arg
+ offset += make_message_var( &buffer, &size, offset, "%.*s%c",
+ arglen, arg,
+ MESSAGE_SEPARATOR
);
++index;
}
+ buffer[offset-1] = '\0';
+#ifdef OLD
offset += make_message_var( &buffer, &size, offset, "%c", MESSAGE_TERMINATOR);
SocketSendRaw(client, buffer , offset);
+#endif
+ MsgSendTo( client, Msg, msg->id, buffer );
return 1;
}
@@ -366,6 +395,7 @@ static char* Receive( Client client, void *data, char *message, unsigned int len
{
IvyClientPtr clnt;
int id;
+ ushort len_args;
MsgSndPtr snd;
MsgRcvPtr rcv;
int argc = 0;
@@ -373,7 +403,21 @@ static char* Receive( Client client, void *data, char *message, unsigned int len
int kind_of_msg = Bye;
IvyBinding bind;
char *ptr_end;
+ char *args;
+ ptr_end = message;
+ kind_of_msg = ntohs( *((ushort *) ptr_end)++ );
+ id = ntohs( *((ushort *) ptr_end)++ );
+ len_args = ntohs( *((ushort *) ptr_end)++ );
+
+ if ( len_args )
+ {
+ args = malloc( len_args ); /* TODO keep the buffer to free it */
+ strncpy( args , ptr_end, len_args );
+ args[ len_args ] = '\0';
+ ptr_end += len_args;
+ }
+#ifdef OLD
ptr_end = memchr (message, MESSAGE_TERMINATOR, len );
if ( !ptr_end )
{
@@ -385,6 +429,8 @@ static char* Receive( Client client, void *data, char *message, unsigned int len
kind_of_msg = atoi( argv[MSGTYPE] );
id = atoi( argv[MSGID] );
+ args = argv[ARG_0];
+ argc -= ARG_0;
if ( (argc < 2) )
{
@@ -394,40 +440,46 @@ static char* Receive( Client client, void *data, char *message, unsigned int len
SocketClose( client );
return ptr_end;
}
+#endif
+
+#ifdef DEBUG
+ printf("Receive Message type=%d id=%d arg=%s\n", kind_of_msg, id, args);
+#endif //DEBUG
+
clnt = (IvyClientPtr)data;
switch( kind_of_msg )
{
case Bye:
#ifdef DEBUG
- printf("Quitting Bye %s\n", line);
+ printf("Quitting Bye %s\n", args);
#endif //DEBUG
SocketClose( client );
break;
case Error:
- printf ("Received error %d %s\n", id, argv[ARG_0]);
+ printf ("Received error %d %s\n", id, args);
break;
case AddRegexp:
#ifdef DEBUG
- printf("Regexp id=%d exp='%s'\n", id, argv[ARG_0]);
+ printf("Regexp id=%d exp='%s'\n", id, args);
#endif //DEBUG
- if ( !CheckRegexp( argv[ARG_0] ) )
+ if ( !CheckRegexp( args ) )
{
#ifdef DEBUG
- printf("Warning: regexp '%s' illegal, removing from %s\n",argv[ARG_0],ApplicationName);
+ printf("Warning: regexp '%s' illegal, removing from %s\n",args,ApplicationName);
#endif //DEBUG
return ptr_end;
}
- bind = IvyBindingCompile( argv[ARG_0] );
+ bind = IvyBindingCompile( args );
if ( bind != NULL )
{
IVY_LIST_ADD( clnt->msg_send, snd )
if ( snd )
{
snd->id = id;
- snd->str_regexp = strdup( argv[ARG_0] );
+ snd->str_regexp = strdup( args );
snd->bind = bind;
if ( application_bind_callback )
{
@@ -464,14 +516,14 @@ static char* Receive( Client client, void *data, char *message, unsigned int len
break;
case StartRegexp:
#ifdef DEBUG
- printf("Regexp Start id=%d Application='%s'\n", id, argv[ARG_0]);
+ printf("Regexp Start id=%d Application='%s'\n", id, args);
#endif //DEBUG
- clnt->app_name = strdup( argv[ARG_0] );
+ clnt->app_name = strdup( args );
clnt->app_port = id;
if ( CheckConnected( clnt ) )
{
#ifdef DEBUG
- printf("Quitting already connected %s\n", line);
+ printf("Quitting already connected %s\n", args);
#endif //DEBUG
IvySendError( clnt, 0, "Application already connected" );
SocketClose( client );
@@ -500,17 +552,19 @@ static char* Receive( Client client, void *data, char *message, unsigned int len
case Msg:
#ifdef DEBUG
- printf("Message id=%d msg='%s'\n", id, argv[ARG_0]);
+ printf("Message id=%d msg='%s'\n", id, args);
#endif //DEBUG
+ argc = SplitArg( args, MESSAGE_SEPARATOR, argv);
+
IVY_LIST_EACH( msg_recv, rcv )
{
if ( id == rcv->id )
{
#ifdef DEBUG
- printf("Calling id=%d argc=%d for %s\n", id, argc-ARG_0,rcv->regexp);
+ printf("Calling id=%d argc=%d for %s\n", id, argc,rcv->regexp);
#endif
- if ( rcv->callback ) (*rcv->callback)( clnt, rcv->user_data, argc-ARG_0, &argv[ARG_0] );
+ if ( rcv->callback ) (*rcv->callback)( clnt, rcv->user_data, argc, argv );
return ptr_end;
}
}
@@ -519,11 +573,11 @@ static char* Receive( Client client, void *data, char *message, unsigned int len
case DirectMsg:
#ifdef DEBUG
- printf("Direct Message id=%d msg='%s'\n", id, argv[ARG_0]);
+ printf("Direct Message id=%d msg='%s'\n", id, args);
#endif //DEBUG
if ( direct_callback)
- (*direct_callback)( clnt, direct_user_data, id, argv[ARG_0] );
+ (*direct_callback)( clnt, direct_user_data, id, args );
break;
case Die:
@@ -539,9 +593,9 @@ static char* Receive( Client client, void *data, char *message, unsigned int len
break;
case ApplicationId:
#ifdef DEBUG
- printf("ApplicationId priority=%d appid='%s'\n", id, argv[ARG_0]);
+ printf("ApplicationId priority=%d appid='%s'\n", id, args);
#endif //DEBUG
- clnt->app_id = strdup( argv[ARG_0] );
+ clnt->app_id = strdup( args );
if ( id != clnt->priority )
{
clnt->priority = id;
@@ -549,7 +603,7 @@ static char* Receive( Client client, void *data, char *message, unsigned int len
}
break;
default:
- printf("Receive unhandled message %s\n", message);
+ printf("Receive unhandled message %d\n", kind_of_msg);
break;
}
return ptr_end;
@@ -620,22 +674,68 @@ static void *ClientCreate( Client client )
#endif //DEBUG
return SendService (client);
}
-
+/* Hello packet Send */
+static void IvySendHello(unsigned long mask)
+{
+ char *packet;
+ char *ptr;
+ int lenAppId;
+ int lenAppName;
+ int len;
+ lenAppId = strlen( applicationUniqueId );
+ lenAppName = strlen( ApplicationName );
+ len = 4*sizeof(ushort) + lenAppId + lenAppName;
+ packet = malloc( len );
+ ptr = packet;
+ *((ushort *) ptr)++ = htons( VERSION );
+ *((ushort *) ptr)++ = htons( ApplicationPort );
+ *((ushort *) ptr)++ = htons( lenAppId );
+ strncpy( ptr, applicationUniqueId , lenAppId);
+ ptr += lenAppId;
+ *((ushort *) ptr)++ = htons( lenAppName );
+ strncpy( ptr, ApplicationName , lenAppName);
+
+ SocketSendBroadcastRaw (broadcast, mask, SupervisionPort, packet,len );
+ free( packet );
+#ifdef OLD
+ SocketSendBroadcast (broadcast, mask, SupervisionPort, "%d %hu %s %s\n",
+ VERSION,
+ ApplicationPort,
+ applicationUniqueId,
+ ApplicationName
+ ); */
+#endif
+}
+/* Hello packet Receive */
static char* BroadcastReceive( Client client, void *data, char *message, unsigned int len)
{
Client app;
int err;
- int version;
+ unsigned int version;
unsigned short serviceport;
char appname[1024];
char appid[1024];
+ unsigned short len_appid;
+ unsigned short len_appname;
#ifdef DEBUG
unsigned short remoteport;
char *remotehost = 0;
#endif
char *ptr_end;
-
+ ptr_end = message;
+ version = ntohs( *((ushort *) ptr_end)++ );
+ serviceport = ntohs( *((ushort *) ptr_end)++ );
+ len_appid = ntohs( *((ushort *) ptr_end)++ );
+ strncpy( appid , ptr_end, len_appid );
+ appid[ len_appid ] = '\0';
+ ptr_end += len_appid;
+ len_appname = ntohs( *((ushort *) ptr_end)++ );
+ strncpy( appname , ptr_end, len_appname );
+ appname[ len_appname ] = '\0';
+ ptr_end += len_appname;
+
+#ifdef OLD
ptr_end = memchr (message, '\n', len );
if ( !ptr_end )
{
@@ -653,6 +753,7 @@ static char* BroadcastReceive( Client client, void *data, char *message, unsigne
remotehost, remoteport);
return ptr_end;
}
+#endif
if ( version != VERSION ) {
/* ignore the message */
unsigned short remoteport;
@@ -806,12 +907,7 @@ void IvyStart (const char* bus)
if ( IN_MULTICAST( mask ) )
SocketAddMember (broadcast , mask );
- SocketSendBroadcast (broadcast, mask, SupervisionPort, "%d %hu %s %s\n",
- VERSION,
- ApplicationPort,
- applicationUniqueId,
- ApplicationName
- );
+ IvySendHello( mask );
numelem = 0;
mask = 0xffffffff;
}
diff --git a/src/ivysocket.c b/src/ivysocket.c
index 4b9f279..16991d9 100644
--- a/src/ivysocket.c
+++ b/src/ivysocket.c
@@ -175,16 +175,17 @@ static void HandleSocket (Channel channel, HANDLE fd, void *data)
return;
}
client->ptr += nb;
- ptr = client->buffer;
if (! client->interpretation )
{
client->ptr = client->buffer;
fprintf (stderr,"Socket No interpretation function ??? skipping data\n");
return;
}
- while ((ptr_end = (*client->interpretation) (client, client->data, ptr, client->ptr - ptr )))
+ ptr = client->buffer;
+
+ while ( (client->ptr > ptr )&&(ptr_end = (*client->interpretation) (client, client->data, ptr, client->ptr - ptr )))
{
- ptr = ++ptr_end;
+ ptr = ptr_end;
}
if (ptr < client->ptr )
{ /* recopie message incomplet au debut du buffer */