Use a pointer for message functions when it needs a resize.
authorThadeu Lima de Souza Cascardo <cascardo@cascardo.info>
Wed, 12 Jun 2013 21:43:28 +0000 (18:43 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@cascardo.info>
Wed, 12 Jun 2013 21:43:28 +0000 (18:43 -0300)
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
rnet_message.c
rnet_message.h

index 8174377..dae61c6 100644 (file)
@@ -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;
index abe656b..124fa4c 100644 (file)
@@ -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));
index 3738f73..e1e3daf 100644 (file)
@@ -19,6 +19,7 @@
 #ifndef _RNET_MESSAGE_H
 #define _RNET_MESSAGE_H
 
+#include <sys/types.h>
 #include <stdint.h>
 
 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