projects
/
tedtools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
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_ERROR )
return CS_ERROR;
- if ( cs->state != CS_SEND ) {
+ if ( cs->state != CS_SEND
|| cs->ptr == NULL
) {
cs->state = CS_SEND;
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;
}
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
(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;
cs->ptr += sz;
- if ( cs->ptr - cs->buf >= cs->len ) {
+ if ( cs->ptr -
(char*)
cs->buf >= cs->len ) {
cs->state = CS_FINISHSEND;
cs->state = CS_FINISHSEND;
+ /* revert byteorder conversion */
+ cs->buf->len = ntohl(cs->buf->len);
+ cs->buf->type = ntohl(cs->buf->type);
return CS_FINISHSEND;
}
return CS_FINISHSEND;
}
@@
-385,12
+393,13
@@
TC_Send( TC_Connection *cs ) {
static void
resizeCS( TC_Connection *cs, int sz ) {
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;
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
}
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_ERROR )
return CS_ERROR;
- if (cs->state != CS_READ ) {
+ if (cs->state != CS_READ
|| cs->ptr == NULL
) {
cs->state = CS_READ;
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 {
} 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);
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;
}
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 ) {
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 = 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;
}
return cs->state;
}
@@
-475,14
+497,14
@@
TC_Talk( TC_Connection *cs, size_t maxsize ) {
return cs->state;
cs->state = CS_SEND;
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;
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;
while( cs->state != CS_FINISHREAD ) {
while( !TC_ReadyIO( &cs, 1, 100) );
if ( TC_Read(cs, maxsize) == CS_ERROR ) return CS_ERROR;