int decode_context (char *dst, int *dstlen, const void *src, int srclen) { base64_ctx x; int i; int n; int m; const unsigned char *p = src; if (base64_init (&x) < 0) return (-1); for (i = 0, n = 0; i < srclen; i++) { if (base64_decode_update (&x, dst, &m, p + i, 1) < 0) return (-1); dst += m; n += m; } if (base64_decode_final (&x, dst, &m) < 0) return (-1); if (base64_cleanup (&x) < 0) return (-1); n += m; *dstlen = n; return (0); }
int encode_context ( char *dst, int *dstlen, const char *src, int srclen) { base64_ctx x; int i; int n; int m; if (base64_init (&x) < 0) return (-1); for (i=0, n=0; i<srclen; i++) { if (base64_encode_update (&x, dst, &m, src + i, 1) < 0) return (-1); dst += m; n += m; } if (base64_encode_final (&x, dst, &m) < 0) return (-1); if (base64_cleanup (&x) < 0) return (-1); n += m; *dstlen = n; return (0); }
int main(int argc, char *argv[]) { if(argc < 2) { printf("Usage: raftd <id> <basedir>\n"); return 1; } base64_init(); int id = atoi(argv[1]); if(id < 1 || id > 3) { printf("Usage: raftd <id>\n"); printf("provided <id> > 0 && <id> <= 3\n"); return 1; } srandom(id); verbosity = LOG_DEBUG; struct server_context_t *s = init_raft_server(id, argv[2], "0.0.0.0", ports[id - 1], HTTP, 1000000l, 500000l); int peers[2]; int peer_ports[2]; for(int i = 1, j = 0; i <= 3; i++) { if(id != i) { peers[j] = i; peer_ports[j] = ports[i - 1]; j++; } } printf("Server port = %d\n", ports[id - 1]); printf("Peer ports = %d %d\n", peer_ports[0], peer_ports[1]); const char *hosts[] = { "0.0.0.0", "0.0.0.0" }; if(s) { if(add_pairs(s, 2, peers, hosts, peer_ports)) { DBG_LOG(LOG_FATAL, "[%s][%d] Error while adding peers to server", ss[s->state], s->current_term); deinit_raft_server(s); return 1; } } else { DBG_LOG(LOG_FATAL, "[?][?] Error while creating server instance"); exit(1); } int clientport = ports[id - 1] + 10; printf("Client port = %d\n", clientport); start_server(s, clientport); deinit_raft_server(s); base64_cleanup(); return 0; }
int main() { { struct request_vote_input_t in = {41, 42, 43, 44}; struct method_t *rv = make_request_vote_rpc_method(&in); if(rv) { if(strcmp(rv->name, REQUEST_VOTE_RPC)) { printf("failed = expected %s actual %s\n", REQUEST_VOTE_RPC, rv->name); } else { if(rv->nparams != REQUEST_VOTE_PARAM_COUNT) { printf("failed = expected %d actual %d\n", REQUEST_VOTE_PARAM_COUNT, rv->nparams); } else { if(*(json_int_t *)rv->params[0]->value != 41 || *(json_int_t *)rv->params[1]->value != 42 || *(json_int_t *)rv->params[2]->value != 43 || *(json_int_t *)rv->params[3]->value != 44) { printf("failed = incorrect values in params\n"); } } } free_method_t(rv); } else { printf("failed = null method\n"); } } { base64_init(); unsigned char buf[] = {0, 41, 12, 33}; struct log_entry_t le1 = { buf, 4, 42, 43 }; struct log_entry_t *les[] = { &le1 }; struct append_entries_input_t in = {41, 42, 43, 44, 45, les, 1}; struct method_t *rv = make_append_entries_rpc_method(&in); if(rv) { if(strcmp(rv->name, APPEND_ENTRIES_RPC)) { printf("failed = expected %s actual %s\n", APPEND_ENTRIES_RPC, rv->name); } else { if(rv->nparams != APPEND_ENTRIES_PARAM_COUNT) { printf("failed = expected %d actual %d\n", APPEND_ENTRIES_PARAM_COUNT, rv->nparams); } else { if(*(json_int_t *)rv->params[0]->value != 41 || *(json_int_t *)rv->params[1]->value != 42 || *(json_int_t *)rv->params[2]->value != 43 || *(json_int_t *)rv->params[3]->value != 44 || *(json_int_t *)rv->params[4]->value != 45) { printf("failed = incorrect values in params\n"); } else { if(rv->params[5]->length == 1) { struct data_t *dx = rv->params[5]->child[0]; char *d = (char *)dx->child[0]->value; uint64_t term = *(json_int_t *)dx->child[1]->value; uint64_t index = *(json_int_t *)dx->child[2]->value; size_t outlen = 0; unsigned char *buf = base64_decode(d, strlen(d), &outlen); if(outlen == 4) { if(buf[0] != 0 || buf[1] != 41 || buf[2] != 12 || buf[3] != 33 || term != 42 || index != 43) { printf("failed = incorrect values in decoded buf\n"); } } else { printf("failed = incorrect values in decoded params\n"); } if(buf) free(buf); } else { printf("failed = incorrect values in array params\n"); } } } } free_method_t(rv); } else { printf("failed = null method\n"); } base64_cleanup(); } { struct request_vote_output_t o = {41, 42}; struct data_t *r = make_request_vote_rpc_response(&o); if(r) { if(r->type != RPC_VECTOR || r->length != 2) { printf("failed = incorrect values in output\n"); } free_data_t(r); } else { printf("failed = null output\n"); } } { struct append_entries_output_t o = {41, 42}; struct data_t *r = make_append_entries_rpc_response(&o); if(r) { if(r->type != RPC_VECTOR || r->length != 2) { printf("failed = incorrect values in output\n"); } free_data_t(r); } else { printf("failed = null output\n"); } } return 0; }
void interface_cleanup() { base64_cleanup(); }