Beispiel #1
0
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;
}
Beispiel #2
0
/**
	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;
}
Beispiel #3
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;
}