/* _raft_readname(): parse a raft host:port peer name. */ static u2_rnam* _raft_readname(const c3_c* str_c, c3_w siz_w) { u2_rnam* nam_u = calloc(1, sizeof(*nam_u)); c3_c* col_c; c3_w nam_w; nam_u->str_c = malloc(siz_w + 1); strncpy(nam_u->str_c, str_c, siz_w); nam_u->str_c[siz_w] = '\0'; //fprintf(stderr, "raft: peer %s\n", nam_u->str_c); if ( 0 == (col_c = strchr(nam_u->str_c, ':')) ) { uL(fprintf(uH, "raft: invalid name %s\n", nam_u->str_c)); _raft_rnam_free(nam_u); nam_u = 0; } else { nam_w = col_c - nam_u->str_c + 1; nam_u->nam_c = malloc(nam_w); uv_strlcpy(nam_u->nam_c, nam_u->str_c, nam_w); nam_u->por_c = strdup(col_c + 1); } return nam_u; }
/* u2_raft_readopt(): parse a string into a list of raft peers. */ u2_rnam* u2_raft_readopt(const c3_c* arg_c, c3_c* our_c, c3_s oup_s) { u2_rnam* nam_u; u2_rnam* nex_u; c3_c* com_c; if ( 0 == (com_c = strchr(arg_c, ',')) ) { nam_u = _raft_readname(arg_c, strlen(arg_c)); nex_u = 0; } else { nam_u = _raft_readname(arg_c, com_c - arg_c); nex_u = u2_raft_readopt(com_c + 1, our_c, oup_s); } if ( nam_u ) { c3_c* end_c; c3_w por_w = strtoul(nam_u->por_c, &end_c, 10); if ( '\0' == *nam_u->por_c || '\0' != *end_c || por_w >= 65536 ) { uL(fprintf(uH, "raft: invalid port %s\n", nam_u->por_c)); _raft_rnam_free(nam_u); _raft_rnam_free(nex_u); nam_u = 0; } else { if ( oup_s == por_w && 0 == strcmp(our_c, nam_u->nam_c) ) { _raft_rnam_free(nam_u); nam_u = nex_u; } else nam_u->nex_u = nex_u; } } else _raft_rnam_free(nex_u); return nam_u; }