亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? msgq.c

?? USb in User space, a kernel module that use usb layer
?? C
字號(hào):
/* * msgq.c * * Author : Lionetti Salvatore <salvatorelionetti@yahoo.it> * License: GPL * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#include<linux/errno.h>#include"msgq.h"#include"util.h" /* To have memcpy().*//* * Normal behavior is PACKET for write(), STREAM for read(). * Is strange to have PACKET mode on for read(), if this level !know format of data (es bluetooth). * Is sufficient to have a maximum size for msg, 4now we !impose such constraint. * Format of message hosted:  * ______________ * |int | char* | * ~~~~~~~~~~~~~~ * We assumed2work in same space (now kernel). */ int spaceQ(struct dataQ_T *q) {	return q->len-q->curw;}void reseQ(struct dataQ_T *q) {	int l;	for (l=0; l<5; l++) {		q->spar[0]=0;		q->curr[0]=0;	}	q->curw=0;}/* * writeQ(): return number of bytes delivered. * 	>0 some bytes written, * 	0  no bytes written * 	<0 some error occur. * * PACKET mode: write exactly len bytes or nothing. * STREAM mode: write as many bytes we can. */int writeQ(struct dataQ_T *q, char *buf, int len) {	int ritorno=0;	int space=spaceQ(q);	switch (q->dataOrgWrite) {		case PACKET: 			if (len+4<=space)				ritorno=len;			else				q->lostW++;			break;		case STREAM: 			ritorno=len;			if (ritorno>space)				ritorno=space;			break;		default:			ritorno=-EBADMSG;			break;	}	if (ritorno>0) {		if (q->dataOrgWrite==PACKET) {			*(int*)(q->data+q->curw)=ritorno;			q->curw+=sizeof(int);		}				if (q->wrSrc==USER && q->wrDst==KERN) {			if (CopyFromUser(q->data+q->curw,buf,ritorno))				ritorno = -EFAULT;		} else 	if (q->wrSrc==KERN && q->wrDst==USER) {			if (CopyToUser(  q->data+q->curw,buf,ritorno))				ritorno = -EFAULT;		} else {			memcpy(          q->data+q->curw,buf,ritorno);		}		if (ritorno>0)			q->curw+=ritorno;	}			return ritorno;}int availQ(struct dataQ_T* q, int whoR) {	return q->curw - q->curr[whoR];}/*  * readQ(): return number of bytes readed. * * PACKET mode: read a msg | return 0 (-EAGAIN?); * STREAM mode: read as many bytes we can * read at most len bytes. * Do a copy. * * return error only if some assertion fail. */int readQ(struct dataQ_T *q, int whoR, char *buf, int len) {	int ritorno, avail;	int firstFragment, msgL; /* For PACKET only.*/	firstFragment=1; msgL=0;	avail=availQ(q,whoR);	ritorno=0;	if (avail>0 && len>0) {		switch (q->dataOrgWrite/*Read[whoR]*/) {			case PACKET:				/* spare[]!=0 => curr[] ! point to msgLen, but inside msg.*/				if (q->spar[whoR])					firstFragment=0;				ritorno=msgL=*(int*)(&q->data[q->curr[whoR] - q->spar[whoR] - (int)(firstFragment?0:4)]);				if (ritorno<0 || ritorno<q->spar[whoR])					ritorno=-EBADMSG;				else {					ritorno-=q->spar[whoR];					if (ritorno>len)						ritorno=len;					q->curr[whoR]+=firstFragment?4:0; /* skip message len for PACKETwriteMode.*/					q->spar[whoR]+=ritorno;					if (q->spar[whoR]==msgL)						q->spar[whoR]=0;				}				break;			case STREAM:				ritorno=avail;				if (avail>len)					ritorno=len;				break;			default:				ritorno=-EFAULT;				break;		}	}	if (ritorno>0) {		if (q->rdSrc==USER && q->rdDst==KERN) {			if (CopyFromUser(buf,q->data + q->curr[whoR],ritorno))				ritorno = -EFAULT;		} else 	if (q->rdSrc==KERN && q->rdDst==USER) {			if (CopyToUser  (buf,q->data + q->curr[whoR],ritorno))				ritorno = -EFAULT;		} else {			memcpy(		 buf,q->data + q->curr[whoR],ritorno);		}		if (ritorno>0) {			q->curr[whoR]+=ritorno;			if (whoR==0 && q->curr[whoR]==q->curw)				reseQ(q);		}	}	return ritorno;}/*  * read at most len bytes. * Only return pointer. */int readQ_0C(struct dataQ_T *q, int whoR, char **buf, int len) {	return 0;}void initQ(struct dataQ_T *q, char *buf, int len) {	memset(q, 0, sizeof(struct dataQ_T));	q->data=buf;	q->len=len;	/* STREAM is default.*/	q->dataOrgWrite=PACKET;#ifdef __KERNEL__	q->wrSrc = USER; q->wrDst = KERN;	q->rdSrc = KERN; q->rdDst = USER;#else	q->wrSrc = q->wrDst = q->rdSrc = q->rdDst = USER;#endif       	}void copyQ(struct dataQ_T *q, struct dataQ_T *q2copy) {	memcpy(q, q2copy, sizeof(struct dataQ_T));}static char* getAddrSpaceStr(enum AddrSpaceT as) {	return as==USER?"USER":"KERN";}int dumpQ(struct dataQ_T *q, char* buf, int len) {	int ritorno=0;	char* curr;	int nOfMsg=0;	int l=0;	Snprintf("\n(data=%p len=%d curw=%d curr={%d,%d,%d,%d,%d}",q->data,q->len,q->curw,q->curr[0],q->curr[1],q->curr[2],q->curr[3],q->curr[4]);	Snprintf(" spar={%d,%d,%d,%d,%d})",q->spar[0],q->spar[1],q->spar[2],q->spar[3],q->spar[4]);	Snprintf("\nDumping dataQ(%d bytes) lostR=%d, lostW=%d",q->curw-q->curr[0], q->lostR, q->lostW);	Snprintf("wr(%s->%s) rd(%s->%s).",getAddrSpaceStr(q->wrSrc),getAddrSpaceStr(q->wrDst),getAddrSpaceStr(q->rdSrc),getAddrSpaceStr(q->rdDst));	for (curr=q->data; (curr<q->data+q->curw) && ritorno>=0;) { 		int msgL;		switch (q->dataOrgWrite) {			case STREAM:				msgL=q->curw-q->curr[0];				break;			case PACKET:				msgL=*((int*)curr);				curr+=sizeof(int);				break;			default:				msgL=0;				ritorno=-EFAULT;				break;						}		if (ritorno>=0) {			int n;			Snprintf("\n   %d) len=%d data@%p=",nOfMsg++,msgL,curr);			for (n=0; n<msgL; n++)				Snprintf("%02x ",*((unsigned char*)curr++));		}	}	if (ritorno<0)		Snprintf(" DATAQ_T: assert failed, object@0x%x overwritten!!!\n",(unsigned int)q);	return ritorno;}void testQ(void) {	char des[4000];	char data[10];	int  desL=4000;	int  dataL=10;	int  l;	for (l=0; l<dataL; l++)		data[l]=l;	{		struct dataQ_T pq;		char data2[30];		int  data2L=30;		int  rit=0;		initQ(&pq,data2,data2L);		dumpQ(&pq,des,desL); PRINT("\n\nINIT:%s\n",des);		rit=writeQ(&pq,data,dataL);		dumpQ(&pq,des,desL); PRINT("\n\nWRITE(%d/10):%s",rit,des);		rit=writeQ(&pq,data,dataL);		dumpQ(&pq,des,desL); PRINT("\n\nWRITE(%d/10):%s",rit,des);		rit=readQ(&pq,0,data,3);		dumpQ(&pq,des,desL); PRINT("\n\nREAD(%d/3):%s",rit,des);		PRINT("\nbytesReaded:");		for (l=0; l<rit; l++)			PRINT("%02x",data[l]);		rit=readQ(&pq,0,data,4);		dumpQ(&pq,des,desL); PRINT("\n\nREAD(%d/4):%s",rit,des);		PRINT("\nbytesReaded:");		for (l=0; l<rit; l++)			PRINT("%02x",data[l]);		rit=readQ(&pq,0,data,10);		dumpQ(&pq,des,desL); PRINT("\n\nREAD(%d/10):%s",rit,des);		PRINT("\nbytesReaded:");		for (l=0; l<rit; l++)			PRINT("%02x",data[l]);		rit=readQ(&pq,0,data,0);		dumpQ(&pq,des,desL); PRINT("\n\nREAD(%d/0):%s",rit,des);		PRINT("\nbytesReaded:");		for (l=0; l<rit; l++)			PRINT("%02x",data[l]);		rit=readQ(&pq,0,data,9);		dumpQ(&pq,des,desL); PRINT("\n\nREAD(%d/9):%s",rit,des);		PRINT("\nbytesReaded:");		for (l=0; l<rit; l++)			PRINT("%02x",data[l]);		rit=readQ(&pq,0,data,9);		dumpQ(&pq,des,desL); PRINT("\n\nREAD(%d/9):%s",rit,des);		PRINT("\nbytesReaded:");		for (l=0; l<rit; l++)			PRINT("%02x",data[l]);		rit=readQ(&pq,0,data,2);		dumpQ(&pq,des,desL); PRINT("\n\nREAD(%d/2):%s",rit,des);		PRINT("\nbytesReaded:");		for (l=0; l<rit; l++)			PRINT("%02x",data[l]);		reseQ(&pq);		dumpQ(&pq,des,desL); PRINT("\n\nRESET:%s",des);	}}#ifdef PROVAvoid consuma(struct dataQ_T* dq, int numbytes) {	char des[4000];	int ret=0;	static int valueVer=0;	int l;	printf("\nReading %d bytes...",numbytes);	if (numbytes>0)	       ret=readQ(dq,0,des,numbytes);	printf("ret(%d)",ret);		for (l=0; l<ret; l++)		if (valueVer++!=des[l])			printf("Expected %02x, got %02x!!!",valueVer-1,des[l]);	dumpQ(dq,des,4000); printf("%s\n",des);}void produci(struct dataQ_T* dq, int numbytes) {	char des[4000];	int ret=0;	static int valueGen=0;	int l;	for (l=0; l<numbytes; l++)		des[l]=valueGen++;	if (numbytes)		ret=writeQ(dq,des,numbytes);	printf("\nWriting %d bytes...ret(%d)",numbytes,ret);	dumpQ(dq,des,4000); printf("%s\n",des);}int main(int argc, char** argv) {	struct dataQ_T dq;	char str[20];	initQ(&dq,malloc(30),30);	if (1) {		produci(&dq,12);		produci(&dq,13);		produci(&dq,12);		produci(&dq,13);		consuma(&dq,3072);		consuma(&dq,3072);		consuma(&dq,3072);		consuma(&dq,3072);	} else {		consuma(&dq,1024);		produci(&dq,14);		consuma(&dq,1024);		produci(&dq,14);		produci(&dq,14);		consuma(&dq,2);		consuma(&dq,12);		produci(&dq,14);		consuma(&dq,14);		consuma(&dq,20);		produci(&dq,4);		produci(&dq,4);		produci(&dq,4);		consuma(&dq,4);		consuma(&dq,4);		consuma(&dq,4);	}	return 0;}#endif

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91行情网站电视在线观看高清版| 成人激情综合网站| 亚洲国产激情av| 欧美日韩激情一区二区| 国产成人精品午夜视频免费| 亚洲一区在线观看免费 | 国产一区不卡在线| 亚洲美腿欧美偷拍| 久久久久一区二区三区四区| 欧美日韩国产首页| 91麻豆.com| 欧美写真视频网站| 国产成人福利片| 久久精品国产精品亚洲红杏 | 2023国产精品| 欧美精品免费视频| 91美女蜜桃在线| 成人免费观看视频| 激情久久久久久久久久久久久久久久| 亚洲一区二区影院| 亚洲视频你懂的| 亚洲国产精品成人综合| 精品久久久久一区| 欧美一区二区福利视频| 欧美四级电影网| 91福利在线播放| av在线不卡免费看| 成人精品小蝌蚪| 国产高清久久久久| 国产精品一区在线观看乱码| 裸体一区二区三区| 日韩经典一区二区| 天堂久久一区二区三区| 亚洲午夜久久久久中文字幕久| 亚洲婷婷国产精品电影人久久| 国产欧美日韩在线看| 久久综合九色综合久久久精品综合 | 欧美日韩精品一区二区三区蜜桃 | 91成人免费在线| 91视视频在线观看入口直接观看www| 国产99久久久国产精品潘金网站| 国产在线精品一区二区夜色| 久久97超碰色| 国产一区二区久久| 国产激情视频一区二区三区欧美| 国产一区视频网站| 丁香激情综合国产| 97久久精品人人澡人人爽| 成人国产精品免费观看| 成人福利视频在线| 91久久精品一区二区三| 欧美亚洲高清一区| 91精品国产色综合久久不卡电影 | 成人午夜视频网站| 99久久亚洲一区二区三区青草| av午夜精品一区二区三区| 欧美大片拔萝卜| 日韩免费电影网站| 久久精品视频在线免费观看| 欧美国产一区在线| 亚洲裸体在线观看| 亚洲成av人综合在线观看| 人人精品人人爱| 国模娜娜一区二区三区| 丁香婷婷综合五月| 欧美在线观看一二区| 欧美一区二区三区在线观看| 久久综合久久综合久久综合| 国产欧美在线观看一区| 一区二区三区中文字幕在线观看| 丝袜美腿成人在线| 国产成人免费av在线| 色系网站成人免费| 日韩亚洲欧美成人一区| 中文字幕久久午夜不卡| 亚洲线精品一区二区三区| 精品在线观看视频| 99视频精品全部免费在线| 欧美日韩国产一级片| 久久精品人人爽人人爽| 一区二区三区视频在线观看| 久久精品国产亚洲a| va亚洲va日韩不卡在线观看| 8v天堂国产在线一区二区| 国产午夜亚洲精品不卡| 亚洲电影一区二区三区| 国产.欧美.日韩| 欧美猛男男办公室激情| 中文在线资源观看网站视频免费不卡 | 国产日韩v精品一区二区| 亚洲国产另类av| 国产精品1区二区.| 欧美精品在线一区二区三区| 欧美国产成人精品| 奇米影视7777精品一区二区| 99国产精品久| 精品欧美黑人一区二区三区| 亚洲美女区一区| 成人毛片老司机大片| 日韩欧美国产综合一区 | 日韩免费观看高清完整版| 亚洲日本成人在线观看| 精品一区二区久久久| 欧洲亚洲国产日韩| 国产精品天美传媒| 精品制服美女久久| 欧美精品久久99久久在免费线| 中文字幕第一区第二区| 久久不见久久见免费视频7 | 黄色成人免费在线| 欧美三级日韩在线| 亚洲人午夜精品天堂一二香蕉| 国产一区二区在线免费观看| 欧美喷潮久久久xxxxx| 亚洲欧美日韩一区二区| 国产99久久久精品| 久久久综合九色合综国产精品| 日本v片在线高清不卡在线观看| 91国在线观看| 亚洲欧洲国产日韩| 成人午夜伦理影院| 国产午夜精品福利| 韩国欧美一区二区| 欧美不卡一区二区三区四区| 日韩国产欧美三级| 欧美日本一区二区| 亚洲国产精品嫩草影院| 在线观看91视频| 亚洲综合色自拍一区| 色婷婷激情久久| 中文字幕亚洲在| 99r国产精品| 亚洲天堂福利av| 色综合一个色综合亚洲| 欧美主播一区二区三区| 亚洲欧美日韩系列| 91在线小视频| 尤物视频一区二区| 欧美亚洲国产一卡| 日韩精品成人一区二区在线| 91精品一区二区三区久久久久久| 午夜国产不卡在线观看视频| 欧美日韩国产另类不卡| 首页国产欧美日韩丝袜| 日韩一区二区免费电影| 激情图片小说一区| 国产亚洲一二三区| 99精品热视频| 艳妇臀荡乳欲伦亚洲一区| 欧美日本国产视频| 91在线视频免费91| 亚洲一区在线观看视频| 91精品国产日韩91久久久久久| 青青草伊人久久| 久久久久久电影| 成+人+亚洲+综合天堂| 一区二区三区国产豹纹内裤在线 | 欧美日韩电影一区| 男女男精品视频| 国产亚洲美州欧州综合国| a美女胸又www黄视频久久| 一区二区免费看| 欧美一级一区二区| 粉嫩嫩av羞羞动漫久久久| 亚洲美腿欧美偷拍| 欧美一级久久久久久久大片| 国产麻豆视频一区| 亚洲日本va在线观看| 91精品国产黑色紧身裤美女| 国产精品亚洲а∨天堂免在线| 亚洲欧洲精品一区二区三区| 欧美日韩国产综合草草| 国产一区二区网址| 一区二区三区在线高清| 日韩欧美激情在线| 色综合 综合色| 久久99久久久欧美国产| 成人欧美一区二区三区白人| 欧美精品在欧美一区二区少妇| 国产精选一区二区三区| 怡红院av一区二区三区| 精品日韩一区二区三区| 91美女在线看| 精品一区二区三区免费观看| 中文字幕一区av| 精品精品国产高清a毛片牛牛| 99久久久免费精品国产一区二区| 青青草国产成人99久久| 中文字幕一区二区视频| 日韩欧美国产一区在线观看| 色婷婷av一区二区三区之一色屋| 老司机免费视频一区二区| 亚洲美女区一区| 久久精品亚洲一区二区三区浴池| 欧美色涩在线第一页| 成人国产精品视频| 麻豆国产91在线播放| 亚洲高清视频在线| 国产精品免费人成网站| 欧美电视剧在线观看完整版|