Use offsetof macro where possible to defined header size;
[tedtools.git] / tcp.c
diff --git a/tcp.c b/tcp.c
index 7183b42..112e98a 100644 (file)
--- a/tcp.c
+++ b/tcp.c
@@ -343,17 +343,22 @@ TC_Send( TC_Connection *cs ) {
        if ( cs->state == CS_ERROR )
                return CS_ERROR;
 
-       if ( cs->state != CS_SEND ) {
+       if ( cs->state != CS_SEND || cs->ptr == NULL ) {
                cs->state = CS_SEND;
-               cs->ptr = cs->buf;
+               cs->ptr = (char*)cs->buf;
+               cs->len = cs->buf->len;
+
+               /* convert fields to network byteorder */
+               cs->buf->len = htonl(cs->buf->len);
+               cs->buf->type = htonl(cs->buf->type);
        }
 
-       if ( cs->ptr - cs->buf >= cs->len ) {
+       if ( cs->ptr - (char*)cs->buf >= cs->len ) {
                cs->state = CS_FINISHSEND;
                return CS_FINISHSEND;
        }
 
-       if ((sz=write(cs->fd, cs->ptr, cs->len - (cs->ptr - cs->buf)))==0 ||
+       if ((sz=write(cs->fd, cs->ptr, cs->len - (cs->ptr - (char*)cs->buf)))==0 ||
                (sz < 0 && (errno == EWOULDBLOCK || errno == EAGAIN))) {
 
                /* SunOS 4.1.x, are broken and select() says that
@@ -375,8 +380,11 @@ TC_Send( TC_Connection *cs ) {
 
        cs->ptr += sz;
 
-       if ( cs->ptr - cs->buf >= cs->len ) {
+       if ( cs->ptr - (char*)cs->buf >= cs->len ) {
                cs->state = CS_FINISHSEND;
+               /* revert byteorder conversion */
+               cs->buf->len = ntohl(cs->buf->len);
+               cs->buf->type = ntohl(cs->buf->type);
                return CS_FINISHSEND;
        }
        
@@ -385,12 +393,13 @@ TC_Send( TC_Connection *cs ) {
 
 static void 
 resizeCS( TC_Connection *cs, int sz ) {
-       int diff = cs->ptr - cs->buf;
+       int diff = cs->ptr - (char*)cs->buf;
+
        if ( cs->len >= sz )
                return; 
        cs->len = sz;
-       cs->buf = (char*)trealloc( (void*)cs->buf, cs->len );
-       cs->ptr = cs->buf + diff;
+       cs->buf = (TCMsg*)trealloc( (void*)cs->buf, cs->len );
+       cs->ptr = ((char*)cs->buf) + diff;
 }
 
 u_int32_t
@@ -400,17 +409,18 @@ TC_Read( TC_Connection *cs, size_t maxsize ) {
        if ( cs->state == CS_ERROR )
                return CS_ERROR;
 
-       if (cs->state != CS_READ ) {
+       if (cs->state != CS_READ || cs->ptr == NULL ) {
                cs->state = CS_READ;
-               cs->ptr = cs->buf;
+               cs->ptr = (char*)cs->buf;
+               cs->len = 0;
        }
 
-       alreadyread = cs->ptr - cs->buf;
-       if ( alreadyread < sizeof(u_int32_t) ) {
-               toread = sizeof(u_int32_t) - alreadyread;
-               resizeCS(cs, sizeof(u_int32_t));
+       alreadyread = cs->ptr - (char*)cs->buf;
+       if ( alreadyread < TCMSGHDRSZ ) {
+               toread = TCMSGHDRSZ - alreadyread;
+               resizeCS(cs, TCMSGHDRSZ);
        } else {
-               totalread = *(u_int32_t*)(cs->buf);
+               totalread = ntohl(cs->buf->len);
                if ( maxsize > 0 && totalread > maxsize )
                {
                        tlog(TL_ALARM,"TC_Read: message size (%d b) is greater than max allowed (%d b)", totalread, maxsize);
@@ -435,7 +445,13 @@ TC_Read( TC_Connection *cs, size_t maxsize ) {
                return CS_ERROR;
        }
        
-
+       if ( alreadyread < TCMSGHDRSZ  && alreadyread + sz >= TCMSGHDRSZ ) {
+               /* 
+                * we just read header - we can get totalread value. 
+                */
+               totalread = ntohl(cs->buf->len);
+       }
+       
        cs->ptr += sz;
        alreadyread += sz;
        if ( sz == 0 && alreadyread != totalread ) {
@@ -443,7 +459,13 @@ TC_Read( TC_Connection *cs, size_t maxsize ) {
                cs->state = CS_ERROR;
                return CS_ERROR;
        }
-       cs->state = ( alreadyread == totalread ) ? CS_FINISHREAD : CS_READ;
+
+       if ( alreadyread == totalread ) {
+               cs->buf->len = ntohl(cs->buf->len);
+               cs->buf->type = ntohl(cs->buf->type);
+               cs->state = CS_FINISHREAD;
+       }
+
        return cs->state;
 }
 
@@ -475,14 +497,14 @@ TC_Talk( TC_Connection *cs, size_t maxsize  ) {
                return cs->state;
        
        cs->state = CS_SEND;
-       cs->ptr = cs->buf;
+       cs->ptr = NULL;
        while( cs->state != CS_FINISHSEND ) {
                while( !TC_ReadyIO( &cs, 1, 100) );
                if ( TC_Send(cs) == CS_ERROR ) return CS_ERROR;
        }
 
        cs->state = CS_READ;
-       cs->ptr = cs->buf;
+       cs->ptr = NULL;
        while( cs->state != CS_FINISHREAD ) {
                while( !TC_ReadyIO( &cs, 1, 100) );
                if ( TC_Read(cs, maxsize) == CS_ERROR ) return CS_ERROR;