<div dir="ltr"><div><div><div><div><div>Hi All,<br><br></div>In my test program, where I open a Vici connection with Charon and call "list-conns", I can't seem to parse the Vici response which comes back from Charon using the libvici API. The raw vici message is<br><br>{homes {local_addrs=[%any] remote_addrs=[192.168.2.129] version=IKEv2 local-1 {id=RoadWarrior class=public key groups=[] certs=[C=US, ST=CA, L=Cupertino, O=Testing, OU=Testing, CN=RoadWarrior] cacerts=[]} remote-1 {id=GateWay class=public key groups=[] certs=[] cacerts=[]} children {home {mode=TUNNEL local-ts=[dynamic] remote-ts=[<a href="http://192.168.11.0/24]}}">192.168.11.0/24]}}</a>}}<br><br></div>My program (modeled on swanctl) outputs<br><br>Sec homes<br>Key local_addrs, Value %any<br>'start' within list<br><br></div>and fails with error. The code is below. Would someone take a look, and see what I am doing wrong?<br><br></div>Thank you,<br><br></div>Harry<br><br>----------------------------------------------<br><div><div><br>#include <stdio.h><br>#include <stdlib.h><br>#include <errno.h><br>#include <string.h><br>extern "C" {<br>#include "strongswan/vici/libvici.h"<br>}<br><br>int key_val_cb(void *null, vici_res_t *res, char *name, void *value, int len)<br>{<br>  ((char*)value)[len] = '\0';<br>  printf("Key %s, Value %s\n", name, ((char*)value));<br>  return 0;<br>}<br><br>int children_sn(void *null, vici_res_t *res, char *name)<br>{<br>  return vici_parse_cb(res, NULL, key_val_cb, key_val_cb, NULL);<br>}<br><br>int conn_sn(void *null, vici_res_t *res, char *name)<br>{<br>  if (strcmp(name, "children") == 0) {<br>    return vici_parse_cb(res, children_sn, NULL, NULL, NULL);<br>  } else {<br>    return vici_parse_cb(res, NULL, key_val_cb, key_val_cb, NULL);<br>  }<br>}<br><br>int conns(void *null, vici_res_t *res, char *name)<br>{<br>  printf("Sec %s\n", name);<br>  return vici_parse_cb(res, conn_sn, NULL, key_val_cb, NULL);<br>}<br><br>void list_cb(void *null, char *name, vici_res_t *res)<br>{<br>  vici_dump(res, "Raw Message: ", 0, stdout);<br>  vici_parse_cb(res, conns, NULL, NULL, NULL);<br>}<br><br>int main(int argc, char **argv)<br>{<br>  // Test out VICI<br>  vici_conn_t *conn = NULL;<br><br>  vici_init();<br>  conn = vici_connect(NULL);<br>  if (conn == NULL) {<br>    perror("VICI connect failed"); <br>  } else {<br>    vici_req_t *req = NULL;<br>    vici_res_t *res = NULL;<br>    vici_register(conn, "list-conn", list_cb, NULL);<br>    req = vici_begin("list-conns");<br>    res = vici_submit(req, conn);<br>    if (res == NULL) {<br>      perror("VICI transaction failed");<br>    } else {<br>      vici_free_res(res);<br>    }<br>    vici_disconnect(conn);<br>  }<br>  vici_deinit();<br><br>  return 0;<br>}<br><br><div><div><div><div><br></div><div><br></div></div></div></div></div></div></div>