From f2a268097531bee5f7ad9d737fda11c06162d9a5 Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Wed, 12 Jun 2013 18:43:28 -0300 Subject: [PATCH] Use a pointer for message functions when it needs a resize. Always use a pointer to a pointer to struct rnet_message in those functions where it is possible that it may be resized. --- rnet_encode.c | 44 ++++++++++++++++++++++---------------------- rnet_message.c | 18 ++++++++++-------- rnet_message.h | 12 +++++++----- 3 files changed, 39 insertions(+), 35 deletions(-) diff --git a/rnet_encode.c b/rnet_encode.c index 8174377..dae61c6 100644 --- a/rnet_encode.c +++ b/rnet_encode.c @@ -55,28 +55,28 @@ int rnet_encode(struct rnet_decfile *decfile, struct rnet_message **msg) (*msg)->buffer[0] = 0x40; (*msg)->len = 1; - r = rnet_message_add_u32(*msg, "a_comp", 0); - r = rnet_message_add_u32(*msg, "tp_arq", tp_arq); - r = rnet_message_add_u32(*msg, "id_dec", id_dec); - r = rnet_message_add_ascii(*msg, "exercicio", ano); - r = rnet_message_add_ascii(*msg, "exercicio_pgd", exerc); - r = rnet_message_add_ascii(*msg, "ni", cpf); - r = rnet_message_add_ascii(*msg, "tipo_ni", "CPF"); - r = rnet_message_add_u8(*msg, "num_ass", 0); - r = rnet_message_add_u32(*msg, "p_comp", 0); - r = rnet_message_add_u8(*msg, "ret", 0); - r = rnet_message_add_ascii(*msg, "uf", uf); - r = rnet_message_add_u8(*msg, "vrs_des_pa", 0); - r = rnet_message_add_u16(*msg, "versao_pgd", versao_pgd); - r = rnet_message_add_u8(*msg, "critica_validador", 0x06); - r = rnet_message_add_ascii(*msg, "ip_loc", "127.0.0.1"); - r = rnet_message_add_ascii(*msg, "versao_java", "1.7.0_03-icedtea;OpenJDK Runtime Environment"); - r = rnet_message_add_ascii(*msg, "origem", "JA2R"); - r = rnet_message_add_ascii(*msg, "so", "GNU"); - r = rnet_message_add_ascii(*msg, "cliente", "201104"); - r = rnet_message_add_u32(*msg, "tam_dados_val", 0); - r = rnet_message_add_u64(*msg, "tam_dados_val_chave", 0); - r = rnet_message_add_u32(*msg, "arquivos_restantes", 0); + r = rnet_message_add_u32(msg, "a_comp", 0); + r = rnet_message_add_u32(msg, "tp_arq", tp_arq); + r = rnet_message_add_u32(msg, "id_dec", id_dec); + r = rnet_message_add_ascii(msg, "exercicio", ano); + r = rnet_message_add_ascii(msg, "exercicio_pgd", exerc); + r = rnet_message_add_ascii(msg, "ni", cpf); + r = rnet_message_add_ascii(msg, "tipo_ni", "CPF"); + r = rnet_message_add_u8(msg, "num_ass", 0); + r = rnet_message_add_u32(msg, "p_comp", 0); + r = rnet_message_add_u8(msg, "ret", 0); + r = rnet_message_add_ascii(msg, "uf", uf); + r = rnet_message_add_u8(msg, "vrs_des_pa", 0); + r = rnet_message_add_u16(msg, "versao_pgd", versao_pgd); + r = rnet_message_add_u8(msg, "critica_validador", 0x06); + r = rnet_message_add_ascii(msg, "ip_loc", "127.0.0.1"); + r = rnet_message_add_ascii(msg, "versao_java", "1.7.0_03-icedtea;OpenJDK Runtime Environment"); + r = rnet_message_add_ascii(msg, "origem", "JA2R"); + r = rnet_message_add_ascii(msg, "so", "GNU"); + r = rnet_message_add_ascii(msg, "cliente", "201104"); + r = rnet_message_add_u32(msg, "tam_dados_val", 0); + r = rnet_message_add_u64(msg, "tam_dados_val_chave", 0); + r = rnet_message_add_u32(msg, "arquivos_restantes", 0); if (r < 0) return r; diff --git a/rnet_message.c b/rnet_message.c index abe656b..124fa4c 100644 --- a/rnet_message.c +++ b/rnet_message.c @@ -27,7 +27,7 @@ #define MAX(a,b) (a >= b) ? a : b #endif -static int rnet_message_expand(struct rnet_message **message, size_t len) +int rnet_message_expand(struct rnet_message **message, size_t len) { struct rnet_message *msg = *message; struct rnet_message *nmsg; @@ -58,12 +58,14 @@ void rnet_message_del(struct rnet_message *message) free(message); } -static int add_field(struct rnet_message *msg, char *key, int klen, char *val, int vlen) +static int add_field(struct rnet_message **message, char *key, int klen, + char *val, int vlen) { int n = 0; char *buffer; + struct rnet_message *msg = *message; if ((msg->alen - msg->len) < (klen + vlen + 3)) { - if (rnet_message_expand(&msg, MAX(msg->len, klen + vlen + 3))) + if (rnet_message_expand(message, MAX(msg->len, klen + vlen + 3))) return -ENOMEM; } buffer = msg->buffer + msg->len; @@ -95,29 +97,29 @@ static int add_field(struct rnet_message *msg, char *key, int klen, char *val, i return n; } -int rnet_message_add_u32(struct rnet_message *msg, char *key, uint32_t val) +int rnet_message_add_u32(struct rnet_message **msg, char *key, uint32_t val) { uint32_t nval = htonl(val); return add_field(msg, key, strlen(key), (char *) &nval, sizeof(val)); } -int rnet_message_add_ascii(struct rnet_message *msg, char *key, char *val) +int rnet_message_add_ascii(struct rnet_message **msg, char *key, char *val) { return add_field(msg, key, strlen(key), val, strlen(val)); } -int rnet_message_add_u8(struct rnet_message *msg, char *key, uint8_t val) +int rnet_message_add_u8(struct rnet_message **msg, char *key, uint8_t val) { return add_field(msg, key, strlen(key), (char *) &val, sizeof(val)); } -int rnet_message_add_u16(struct rnet_message *msg, char *key, uint16_t val) +int rnet_message_add_u16(struct rnet_message **msg, char *key, uint16_t val) { uint16_t nval = htons(val); return add_field(msg, key, strlen(key), (char *) &nval, sizeof(val)); } -int rnet_message_add_u64(struct rnet_message *msg, char *key, uint64_t val) +int rnet_message_add_u64(struct rnet_message **msg, char *key, uint64_t val) { uint64_t nval = htobe64(val); return add_field(msg, key, strlen(key), (char *) &nval, sizeof(val)); diff --git a/rnet_message.h b/rnet_message.h index 3738f73..e1e3daf 100644 --- a/rnet_message.h +++ b/rnet_message.h @@ -19,6 +19,7 @@ #ifndef _RNET_MESSAGE_H #define _RNET_MESSAGE_H +#include #include struct rnet_message { @@ -29,11 +30,12 @@ struct rnet_message { struct rnet_message * rnet_message_new(void); void rnet_message_del(struct rnet_message *message); +int rnet_message_expand(struct rnet_message **message, size_t len); -int rnet_message_add_u32(struct rnet_message *msg, char *key, uint32_t val); -int rnet_message_add_ascii(struct rnet_message *msg, char *key, char *val); -int rnet_message_add_u8(struct rnet_message *msg, char *key, uint8_t val); -int rnet_message_add_u16(struct rnet_message *msg, char *key, uint16_t val); -int rnet_message_add_u64(struct rnet_message *msg, char *key, uint64_t val); +int rnet_message_add_u32(struct rnet_message **msg, char *key, uint32_t val); +int rnet_message_add_ascii(struct rnet_message **msg, char *key, char *val); +int rnet_message_add_u8(struct rnet_message **msg, char *key, uint8_t val); +int rnet_message_add_u16(struct rnet_message **msg, char *key, uint16_t val); +int rnet_message_add_u64(struct rnet_message **msg, char *key, uint64_t val); #endif -- 2.20.1