⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blktapctrl_linux.c

📁 xen虚拟机源代码安装包
💻 C
字号:
#include <stdio.h>#include <fcntl.h>#include <sys/stat.h>#include <sys/ioctl.h>#include "tapdisk.h"#include "blktaplib.h"#include "blktapctrl.h"static void make_blktap_dev(char *devname, int major, int minor){	struct stat st; 	if (lstat(devname, &st) != 0) {		/*Need to create device*/		if (mkdir(BLKTAP_DEV_DIR, 0755) == 0)			DPRINTF("Created %s directory\n",BLKTAP_DEV_DIR);		if (mknod(devname, S_IFCHR|0600,			makedev(major, minor)) == 0)			DPRINTF("Created %s device\n",devname);	} else {		DPRINTF("%s device already exists\n",devname); 		/* it already exists, but is it the same major number */		if (((st.st_rdev>>8) & 0xff) != major) {			DPRINTF("%s has old major %d\n",				devname,				(unsigned int)((st.st_rdev >> 8) & 0xff));			/* only try again if we succed in deleting it */			if (!unlink(devname))				make_blktap_dev(devname, major, minor);		}	}}int blktap_interface_create(int ctlfd, int *major, int *minor, blkif_t *blkif){               domid_translate_t tr;        domid_translate_ext_t tr_ext;        int ret;         char *devname;        if (blkif->be_id >= (1<<28)) {                /* new-style backend-id, so use the extended structure */                tr_ext.domid = blkif->domid;                tr_ext.busid = blkif->be_id;                ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF_EXT, &tr_ext);                DPRINTF("Sent domid %d and be_id %d\n", tr_ext.domid,                        tr_ext.busid);        }        else {                /* old-style backend-id; use the old structure */                tr.domid = blkif->domid;                tr.busid = (unsigned short)blkif->be_id;                ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF, tr);                DPRINTF("Sent domid %d and be_id %d\n", tr.domid, tr.busid);        }        if ( (ret <= 0)||(ret > MAX_TAP_DEV) ) {                DPRINTF("Incorrect Dev ID [%d]\n",ret);                return -1;        }        *minor = ret;        *major = ioctl(ctlfd, BLKTAP_IOCTL_MAJOR, ret );        if (*major < 0) {                DPRINTF("Incorrect Major ID [%d]\n",*major);                return -1;        }        if (asprintf(&devname,"%s/%s%d",BLKTAP_DEV_DIR, BLKTAP_DEV_NAME, *minor) == -1)                return -1;        make_blktap_dev(devname,*major,*minor);        DPRINTF("Received device id %d and major %d\n",                *minor, *major);        return 0;}int blktap_interface_open(void){	char *devname;	int ret;	int ctlfd;	/* Attach to blktap0 */	if (asprintf(&devname,"%s/%s0", BLKTAP_DEV_DIR, BLKTAP_DEV_NAME) == -1)		goto open_failed;	ret = xc_find_device_number("blktap0");	if (ret < 0) {		DPRINTF("couldn't find device number for 'blktap0'\n");		goto open_failed;	}	blktap_major = major(ret);	make_blktap_dev(devname,blktap_major, 0);	ctlfd = open(devname, O_RDWR);	if (ctlfd == -1) {		DPRINTF("blktap0 open failed\n");		goto open_failed;	}	return ctlfd;open_failed:	return -1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -