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

📄 utils.c

📁 Realize the usbip function, which could be simulate usb port through net
💻 C
字号:
#include "utils.h"int read_integer(char *path){	char buff[100];	int fd;	int ret = 0;	bzero(buff, sizeof(buff));	fd = open(path, O_RDONLY);	if (fd < 0)		return -1;	ret = read(fd, buff, sizeof(buff));	if (ret < 0) {		close(fd);		return -1;	}	sscanf(buff, "%d", &ret);	close(fd);	return ret;}int read_string(char *path, char *string, size_t len){	int fd;	int ret = 0;	char  *p;	bzero(string, len);	fd = open(path, O_RDONLY);	if (fd < 0) {		string = NULL;		return -1;	}	ret = read(fd, string, len-1);	if (ret < 0) {		string = NULL;		close(fd);		return -1;	}	p = strchr(string, '\n');	*p = '\0';	close(fd);	return 0;}int write_integer(char *path, int value){	int fd;	int ret;	char buff[100];	snprintf(buff, sizeof(buff), "%d", value);	fd = open(path, O_WRONLY);	if (fd < 0)		return -1;	ret = write(fd, buff, strlen(buff));	if (ret < 0) {		close(fd);		return -1;	}	close(fd);	return 0;}int read_bConfigurationValue(char *busid){	char path[PATH_MAX];	snprintf(path, PATH_MAX, "/sys/bus/usb/devices/%s/bConfigurationValue", busid);	return read_integer(path);}int write_bConfigurationValue(char *busid, int config){	char path[PATH_MAX];	snprintf(path, PATH_MAX, "/sys/bus/usb/devices/%s/bConfigurationValue", busid);	return write_integer(path, config);}int read_bNumInterfaces(char *busid){	char path[PATH_MAX];	snprintf(path, PATH_MAX, "/sys/bus/usb/devices/%s/bNumInterfaces", busid);	return read_integer(path);}int read_bDeviceClass(char *busid){	char path[PATH_MAX];	snprintf(path, PATH_MAX, "/sys/bus/usb/devices/%s/bDeviceClass", busid);	return read_integer(path);}int getdriver(char *busid, int conf, int infnum, char *driver, size_t len){	char path[PATH_MAX];	char linkto[PATH_MAX];	int ret;	snprintf(path, PATH_MAX, "/sys/bus/usb/devices/%s:%d.%d/driver", busid, conf, infnum);	/* readlink does not add NULL */	bzero(linkto, sizeof(linkto));	ret = readlink(path, linkto, sizeof(linkto)-1);	if (ret < 0) {		strncpy(driver, "none", len);		return -1;	} else {		strncpy(driver, basename(linkto), len);		return 0;	}}int getdevicename(char *busid, char *name, size_t len){	char path[PATH_MAX];	char idProduct[10], idVendor[10];	snprintf(path, PATH_MAX, "/sys/bus/usb/devices/%s/idVendor", busid);	read_string(path, idVendor, sizeof(idVendor));	snprintf(path, PATH_MAX, "/sys/bus/usb/devices/%s/idProduct", busid);	read_string(path, idProduct, sizeof(idProduct));	if (!idVendor[0] || !idProduct[0])		return -1;	snprintf(name, len, "%s:%s", idVendor, idProduct);	return 0;}#define MAXLINE 100/* if this cannot read a whole line, return -1 */int readline(int sockfd, char *buff, int bufflen){	int ret;	char c;	int index = 0;	while (index < bufflen) {		ret = read(sockfd, &c, sizeof(c));		if (ret < 0 && errno == EINTR)			continue;		if (ret <= 0) {			return -1;		}		buff[index] = c;		if ( index > 0 && buff[index-1] == '\r'  && buff[index] == '\n') {			/* end of line */			buff[index-1] = '\0';	/* get rid of delimitor */			return index;		} else			index++;	}	return -1;}#if 0int writeline(int sockfd, char *str, int strlen){	int ret;	int index = 0;	int len;	char buff[MAXLINE];	if (strlen + 3 > MAXLINE)		return -1;	strncpy(buff, str, strlen);	buff[strlen+1] = '\r';	buff[strlen+2] = '\n';	buff[strlen+3] = '\0';	len = strlen + 3;	while (len > 0) {		ret = write(sockfd, buff+index, len);		if (ret <= 0) {			return -1;		}		len -= ret;		index += ret;	}	return index;}#endifint writeline(int sockfd, char *str, int strlen){	int ret;	int index = 0;	int len;	char buff[MAXLINE];	len = strnlen(str, strlen);	if (strlen + 2 > MAXLINE)		return -1;	memcpy(buff, str, strlen);	buff[strlen] = '\r';	buff[strlen+1] = '\n';		/* strlen+1 <= MAXLINE-1 */	len = strlen + 2;	while (len > 0) {		ret = write(sockfd, buff+index, len);		if (ret < 0 && errno == EINTR)			continue;		if (ret <= 0) {			return -1;		}		len -= ret;		index += ret;	}	return index;}

⌨️ 快捷键说明

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