libvchan_t *libvchan_server_init(int domain, int port, size_t read_min, size_t write_min) { char xs_path[255]; libvchan_t *ctrl; ctrl = malloc(sizeof(*ctrl)); if (!ctrl) return NULL; snprintf(xs_path, sizeof(xs_path), "data/vchan/%d/%d", domain, port); ctrl->xenvchan = libxenvchan_server_init(NULL, domain, xs_path, read_min, write_min); if (!ctrl->xenvchan) { free(ctrl); return NULL; } ctrl->xs_path = strdup(xs_path); ctrl->xenvchan->blocking = 1; ctrl->remote_domain = domain; ctrl->xc_handle = xc_interface_open(NULL, NULL, 0); if (!ctrl->xc_handle) { /* error already logged by xc_interface_open */ libxenvchan_close(ctrl->xenvchan); free(ctrl); return NULL; } return ctrl; }
/** Listens for connections and writes everything to /dev/null */ int main(int argc, char **argv) { int my_domid = -1; int remote_domid = -1; char path[128]; struct libxenvchan *ctrl = 0; if (argc < 4) usage(argv); bufsize = atoi(argv[1]); my_domid = atoi(argv[2]); buf = (char*)malloc(bufsize); if (!buf) { perror("malloc"); exit(1); } remote_domid = atoi(argv[3]); sprintf(path, "/local/domain/%d/data/%d/0", my_domid, my_domid); fprintf(stderr, "Path: %s\n", path); ctrl = libxenvchan_server_init(NULL, remote_domid, path, 1024, 1024); if (!ctrl) { perror("libxenvchan_*_init"); exit(1); } ctrl->blocking = 1; reader(ctrl); libxenvchan_close(ctrl); return 0; }
//#################################################################### struct libxenvchan * createReceiveChanP (xentoollog_logger * xc_logger, int id, char * path){ struct libxenvchan *rxCtrl=0; char p[256]; if (!path){ sprintf(p,"%s", SERV_REL_RX_XS_PATH); }else{ sprintf (p,"%s",path); } sprintf(p, "%s_%d",p,id); // We act as a server for our RX. fprintf(stdout, "receiveChan: vchan init for xs=%s to domId=%d,\n", p, id ); rxCtrl = libxenvchan_server_init(xc_logger, id, p, 0, 0); if(rxCtrl == NULL) { // We had an error trying to initialise the server vchan. char * lclErrStr = strerror(errno); fprintf(stderr, "Error: %s: libxenvchan_server_init: domId=%d, xsPath=%s.\n", lclErrStr, id, p); if(errno == ENOENT) { fprintf(stderr, " kernel module xen_gntalloc (/dev/xen/gntalloc) or xen_evtchn (/dev/xen/evtchn) may not be running.\n"); } exit(1); } // rxCtrl->blocking = 1; // Block for each vchan IO ? rxCtrl->is_server = 1; return rxCtrl; }
libvchan_t *libvchan_server_init(int domain, int port, size_t read_min, size_t write_min) { char xs_path[255]; libvchan_t *ctrl; ctrl = malloc(sizeof(*ctrl)); if (!ctrl) return NULL; snprintf(xs_path, sizeof(xs_path), "data/vchan/%d/%d", domain, port); ctrl->xenvchan = libxenvchan_server_init(g_logger, domain, xs_path, read_min, write_min); if (!ctrl->xenvchan) { Log(XLL_ERROR, "libxenvchan_server_init failed"); free(ctrl); // The above sets last error to ERROR_NOT_SUPPORTED if xeniface // is not loaded, see below for more info. return NULL; } ctrl->xs_path = _strdup(xs_path); ctrl->xenvchan->blocking = 1; ctrl->remote_domain = domain; Log(XLL_DEBUG, "ctrl %p, xenvchan %p, path %S", ctrl, ctrl->xenvchan, ctrl->xs_path); return ctrl; }