diff options
Diffstat (limited to 'src/common/packed.c')
-rw-r--r-- | src/common/packed.c | 55 |
1 files changed, 51 insertions, 4 deletions
diff --git a/src/common/packed.c b/src/common/packed.c index 117b557..b8ed21b 100644 --- a/src/common/packed.c +++ b/src/common/packed.c @@ -166,6 +166,32 @@ void copy_packed_buffer(packed_buffer_t *dest, const packed_buffer_t *src) /****************************************************************************** * * +* Paramètres : dest = tampon de données à constituer. * +* src = tampon de données à copier. * +* * +* Description : Inclut les données d'un tampon dans un autre. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool include_packed_buffer(packed_buffer_t *dest, const packed_buffer_t *src) +{ + bool result; /* Bilan à retourner */ + + assert(src->allocated >= (sizeof(uint32_t) + src->used)); + + result = extend_packed_buffer(dest, src->data + sizeof(uint32_t), src->used, false); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : pbuf = paquet de données à consulter. * * * * Description : Indique le nombre d'octets de la charge utile d'un paquet. * @@ -565,7 +591,10 @@ bool ssl_recv_packed_buffer(packed_buffer_t *pbuf, SSL *fd) { bool result; /* Bilan à retourner */ uint32_t used; /* Taille de charge utile */ - int got; /* Quantité de données traitées*/ + size_t pos; /* Localisation du stockage */ + size_t remaining; /* Quantité à lire restante */ + size_t got; /* QUantité lue par appel */ + int ret; /* Code de retour d'une lecture*/ got = SSL_read(fd, &used, sizeof(uint32_t)); if (got <= 0) LOG_ERROR_OPENSSL; @@ -584,10 +613,28 @@ bool ssl_recv_packed_buffer(packed_buffer_t *pbuf, SSL *fd) pbuf->used = used; - got = SSL_read(fd, pbuf->data + pbuf->pos, used); - if (got <= 0) LOG_ERROR_OPENSSL; + pos = pbuf->pos; + remaining = used; + + while (remaining > 0) + { + ret = SSL_read_ex(fd, pbuf->data + pos, remaining, &got); + + if (ret > 0) + { + pos += got; + remaining -= got; + } + + else + { + LOG_ERROR_OPENSSL; + break; + } + + } - result = (got == used); + result = (remaining == 0); } |