From 5d050f8a803d8e5fbe8765742f9ab5a2583c119b Mon Sep 17 00:00:00 2001 From: Michael Storm Date: Sun, 11 Nov 2012 12:28:07 -0600 Subject: [PATCH] Created src/ directory, moved files there. --- CMakeLists.txt | 5 +- pack.c | 149 ++++----- run.sh | 1 + api.c => src/api.c | 0 chord.c => src/chord.c | 0 chord.h => src/chord.h | 0 chord_api.h => src/chord_api.h | 0 crypt.c => src/crypt.c | 0 debug.h => src/debug.h | 0 dispatcher.c => src/dispatcher.c | 0 dispatcher.h => src/dispatcher.h | 0 eprintf.c => src/eprintf.c | 0 eprintf.h => src/eprintf.h | 0 finger.c => src/finger.c | 0 gen_utils.h => src/gen_utils.h | 0 grid.c => src/grid.c | 0 grid.h => src/grid.h | 0 hosts.c => src/hosts.c | 0 join.c => src/join.c | 0 {logger => src/logger}/README_HASHMAP | 0 {logger => src/logger}/hashmap.c | 0 {logger => src/logger}/hashmap.h | 0 {logger => src/logger}/logger.c | 6 +- {logger => src/logger}/logger.h | 0 messages.proto => src/messages.proto | 0 src/pack.c | 443 ++++++++++++++++++++++++++ process.c => src/process.c | 0 sendpkt.c => src/sendpkt.c | 0 stabilize.c => src/stabilize.c | 0 str.c => src/str.c | 0 util.c => src/util.c | 0 31 files changed, 528 insertions(+), 76 deletions(-) create mode 100755 run.sh rename api.c => src/api.c (100%) rename chord.c => src/chord.c (100%) rename chord.h => src/chord.h (100%) rename chord_api.h => src/chord_api.h (100%) rename crypt.c => src/crypt.c (100%) rename debug.h => src/debug.h (100%) rename dispatcher.c => src/dispatcher.c (100%) rename dispatcher.h => src/dispatcher.h (100%) rename eprintf.c => src/eprintf.c (100%) rename eprintf.h => src/eprintf.h (100%) rename finger.c => src/finger.c (100%) rename gen_utils.h => src/gen_utils.h (100%) rename grid.c => src/grid.c (100%) rename grid.h => src/grid.h (100%) rename hosts.c => src/hosts.c (100%) rename join.c => src/join.c (100%) rename {logger => src/logger}/README_HASHMAP (100%) rename {logger => src/logger}/hashmap.c (100%) rename {logger => src/logger}/hashmap.h (100%) rename {logger => src/logger}/logger.c (98%) rename {logger => src/logger}/logger.h (100%) rename messages.proto => src/messages.proto (100%) create mode 100644 src/pack.c rename process.c => src/process.c (100%) rename sendpkt.c => src/sendpkt.c (100%) rename stabilize.c => src/stabilize.c (100%) rename str.c => src/str.c (100%) rename util.c => src/util.c (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7021f64..a3e77b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,16 +6,17 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") set(CMAKE_INCLUDE_CURRENT_DIR on) set(CMAKE_BUILD_TYPE Debug) -file(GLOB PROTOBUF_C_CHORD_MESSAGES "*.proto") +file(GLOB PROTOBUF_C_CHORD_MESSAGES "src/*.proto") file(GLOB PROTOBUF_C_CLIENT_MESSAGES "client/*.proto") find_package(ProtobufC REQUIRED) include_directories(${PROTOBUF_C_INCLUDE_DIRS}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) +include_directories("src/") PROTOBUF_C_GENERATE_C(PROTO_C_CHORD_SRCS PROTO_C_CHORD_HDRS ${PROTOBUF_C_CHORD_MESSAGES}) PROTOBUF_C_GENERATE_C(PROTO_C_CLIENT_SRCS PROTO_C_CLIENT_HDRS ${PROTOBUF_C_CLIENT_MESSAGES}) -file(GLOB lib_sources "*.c" "*.h" "logger/*.c" "logger/*.h") +file(GLOB lib_sources "src/*.c" "src/*.h" "src/logger/*.c" "src/logger/*.h") list(APPEND lib_sources ${PROTO_C_CHORD_SRCS} ${PROTO_C_CHORD_HDRS}) find_package(OpenSSL) diff --git a/pack.c b/pack.c index e679c84..ee75762 100644 --- a/pack.c +++ b/pack.c @@ -16,6 +16,11 @@ int pack_header(uchar *buf, int version, int type, const ProtobufCMessage *msg) header.version = version; header.has_version = 1; +#ifdef CHORD_MESSAGE_DEBUG + protobuf_c_message_print(msg, stderr); + fprintf(stderr, "\n"); +#endif + header.type = type; header.payload.len = protobuf_c_message_pack(msg, msg_buf); header.payload.data = msg_buf; @@ -168,49 +173,49 @@ sizeof_elt_in_repeated_array (ProtobufCType type) return 0; } -static void message_body_print(const ProtobufCMessage *message, LinkedString *out, +static void message_body_print(const ProtobufCMessage *message, FILE *out, int tabs); static void required_field_print(const ProtobufCFieldDescriptor *field, const void *member, - LinkedString *out, int tabs) + FILE *out, int tabs) { switch (field->type) { case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_SINT32: case PROTOBUF_C_TYPE_INT32: - lstr_add(out, "%d", *(const int32_t *)member); break; + fprintf(out, "%d", *(const int32_t *)member); break; case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_UINT32: - lstr_add(out, "%u", *(const uint32_t *)member); break; + fprintf(out, "%u", *(const uint32_t *)member); break; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_SINT64: case PROTOBUF_C_TYPE_INT64: - lstr_add(out, "%lld", *(const int64_t *)member); break; + fprintf(out, "%lld", *(const int64_t *)member); break; case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_UINT64: - lstr_add(out, "%llu", *(const uint64_t *)member); break; + fprintf(out, "%llu", *(const uint64_t *)member); break; case PROTOBUF_C_TYPE_FLOAT: - lstr_add(out, "%f", *(const float *)member); break; + fprintf(out, "%f", *(const float *)member); break; case PROTOBUF_C_TYPE_DOUBLE: - lstr_add(out, "%lf", *(const double *)member); break; + fprintf(out, "%lf", *(const double *)member); break; case PROTOBUF_C_TYPE_BOOL: - lstr_add(out, "%s", *(const protobuf_c_boolean *)member + fprintf(out, "%s", *(const protobuf_c_boolean *)member ? "true" : "false"); break; case PROTOBUF_C_TYPE_STRING: - lstr_add(out, "[%d] \"%s\"", strlen(*(char * const *)member), + fprintf(out, "[%d] \"%s\"", strlen(*(char * const *)member), *(char * const *)member); break; case PROTOBUF_C_TYPE_BYTES: { const ProtobufCBinaryData * bd = ((const ProtobufCBinaryData*) member); - lstr_add(out, "[%d] ", bd->len); + fprintf(out, "[%d] ", bd->len); int i; for (i = 0; i < bd->len; i++) - lstr_add(out, "%02x ", bd->data[i]); + fprintf(out, "%02x ", bd->data[i]); int printable = 1; for (i = 0; i < bd->len; i++) { @@ -221,25 +226,25 @@ required_field_print(const ProtobufCFieldDescriptor *field, } if (printable && bd->len > 0) { - lstr_add(out, "(\""); + fprintf(out, "(\""); for (i = 0; i < bd->len; i++) - lstr_add(out, "%c", bd->data[i]); - lstr_add(out, "\")"); + fprintf(out, "%c", bd->data[i]); + fprintf(out, "\")"); } break; } //case PROTOBUF_C_TYPE_GROUP: // NOT SUPPORTED case PROTOBUF_C_TYPE_MESSAGE: - lstr_add(out, "\n"); + fprintf(out, "\n"); message_body_print(*(ProtobufCMessage * const *)member, out, tabs); break; case PROTOBUF_C_TYPE_ENUM: { uint32_t value = *(const uint32_t *)member; const ProtobufCEnumDescriptor *desc = field->descriptor; - lstr_add(out, "%u", value); + fprintf(out, "%u", value); if (value < desc->n_values) - lstr_add(out, " (%s)", desc->values[value].name); + fprintf(out, " (%s)", desc->values[value].name); break; } } @@ -249,40 +254,40 @@ static void optional_field_print(const ProtobufCFieldDescriptor *field, const protobuf_c_boolean *has, const void *member, - LinkedString *out, int tabs) + FILE *out, int tabs) { if (field->type == PROTOBUF_C_TYPE_MESSAGE || field->type == PROTOBUF_C_TYPE_STRING) { const void *ptr = * (const void * const *) member; if (ptr == NULL) { - lstr_add(out, ""); + fprintf(out, ""); return; } else if (ptr == field->default_value) { - lstr_add(out, " ("); + fprintf(out, " ("); required_field_print(field, field->default_value, out, tabs); - lstr_add(out, ")"); + fprintf(out, ")"); return; } } else if (!*has) { - lstr_add(out, ""); + fprintf(out, ""); return; } required_field_print(field, member, out, tabs); } -static void print_tabs(LinkedString *out, int tabs) +static void print_tabs(FILE *out, int tabs) { int i; for (i = 0; i < tabs; i++) - lstr_add(out, "\t"); + fprintf(out, "\t"); } -static void print_nl(LinkedString *out, int tabs) +static void print_nl(FILE *out, int tabs) { - lstr_add(out, "\n"); + fprintf(out, "\n"); print_tabs(out, tabs); } @@ -290,9 +295,9 @@ static void repeated_field_print(const ProtobufCFieldDescriptor *field, size_t count, const void *member, - LinkedString *out, int tabs) + FILE *out, int tabs) { - lstr_add(out, "[%d] ", count); + fprintf(out, "[%d] ", count); if (count > 0) { if (field->type == PROTOBUF_C_TYPE_MESSAGE) { char *array = * (char * const *)member; @@ -304,7 +309,7 @@ repeated_field_print(const ProtobufCFieldDescriptor *field, } } else { - lstr_add(out, "{"); + fprintf(out, "{"); char *array = * (char * const *)member; unsigned siz = sizeof_elt_in_repeated_array(field->type); @@ -313,88 +318,88 @@ repeated_field_print(const ProtobufCFieldDescriptor *field, required_field_print(field, array, out, tabs); array += siz; if (i < count-1) - lstr_add(out, ", "); + fprintf(out, ", "); } - lstr_add(out, "}"); + fprintf(out, "}"); } } } static void unknown_field_print(const ProtobufCMessageUnknownField *field, - LinkedString *out) + FILE *out) { switch (field->wire_type) { case PROTOBUF_C_WIRE_TYPE_VARINT: - lstr_add(out, ""); break; + fprintf(out, ""); break; case PROTOBUF_C_WIRE_TYPE_64BIT: - lstr_add(out, "<64bit>"); break; + fprintf(out, "<64bit>"); break; case PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED: - lstr_add(out, ""); break; + fprintf(out, ""); break; case PROTOBUF_C_WIRE_TYPE_START_GROUP: - lstr_add(out, ""); break; + fprintf(out, ""); break; case PROTOBUF_C_WIRE_TYPE_END_GROUP: - lstr_add(out, ""); break; + fprintf(out, ""); break; case PROTOBUF_C_WIRE_TYPE_32BIT: - lstr_add(out, "<32bit>"); break; + fprintf(out, "<32bit>"); break; } - lstr_add(out, " [%d]", field->len); + fprintf(out, " [%d]", field->len); } -static void type_name_print(const ProtobufCFieldDescriptor *field, LinkedString *out) +static void type_name_print(const ProtobufCFieldDescriptor *field, FILE *out) { switch (field->type) { case PROTOBUF_C_TYPE_INT32: - lstr_add(out, "int32 %s", field->name); break; + fprintf(out, "int32 %s", field->name); break; case PROTOBUF_C_TYPE_SINT32: - lstr_add(out, "sint32 %s", field->name); break; + fprintf(out, "sint32 %s", field->name); break; case PROTOBUF_C_TYPE_SFIXED32: - lstr_add(out, "sfixed32 %s", field->name); break; + fprintf(out, "sfixed32 %s", field->name); break; case PROTOBUF_C_TYPE_INT64: - lstr_add(out, "int64 %s", field->name); break; + fprintf(out, "int64 %s", field->name); break; case PROTOBUF_C_TYPE_SINT64: - lstr_add(out, "sint64 %s", field->name); break; + fprintf(out, "sint64 %s", field->name); break; case PROTOBUF_C_TYPE_SFIXED64: - lstr_add(out, "sfixed64 %s", field->name); break; + fprintf(out, "sfixed64 %s", field->name); break; case PROTOBUF_C_TYPE_UINT32: - lstr_add(out, "uint32 %s", field->name); break; + fprintf(out, "uint32 %s", field->name); break; case PROTOBUF_C_TYPE_FIXED32: - lstr_add(out, "fixed32 %s", field->name); break; + fprintf(out, "fixed32 %s", field->name); break; case PROTOBUF_C_TYPE_UINT64: - lstr_add(out, "uint64 %s", field->name); break; + fprintf(out, "uint64 %s", field->name); break; case PROTOBUF_C_TYPE_FIXED64: - lstr_add(out, "fixed64 %s", field->name); break; + fprintf(out, "fixed64 %s", field->name); break; case PROTOBUF_C_TYPE_FLOAT: - lstr_add(out, "float %s", field->name); break; + fprintf(out, "float %s", field->name); break; case PROTOBUF_C_TYPE_DOUBLE: - lstr_add(out, "double %s", field->name); break; + fprintf(out, "double %s", field->name); break; case PROTOBUF_C_TYPE_BOOL: - lstr_add(out, "bool %s", field->name); break; + fprintf(out, "bool %s", field->name); break; case PROTOBUF_C_TYPE_ENUM: { const ProtobufCEnumDescriptor *desc = field->descriptor; - lstr_add(out, "%s %s", desc->name, field->name); + fprintf(out, "%s %s", desc->name, field->name); break; } case PROTOBUF_C_TYPE_STRING: - lstr_add(out, "string %s", field->name); break; + fprintf(out, "string %s", field->name); break; case PROTOBUF_C_TYPE_BYTES: - lstr_add(out, "bytes %s", field->name); break; + fprintf(out, "bytes %s", field->name); break; case PROTOBUF_C_TYPE_MESSAGE: { const ProtobufCMessageDescriptor *desc = field->descriptor; - lstr_add(out, "%s %s", desc->name, field->name); + fprintf(out, "%s %s", desc->name, field->name); break; } } } -static void message_body_print(const ProtobufCMessage *message, LinkedString *out, +static void message_body_print(const ProtobufCMessage *message, FILE *out, int tabs) { print_tabs(out, tabs); - lstr_add(out, "{ [%d]", message->descriptor->sizeof_message); + fprintf(out, "{ [%d]", message->descriptor->sizeof_message); tabs++; unsigned i; for (i = 0; i < message->descriptor->n_fields; i++) @@ -404,40 +409,40 @@ static void message_body_print(const ProtobufCMessage *message, LinkedString *ou const void *qmember = ((const char *) message) + field->quantifier_offset; print_nl(out, tabs); - lstr_add(out, "%d: ", field->id); + fprintf(out, "%d: ", field->id); if (field->label == PROTOBUF_C_LABEL_REQUIRED) { - lstr_add(out, "required "); + fprintf(out, "required "); type_name_print(field, out); - lstr_add(out, " = "); + fprintf(out, " = "); required_field_print(field, member, out, tabs); } else if (field->label == PROTOBUF_C_LABEL_OPTIONAL) { - lstr_add(out, "optional "); + fprintf(out, "optional "); type_name_print(field, out); - lstr_add(out, " = "); + fprintf(out, " = "); optional_field_print(field, qmember, member, out, tabs); } else { - lstr_add(out, "repeated "); + fprintf(out, "repeated "); type_name_print(field, out); - lstr_add(out, " = "); + fprintf(out, " = "); repeated_field_print(field, *(const size_t *)qmember, member, out, tabs); } } for (i = 0; i < message->n_unknown_fields; i++) { - lstr_add(out, "unknown "); + fprintf(out, "unknown "); unknown_field_print(&message->unknown_fields[i], out); print_nl(out, tabs); } tabs--; print_nl(out, tabs); - lstr_add(out, "}"); + fprintf(out, "}"); } -void protobuf_c_message_print(const ProtobufCMessage *message, LinkedString *out) +void protobuf_c_message_print(const ProtobufCMessage *message, FILE *out) { - lstr_add(out, "%s ", message->descriptor->name); + fprintf(out, "%s ", message->descriptor->name); message_body_print(message, out, 0); - lstr_add(out, "\n"); + fprintf(out, "\n"); } diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..e483f56 --- /dev/null +++ b/run.sh @@ -0,0 +1 @@ +./build/client files/ certs/stelcert.pem node/$1/4.conf diff --git a/api.c b/src/api.c similarity index 100% rename from api.c rename to src/api.c diff --git a/chord.c b/src/chord.c similarity index 100% rename from chord.c rename to src/chord.c diff --git a/chord.h b/src/chord.h similarity index 100% rename from chord.h rename to src/chord.h diff --git a/chord_api.h b/src/chord_api.h similarity index 100% rename from chord_api.h rename to src/chord_api.h diff --git a/crypt.c b/src/crypt.c similarity index 100% rename from crypt.c rename to src/crypt.c diff --git a/debug.h b/src/debug.h similarity index 100% rename from debug.h rename to src/debug.h diff --git a/dispatcher.c b/src/dispatcher.c similarity index 100% rename from dispatcher.c rename to src/dispatcher.c diff --git a/dispatcher.h b/src/dispatcher.h similarity index 100% rename from dispatcher.h rename to src/dispatcher.h diff --git a/eprintf.c b/src/eprintf.c similarity index 100% rename from eprintf.c rename to src/eprintf.c diff --git a/eprintf.h b/src/eprintf.h similarity index 100% rename from eprintf.h rename to src/eprintf.h diff --git a/finger.c b/src/finger.c similarity index 100% rename from finger.c rename to src/finger.c diff --git a/gen_utils.h b/src/gen_utils.h similarity index 100% rename from gen_utils.h rename to src/gen_utils.h diff --git a/grid.c b/src/grid.c similarity index 100% rename from grid.c rename to src/grid.c diff --git a/grid.h b/src/grid.h similarity index 100% rename from grid.h rename to src/grid.h diff --git a/hosts.c b/src/hosts.c similarity index 100% rename from hosts.c rename to src/hosts.c diff --git a/join.c b/src/join.c similarity index 100% rename from join.c rename to src/join.c diff --git a/logger/README_HASHMAP b/src/logger/README_HASHMAP similarity index 100% rename from logger/README_HASHMAP rename to src/logger/README_HASHMAP diff --git a/logger/hashmap.c b/src/logger/hashmap.c similarity index 100% rename from logger/hashmap.c rename to src/logger/hashmap.c diff --git a/logger/hashmap.h b/src/logger/hashmap.h similarity index 100% rename from logger/hashmap.h rename to src/logger/hashmap.h diff --git a/logger/logger.c b/src/logger/logger.c similarity index 98% rename from logger/logger.c rename to src/logger/logger.c index 1a6e44a..3118084 100644 --- a/logger/logger.c +++ b/src/logger/logger.c @@ -198,11 +198,13 @@ void EndLog_impl(logger_ctx_t *l, const char *file) l = get_logger_for_file(file); if (l->log_partial) { - l->log_partial = 0; - fflush(l->fp); if (l->end_msg != NULL) l->end_msg(l); + + // fflush() calls write(), which checks log_partial, so make + // sure to clear the flag only after that's done + l->log_partial = 0; } } diff --git a/logger/logger.h b/src/logger/logger.h similarity index 100% rename from logger/logger.h rename to src/logger/logger.h diff --git a/messages.proto b/src/messages.proto similarity index 100% rename from messages.proto rename to src/messages.proto diff --git a/src/pack.c b/src/pack.c new file mode 100644 index 0000000..e679c84 --- /dev/null +++ b/src/pack.c @@ -0,0 +1,443 @@ +#include +#include +#include +#include +#include +#include "chord.h" +#include "ctype.h" +#include "dispatcher.h" +#include "messages.pb-c.h" + +static uchar msg_buf[BUFSIZE]; + +int pack_header(uchar *buf, int version, int type, const ProtobufCMessage *msg) +{ + Header header = HEADER__INIT; + header.version = version; + header.has_version = 1; + + header.type = type; + header.payload.len = protobuf_c_message_pack(msg, msg_buf); + header.payload.data = msg_buf; + return header__pack(&header, buf); +} + +int pack_addr_discover(uchar *buf, uchar *ticket, int ticket_len) +{ + AddrDiscover msg = ADDR_DISCOVER__INIT; + msg.ticket.len = ticket_len; + msg.ticket.data = ticket; + msg.has_ticket = 1; + return pack_chord_header(buf, CHORD_ADDR_DISCOVER, &msg); +} + +int pack_addr_discover_reply(uchar *buf, uchar *ticket, int ticket_len, + in6_addr *addr) +{ + AddrDiscoverReply msg = ADDR_DISCOVER_REPLY__INIT; + msg.ticket.len = ticket_len; + msg.ticket.data = ticket; + msg.has_ticket = 1; + + msg.addr.len = 16; + msg.addr.data = addr->s6_addr; + return pack_chord_header(buf, CHORD_ADDR_DISCOVER_REPLY, &msg); +} + +int pack_data(uchar *buf, int last, uchar ttl, chordID *id, ushort len, + const uchar *data) +{ + Data msg = DATA__INIT; + msg.id.len = CHORD_ID_LEN; + msg.id.data = id->x; + + msg.ttl = ttl; + msg.has_ttl = 1; + msg.last = last; + msg.has_last = 1; + + msg.data.len = len; + msg.data.data = (uint8_t *)data; + return pack_chord_header(buf, CHORD_DATA, &msg); +} + +int pack_fs(uchar *buf, uchar *ticket, int ticket_len, uchar ttl, + in6_addr *addr, ushort port) +{ + FindSuccessor msg = FIND_SUCCESSOR__INIT; + msg.ticket.len = ticket_len; + msg.ticket.data = ticket; + msg.has_ticket = 1; + + msg.ttl = ttl; + msg.has_ttl = 1; + + msg.addr.len = 16; + msg.addr.data = addr->s6_addr; + msg.port = port; + return pack_chord_header(buf, CHORD_FS, &msg); +} + +int pack_fs_reply(uchar *buf, uchar *ticket, int ticket_len, in6_addr *addr, + ushort port) +{ + FindSuccessorReply msg = FIND_SUCCESSOR_REPLY__INIT; + msg.ticket.len = ticket_len; + msg.ticket.data = ticket; + msg.has_ticket = 1; + + msg.addr.len = 16; + msg.addr.data = addr->s6_addr; + msg.port = port; + return pack_chord_header(buf, CHORD_FS_REPLY, &msg); +} + +int pack_stab(uchar *buf, in6_addr *addr, ushort port) +{ + Stabilize msg = STABILIZE__INIT; + msg.addr.len = 16; + msg.addr.data = addr->s6_addr; + msg.port = port; + return pack_chord_header(buf, CHORD_STAB, &msg); +} + +int pack_stab_reply(uchar *buf, in6_addr *addr, ushort port) +{ + StabilizeReply msg = STABILIZE_REPLY__INIT; + msg.addr.len = 16; + msg.addr.data = addr->s6_addr; + msg.port = port; + return pack_chord_header(buf, CHORD_STAB_REPLY, &msg); +} + +int pack_notify(uchar *buf) +{ + Notify msg = NOTIFY__INIT; + return pack_chord_header(buf, CHORD_NOTIFY, &msg); +} + +int pack_ping(uchar *buf, uchar *ticket, int ticket_len, ulong time) +{ + Ping msg = PING__INIT; + msg.ticket.len = ticket_len; + msg.ticket.data = ticket; + msg.has_ticket = 1; + msg.time = time; + return pack_chord_header(buf, CHORD_PING, &msg); +} + +int pack_pong(uchar *buf, uchar *ticket, int ticket_len, ulong time) +{ + Pong msg = PONG__INIT; + msg.ticket.len = ticket_len; + msg.ticket.data = ticket; + msg.has_ticket = 1; + msg.time = time; + return pack_chord_header(buf, CHORD_PONG, &msg); +} + +static inline size_t +sizeof_elt_in_repeated_array (ProtobufCType type) +{ + switch (type) + { + case PROTOBUF_C_TYPE_SINT32: + case PROTOBUF_C_TYPE_INT32: + case PROTOBUF_C_TYPE_UINT32: + case PROTOBUF_C_TYPE_SFIXED32: + case PROTOBUF_C_TYPE_FIXED32: + case PROTOBUF_C_TYPE_FLOAT: + case PROTOBUF_C_TYPE_ENUM: + return 4; + case PROTOBUF_C_TYPE_SINT64: + case PROTOBUF_C_TYPE_INT64: + case PROTOBUF_C_TYPE_UINT64: + case PROTOBUF_C_TYPE_SFIXED64: + case PROTOBUF_C_TYPE_FIXED64: + case PROTOBUF_C_TYPE_DOUBLE: + return 8; + case PROTOBUF_C_TYPE_BOOL: + return sizeof (protobuf_c_boolean); + case PROTOBUF_C_TYPE_STRING: + case PROTOBUF_C_TYPE_MESSAGE: + return sizeof (void *); + case PROTOBUF_C_TYPE_BYTES: + return sizeof (ProtobufCBinaryData); + } + PROTOBUF_C_ASSERT_NOT_REACHED (); + return 0; +} + +static void message_body_print(const ProtobufCMessage *message, LinkedString *out, + int tabs); + +static void +required_field_print(const ProtobufCFieldDescriptor *field, + const void *member, + LinkedString *out, int tabs) +{ + switch (field->type) + { + case PROTOBUF_C_TYPE_SFIXED32: + case PROTOBUF_C_TYPE_SINT32: + case PROTOBUF_C_TYPE_INT32: + lstr_add(out, "%d", *(const int32_t *)member); break; + case PROTOBUF_C_TYPE_FIXED32: + case PROTOBUF_C_TYPE_UINT32: + lstr_add(out, "%u", *(const uint32_t *)member); break; + case PROTOBUF_C_TYPE_SFIXED64: + case PROTOBUF_C_TYPE_SINT64: + case PROTOBUF_C_TYPE_INT64: + lstr_add(out, "%lld", *(const int64_t *)member); break; + case PROTOBUF_C_TYPE_FIXED64: + case PROTOBUF_C_TYPE_UINT64: + lstr_add(out, "%llu", *(const uint64_t *)member); break; + case PROTOBUF_C_TYPE_FLOAT: + lstr_add(out, "%f", *(const float *)member); break; + case PROTOBUF_C_TYPE_DOUBLE: + lstr_add(out, "%lf", *(const double *)member); break; + case PROTOBUF_C_TYPE_BOOL: + lstr_add(out, "%s", *(const protobuf_c_boolean *)member + ? "true" : "false"); + break; + case PROTOBUF_C_TYPE_STRING: + lstr_add(out, "[%d] \"%s\"", strlen(*(char * const *)member), + *(char * const *)member); + break; + case PROTOBUF_C_TYPE_BYTES: + { + const ProtobufCBinaryData * bd = ((const ProtobufCBinaryData*) member); + lstr_add(out, "[%d] ", bd->len); + int i; + for (i = 0; i < bd->len; i++) + lstr_add(out, "%02x ", bd->data[i]); + + int printable = 1; + for (i = 0; i < bd->len; i++) { + if (!isprint(bd->data[i])) { + printable = 0; + break; + } + } + + if (printable && bd->len > 0) { + lstr_add(out, "(\""); + for (i = 0; i < bd->len; i++) + lstr_add(out, "%c", bd->data[i]); + lstr_add(out, "\")"); + } + break; + } + //case PROTOBUF_C_TYPE_GROUP: // NOT SUPPORTED + case PROTOBUF_C_TYPE_MESSAGE: + lstr_add(out, "\n"); + message_body_print(*(ProtobufCMessage * const *)member, out, tabs); + break; + case PROTOBUF_C_TYPE_ENUM: + { + uint32_t value = *(const uint32_t *)member; + const ProtobufCEnumDescriptor *desc = field->descriptor; + lstr_add(out, "%u", value); + if (value < desc->n_values) + lstr_add(out, " (%s)", desc->values[value].name); + break; + } + } +} + +static void +optional_field_print(const ProtobufCFieldDescriptor *field, + const protobuf_c_boolean *has, + const void *member, + LinkedString *out, int tabs) +{ + if (field->type == PROTOBUF_C_TYPE_MESSAGE + || field->type == PROTOBUF_C_TYPE_STRING) + { + const void *ptr = * (const void * const *) member; + if (ptr == NULL) { + lstr_add(out, ""); + return; + } + else if (ptr == field->default_value) { + lstr_add(out, " ("); + required_field_print(field, field->default_value, out, tabs); + lstr_add(out, ")"); + return; + } + } + else if (!*has) { + lstr_add(out, ""); + return; + } + required_field_print(field, member, out, tabs); +} + +static void print_tabs(LinkedString *out, int tabs) +{ + int i; + for (i = 0; i < tabs; i++) + lstr_add(out, "\t"); +} + +static void print_nl(LinkedString *out, int tabs) +{ + lstr_add(out, "\n"); + print_tabs(out, tabs); +} + +static void +repeated_field_print(const ProtobufCFieldDescriptor *field, + size_t count, + const void *member, + LinkedString *out, int tabs) +{ + lstr_add(out, "[%d] ", count); + if (count > 0) { + if (field->type == PROTOBUF_C_TYPE_MESSAGE) { + char *array = * (char * const *)member; + unsigned siz = sizeof_elt_in_repeated_array(field->type); + unsigned i; + for (i = 0; i < count; i++) { + required_field_print(field, array, out, tabs); + array += siz; + } + } + else { + lstr_add(out, "{"); + + char *array = * (char * const *)member; + unsigned siz = sizeof_elt_in_repeated_array(field->type); + unsigned i; + for (i = 0; i < count; i++) { + required_field_print(field, array, out, tabs); + array += siz; + if (i < count-1) + lstr_add(out, ", "); + } + + lstr_add(out, "}"); + } + } +} + +static void +unknown_field_print(const ProtobufCMessageUnknownField *field, + LinkedString *out) +{ + switch (field->wire_type) { + case PROTOBUF_C_WIRE_TYPE_VARINT: + lstr_add(out, ""); break; + case PROTOBUF_C_WIRE_TYPE_64BIT: + lstr_add(out, "<64bit>"); break; + case PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED: + lstr_add(out, ""); break; + case PROTOBUF_C_WIRE_TYPE_START_GROUP: + lstr_add(out, ""); break; + case PROTOBUF_C_WIRE_TYPE_END_GROUP: + lstr_add(out, ""); break; + case PROTOBUF_C_WIRE_TYPE_32BIT: + lstr_add(out, "<32bit>"); break; + } + lstr_add(out, " [%d]", field->len); +} + +static void type_name_print(const ProtobufCFieldDescriptor *field, LinkedString *out) +{ + switch (field->type) { + case PROTOBUF_C_TYPE_INT32: + lstr_add(out, "int32 %s", field->name); break; + case PROTOBUF_C_TYPE_SINT32: + lstr_add(out, "sint32 %s", field->name); break; + case PROTOBUF_C_TYPE_SFIXED32: + lstr_add(out, "sfixed32 %s", field->name); break; + case PROTOBUF_C_TYPE_INT64: + lstr_add(out, "int64 %s", field->name); break; + case PROTOBUF_C_TYPE_SINT64: + lstr_add(out, "sint64 %s", field->name); break; + case PROTOBUF_C_TYPE_SFIXED64: + lstr_add(out, "sfixed64 %s", field->name); break; + case PROTOBUF_C_TYPE_UINT32: + lstr_add(out, "uint32 %s", field->name); break; + case PROTOBUF_C_TYPE_FIXED32: + lstr_add(out, "fixed32 %s", field->name); break; + case PROTOBUF_C_TYPE_UINT64: + lstr_add(out, "uint64 %s", field->name); break; + case PROTOBUF_C_TYPE_FIXED64: + lstr_add(out, "fixed64 %s", field->name); break; + case PROTOBUF_C_TYPE_FLOAT: + lstr_add(out, "float %s", field->name); break; + case PROTOBUF_C_TYPE_DOUBLE: + lstr_add(out, "double %s", field->name); break; + case PROTOBUF_C_TYPE_BOOL: + lstr_add(out, "bool %s", field->name); break; + case PROTOBUF_C_TYPE_ENUM: + { + const ProtobufCEnumDescriptor *desc = field->descriptor; + lstr_add(out, "%s %s", desc->name, field->name); + break; + } + case PROTOBUF_C_TYPE_STRING: + lstr_add(out, "string %s", field->name); break; + case PROTOBUF_C_TYPE_BYTES: + lstr_add(out, "bytes %s", field->name); break; + case PROTOBUF_C_TYPE_MESSAGE: + { + const ProtobufCMessageDescriptor *desc = field->descriptor; + lstr_add(out, "%s %s", desc->name, field->name); + break; + } + } +} + +static void message_body_print(const ProtobufCMessage *message, LinkedString *out, + int tabs) +{ + print_tabs(out, tabs); + lstr_add(out, "{ [%d]", message->descriptor->sizeof_message); + tabs++; + unsigned i; + for (i = 0; i < message->descriptor->n_fields; i++) + { + const ProtobufCFieldDescriptor *field = message->descriptor->fields + i; + const void *member = ((const char *) message) + field->offset; + const void *qmember = ((const char *) message) + field->quantifier_offset; + + print_nl(out, tabs); + lstr_add(out, "%d: ", field->id); + if (field->label == PROTOBUF_C_LABEL_REQUIRED) { + lstr_add(out, "required "); + type_name_print(field, out); + lstr_add(out, " = "); + required_field_print(field, member, out, tabs); + } + else if (field->label == PROTOBUF_C_LABEL_OPTIONAL) { + lstr_add(out, "optional "); + type_name_print(field, out); + lstr_add(out, " = "); + optional_field_print(field, qmember, member, out, tabs); + } + else { + lstr_add(out, "repeated "); + type_name_print(field, out); + lstr_add(out, " = "); + repeated_field_print(field, *(const size_t *)qmember, member, out, + tabs); + } + } + for (i = 0; i < message->n_unknown_fields; i++) { + lstr_add(out, "unknown "); + unknown_field_print(&message->unknown_fields[i], out); + print_nl(out, tabs); + } + tabs--; + print_nl(out, tabs); + lstr_add(out, "}"); +} + +void protobuf_c_message_print(const ProtobufCMessage *message, LinkedString *out) +{ + lstr_add(out, "%s ", message->descriptor->name); + message_body_print(message, out, 0); + lstr_add(out, "\n"); +} diff --git a/process.c b/src/process.c similarity index 100% rename from process.c rename to src/process.c diff --git a/sendpkt.c b/src/sendpkt.c similarity index 100% rename from sendpkt.c rename to src/sendpkt.c diff --git a/stabilize.c b/src/stabilize.c similarity index 100% rename from stabilize.c rename to src/stabilize.c diff --git a/str.c b/src/str.c similarity index 100% rename from str.c rename to src/str.c diff --git a/util.c b/src/util.c similarity index 100% rename from util.c rename to src/util.c