modular-worm/plugins/3_network.h

59 lines
1.6 KiB
C

#pragma once
#include "api.h"
// API
typedef struct {
char host[16]; // aaa.bbb.ccc.ddd\0
char port[6]; // abcde\0
char content[65000];
unsigned int destination_host;
api_plugin_t destination_plugin;
size_t content_length;
} p3_send_t;
#include <string.h>
#define P3_SEND(_result, _host, _port, _dest_plugin, _content, _content_length) \
{ \
p3_send_t payload = {.content_length = _content_length}; \
memcpy(payload.host, _host, strlen(_host)); \
memcpy(payload.port, _port, strlen(_port)); \
memcpy(payload.content, _content, _content_length); \
payload.destination_host = 0; \
payload.destination_plugin = _dest_plugin; \
_result = api_send_message((api_plugin_t){3, 0, 0, 0}, &payload, sizeof(p3_send_t), 1); \
}
// Internal stuff
#define MN_LEN 32
#define BODY_LEN 65000
#define MN_MSG 0xb1ee1e
#define MN_ACK 0xb1ee1f
/* magic number */
typedef struct {
unsigned value: MN_LEN;
} magic_number_t;
#pragma pack(push, 1) // no mem align
/* packet with data */
typedef struct {
magic_number_t magic_number;
unsigned packet_id: 32;
unsigned TTL: 8;
unsigned destination_host: 32;
api_plugin_t destination_plugin;
unsigned body_length: 16;
} p3_msg_t;
#pragma pack(pop)
#pragma pack(push, 1) // no mem align
/* response (acknowledgment) without data */
typedef struct {
magic_number_t magic_number;
unsigned packet_id: 32;
} p3_ack_t;
#pragma pack(pop)