#include #include #include #include #include #include #include "mjson.h" #include "unix_sockets.h" #include "melon_vpn_sock.h" #define JBUF_SIZE 5000 #define NAME_MAX 25 #define IP_MAX 15 #define DEV_MAX 25 struct dev_t { char name[NAME_MAX]; char ip[IP_MAX]; }; struct devlist_t { int ndevices; struct dev_t list[DEV_MAX]; }; static struct devlist_t devicelist; static int json_devicelist_read(const char *buf) { const struct json_attr_t json_attrs_subdevice[] = { {"Name",t_string,STRUCTOBJECT(struct dev_t,name),.len=NAME_MAX}, {"IP",t_string,STRUCTOBJECT(struct dev_t,ip),.len=IP_MAX}, {NULL}, }; const struct json_attr_t json_attrs_devices[] = { {"devices", t_array, STRUCTARRAY(devicelist.list,json_attrs_subdevice,&devicelist.ndevices)}, {NULL}, }; int status; memset(&devicelist, '\0', sizeof(devicelist)); status = json_read_object(buf, json_attrs_devices, NULL); if (status != 0) return status; return 0; } void send_to_daemon(char*, ssize_t); int main(int argc, char *argv[]) { char jbuf[JBUF_SIZE]; char ibuf[JBUF_SIZE]; strcpy(jbuf, "{\"devices\":"); read(STDIN_FILENO, ibuf, JBUF_SIZE); strcat(jbuf, ibuf); strcat(jbuf, "}"); int status = json_devicelist_read(jbuf); if (status != 0) { puts(json_error_string(status)); } else { ssize_t l=0; char obuf[JBUF_SIZE]; obuf[JBUF_SIZE-1]=0; strcpy(obuf, ""); for (int i = 0; i < devicelist.ndevices; i++) { l += strlen(devicelist.list[i].name)+strlen(devicelist.list[i].ip)+2; strcat(obuf, devicelist.list[i].name); strcat(obuf, "\t"); strcat(obuf, devicelist.list[i].ip); strcat(obuf, "\n"); obuf[l]=0; fprintf(stderr, "l: %d\nobuf: %d\n",l,strlen(obuf)); } send_to_daemon(obuf,l); } } void send_to_daemon(char *buf, ssize_t n) { int sfd = unix_socket_client_start(SV_RPEERS_SOCK_PATH); if(sfd==-1) { return; } write(sfd, buf, n); close(sfd); fprintf(stderr, "Closed connection to socket"); }