EAPI struct packet *packet_create_reply(const struct packet *packet, const char *fmt, ...)
{
- int payload_size;
- struct packet *result;
- va_list va;
-
- if (!packet || packet->state != VALID) {
- return NULL;
- }
-
- result = malloc(sizeof(*result));
- if (!result) {
- ErrPrint("Heap: %s\n", strerror(errno));
- return NULL;
- }
-
- payload_size = sizeof(*result->data) + BUFSIZ;
- result->refcnt = 0;
- result->data = calloc(1, payload_size);
- if (!packet->data) {
- ErrPrint("Heap: %s\n", strerror(errno));
- result->state = INVALID;
- free(result);
- return NULL;
- }
-
- result->state = VALID;
- result->data->head.source = packet->data->head.destination;
- result->data->head.destination = packet->data->head.source;
- result->data->head.mask = 0xFFFFFFFF;
-
- result->data->head.seq = packet->data->head.seq;
- result->data->head.type = PACKET_ACK;
- result->data->head.version = packet->data->head.version;
+ int payload_size;
+ struct packet *result;
+ va_list va;
+
+ if (!packet || packet->state != VALID) {
+ return NULL;
+ }
+
+ result = malloc(sizeof(*result));
+ if (!result) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return NULL;
+ }
+
+ payload_size = sizeof(*result->data) + BUFSIZ;
+ result->refcnt = 0;
- result->data = calloc(1, payload_size);
++ result->data = calloc(1, BUFSIZ);
+ if (!packet->data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ result->state = INVALID;
+ free(result);
+ return NULL;
+ }
+
+ result->state = VALID;
+ result->data->head.source = packet->data->head.destination;
+ result->data->head.destination = packet->data->head.source;
+ result->data->head.mask = 0xFFFFFFFF;
+
+ result->data->head.seq = packet->data->head.seq;
+ result->data->head.type = PACKET_ACK;
+ result->data->head.version = packet->data->head.version;
+ result->data->head.fd = -1;
+ if (packet->data->head.command[0] == PACKET_CMD_INT_TAG) {
+ unsigned int *head_cmd = (unsigned int *)result->data->head.command;
+ unsigned int *packet_cmd = (unsigned int *)packet->data->head.command;
+
+ *head_cmd = *packet_cmd;
+ } else {
strcpy(result->data->head.command, packet->data->head.command); /* we don't need to use strncmp */
- result->data->head.payload_size = 0;
- payload_size -= sizeof(*result->data);
+ }
+ result->data->head.payload_size = 0;
+ payload_size -= sizeof(*result->data);
- va_start(va, fmt);
- result = packet_body_filler(result, payload_size, fmt, va);
- va_end(va);
+ va_start(va, fmt);
+ result = packet_body_filler(result, payload_size, fmt, va);
+ va_end(va);
- return packet_ref(result);
+ return packet_ref(result);
}
EAPI int packet_swap_address(struct packet *packet)
EAPI struct packet *packet_create(const char *cmd, const char *fmt, ...)
{
- struct packet *packet;
- int payload_size;
- va_list va;
-
- if (strlen(cmd) >= PACKET_MAX_CMD) {
- ErrPrint("Command is too long\n");
- return NULL;
- }
-
- packet = malloc(sizeof(*packet));
- if (!packet) {
- ErrPrint("Heap: %s\n", strerror(errno));
- return NULL;
- }
-
- payload_size = sizeof(*packet->data) + BUFSIZ;
- packet->refcnt = 0;
- packet->data = calloc(1, BUFSIZ);
- if (!packet->data) {
- ErrPrint("Heap: %s\n", strerror(errno));
- packet->state = INVALID;
- free(packet);
- return NULL;
- }
-
- packet->state = VALID;
- packet->data->head.source = 0lu;
- packet->data->head.destination = 0lu;
- packet->data->head.mask = 0xFFFFFFFF;
- packet->data->head.seq = util_timestamp();
- packet->data->head.type = PACKET_REQ;
- packet->data->head.version = PACKET_VERSION;
+ struct packet *packet;
+ int payload_size;
+ va_list va;
+
+ if (strlen(cmd) >= PACKET_MAX_CMD) {
+ ErrPrint("Command is too long\n");
+ return NULL;
+ }
+
+ packet = malloc(sizeof(*packet));
+ if (!packet) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return NULL;
+ }
+
+ payload_size = sizeof(*packet->data) + BUFSIZ;
+ packet->refcnt = 0;
- packet->data = calloc(1, payload_size);
++ packet->data = calloc(1, BUFSIZ);
+ if (!packet->data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ packet->state = INVALID;
+ free(packet);
+ return NULL;
+ }
+
+ packet->state = VALID;
+ packet->data->head.source = 0lu;
+ packet->data->head.destination = 0lu;
+ packet->data->head.mask = 0xFFFFFFFF;
+ packet->data->head.seq = util_timestamp();
+ packet->data->head.type = PACKET_REQ;
+ packet->data->head.version = PACKET_VERSION;
+ packet->data->head.fd = -1;
+ if (cmd[0] == PACKET_CMD_INT_TAG) {
+ unsigned int *head_cmd = (unsigned int *)packet->data->head.command;
+ unsigned int *in_cmd = (unsigned int *)cmd;
+
+ *head_cmd = *in_cmd;
+ } else {
strncpy(packet->data->head.command, cmd, sizeof(packet->data->head.command));
- packet->data->head.payload_size = 0;
- payload_size -= sizeof(*packet->data); /*!< Usable payload size (except head size) */
+ }
+ packet->data->head.payload_size = 0;
+ payload_size -= sizeof(*packet->data); /*!< Usable payload size (except head size) */
- va_start(va, fmt);
- packet = packet_body_filler(packet, payload_size, fmt, va);
- va_end(va);
+ va_start(va, fmt);
+ packet = packet_body_filler(packet, payload_size, fmt, va);
+ va_end(va);
- return packet_ref(packet);
+ return packet_ref(packet);
}
EAPI struct packet *packet_create_noack(const char *cmd, const char *fmt, ...)
{
- int payload_size;
- struct packet *result;
- va_list va;
-
- if (strlen(cmd) >= PACKET_MAX_CMD) {
- ErrPrint("Command is too long\n");
- return NULL;
- }
-
- result = malloc(sizeof(*result));
- if (!result) {
- ErrPrint("Heap: %s\n", strerror(errno));
- return NULL;
- }
-
- payload_size = sizeof(*result->data) + BUFSIZ;
- result->refcnt = 0;
- result->data = calloc(1, payload_size);
- if (!result->data) {
- ErrPrint("Heap: %s\n", strerror(errno));
- result->state = INVALID;
- free(result);
- return NULL;
- }
-
- result->state = VALID;
- result->data->head.source = 0lu;
- result->data->head.destination = 0lu;
- result->data->head.mask = 0xFFFFFFFF;
- result->data->head.seq = util_timestamp();
- result->data->head.type = PACKET_REQ_NOACK;
- result->data->head.version = PACKET_VERSION;
+ int payload_size;
+ struct packet *result;
+ va_list va;
+
+ if (strlen(cmd) >= PACKET_MAX_CMD) {
+ ErrPrint("Command is too long\n");
+ return NULL;
+ }
+
+ result = malloc(sizeof(*result));
+ if (!result) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return NULL;
+ }
+
+ payload_size = sizeof(*result->data) + BUFSIZ;
+ result->refcnt = 0;
- result->data = calloc(1, payload_size);
++ result->data = calloc(1, BUFSIZ);
+ if (!result->data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ result->state = INVALID;
+ free(result);
+ return NULL;
+ }
+
+ result->state = VALID;
+ result->data->head.source = 0lu;
+ result->data->head.destination = 0lu;
+ result->data->head.mask = 0xFFFFFFFF;
+ result->data->head.seq = util_timestamp();
+ result->data->head.type = PACKET_REQ_NOACK;
+ result->data->head.version = PACKET_VERSION;
+ result->data->head.fd = -1;
+ if (cmd[0] == PACKET_CMD_INT_TAG) {
+ unsigned int *head_cmd = (unsigned int *)result->data->head.command;
+ unsigned int *cmd_in = (unsigned int *)cmd;
+ *head_cmd = *cmd_in;
+ } else {
strncpy(result->data->head.command, cmd, sizeof(result->data->head.command));
- result->data->head.payload_size = 0;
- payload_size -= sizeof(*result->data);
+ }
+ result->data->head.payload_size = 0;
+ payload_size -= sizeof(*result->data);
- va_start(va, fmt);
- result = packet_body_filler(result, payload_size, fmt, va);
- va_end(va);
+ va_start(va, fmt);
+ result = packet_body_filler(result, payload_size, fmt, va);
+ va_end(va);
- return packet_ref(result);
+ return packet_ref(result);
}
EAPI int packet_get(const struct packet *packet, const char *fmt, ...)