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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? log.c

?? Minix3.11的源碼。[MINIX 3是一個為高可靠性應用而設計的自由且簡潔的類UNIX系統。]
?? C
字號:
/* This file contains a driver for: *     /dev/klog	- system log device * * Changes: *   21 July 2005   - Support for diagnostic messages (Jorrit N. Herder) *    7 July 2005   - Created (Ben Gras) */#include "log.h"#include <sys/time.h>#include <sys/select.h>#include "../../kernel/const.h"#include "../../kernel/type.h"#define LOG_DEBUG		0	/* enable/ disable debugging */#define NR_DEVS            	1	/* number of minor devices */#define MINOR_KLOG		0	/* /dev/klog */#define LOGINC(n, i)	do { (n) = (((n) + (i)) % LOG_SIZE); } while(0)PUBLIC struct logdevice logdevices[NR_DEVS];PRIVATE struct device log_geom[NR_DEVS];  	/* base and size of devices */PRIVATE int log_device = -1;	 		/* current device */FORWARD _PROTOTYPE( char *log_name, (void) );FORWARD _PROTOTYPE( struct device *log_prepare, (int device) );FORWARD _PROTOTYPE( int log_transfer, (int proc_nr, int opcode, off_t position,					iovec_t *iov, unsigned nr_req) );FORWARD _PROTOTYPE( int log_do_open, (struct driver *dp, message *m_ptr) );FORWARD _PROTOTYPE( int log_cancel, (struct driver *dp, message *m_ptr) );FORWARD _PROTOTYPE( int log_select, (struct driver *dp, message *m_ptr) );FORWARD _PROTOTYPE( void log_signal, (struct driver *dp, message *m_ptr) );FORWARD _PROTOTYPE( int log_other, (struct driver *dp, message *m_ptr) );FORWARD _PROTOTYPE( void log_geometry, (struct partition *entry) );FORWARD _PROTOTYPE( int subread, (struct logdevice *log, int count, int proc_nr, vir_bytes user_vir) );/* Entry points to this driver. */PRIVATE struct driver log_dtab = {  log_name,	/* current device's name */  log_do_open,	/* open or mount */  do_nop,	/* nothing on a close */  do_nop,	/* ioctl nop */  log_prepare,	/* prepare for I/O on a given minor device */  log_transfer,	/* do the I/O */  nop_cleanup,	/* no need to clean up */  log_geometry,	/* geometry */  log_signal,	/* handle system signal */  nop_alarm, 	/* no alarm */  log_cancel,	/* CANCEL request */  log_select,	/* DEV_SELECT request */  log_other,	/* Unrecognized messages */  NULL		/* HW int */};extern int device_caller;/*===========================================================================* *				   main 				     * *===========================================================================*/PUBLIC int main(void){  int i;  for(i = 0; i < NR_DEVS; i++) {  	log_geom[i].dv_size = cvul64(LOG_SIZE); 	log_geom[i].dv_base = cvul64((long)logdevices[i].log_buffer); 	logdevices[i].log_size = logdevices[i].log_read =	 	logdevices[i].log_write =	 	logdevices[i].log_select_alerted =	 	logdevices[i].log_selected =	 	logdevices[i].log_select_ready_ops = 0; 	logdevices[i].log_proc_nr = 0; 	logdevices[i].log_revive_alerted = 0;  }  driver_task(&log_dtab);  return(OK);}/*===========================================================================* *				 log_name					     * *===========================================================================*/PRIVATE char *log_name(){/* Return a name for the current device. */  static char name[] = "log";  return name;  }/*===========================================================================* *				log_prepare				     * *===========================================================================*/PRIVATE struct device *log_prepare(device)int device;{/* Prepare for I/O on a device: check if the minor device number is ok. */  if (device < 0 || device >= NR_DEVS) return(NIL_DEV);  log_device = device;  return(&log_geom[device]);}/*===========================================================================* *				subwrite					     * *===========================================================================*/PRIVATE intsubwrite(struct logdevice *log, int count, int proc_nr, vir_bytes user_vir){	char *buf;	int r;	if (log->log_write + count > LOG_SIZE)		count = LOG_SIZE - log->log_write;	buf = log->log_buffer + log->log_write;	if(proc_nr == SELF) {		memcpy(buf, (char *) user_vir, count);	}	else {		if((r=sys_vircopy(proc_nr,D,user_vir, SELF,D,(int)buf, count)) != OK)			return r;	}	LOGINC(log->log_write, count);	log->log_size += count;        if(log->log_size > LOG_SIZE) {        	int overflow;        	overflow = log->log_size - LOG_SIZE;        	log->log_size -= overflow;        	LOGINC(log->log_read, overflow);        }        if(log->log_size > 0 && log->log_proc_nr && !log->log_revive_alerted) {        	/* Someone who was suspended on read can now        	 * be revived.        	 */    		log->log_status = subread(log, log->log_iosize,    			log->log_proc_nr, log->log_user_vir);    		notify(log->log_source);     		log->log_revive_alerted = 1; 	} 	if(log->log_size > 0)		log->log_select_ready_ops |= SEL_RD;	if(log->log_size > 0 && log->log_selected &&	  !(log->log_select_alerted)) {  		/* Someone(s) who was/were select()ing can now  		 * be awoken. If there was a blocking read (above),  		 * this can only happen if the blocking read didn't  		 * swallow all the data (log_size > 0).  		 */  		if(log->log_selected & SEL_RD) {    			notify(log->log_select_proc);    			log->log_select_alerted = 1;#if LOG_DEBUG			printf("log notified %d\n", log->log_select_proc);#endif  		}  	}        return count;}/*===========================================================================* *				log_append				* *===========================================================================*/PUBLIC voidlog_append(char *buf, int count){	int w = 0, skip = 0;	if(count < 1) return;	if(count > LOG_SIZE) skip = count - LOG_SIZE;	count -= skip;	buf += skip;	w = subwrite(&logdevices[0], count, SELF, (vir_bytes) buf);	if(w > 0 && w < count)		subwrite(&logdevices[0], count-w, SELF, (vir_bytes) buf+w);	return;}/*===========================================================================* *				subread					     * *===========================================================================*/PRIVATE intsubread(struct logdevice *log, int count, int proc_nr, vir_bytes user_vir){	char *buf;	int r;    	if (count > log->log_size)    		count = log->log_size;        if (log->log_read + count > LOG_SIZE)        	count = LOG_SIZE - log->log_read;    	buf = log->log_buffer + log->log_read;        if((r=sys_vircopy(SELF,D,(int)buf,proc_nr,D,user_vir, count)) != OK)        	return r;  	LOGINC(log->log_read, count);        log->log_size -= count;        return count;}/*===========================================================================* *				log_transfer				     * *===========================================================================*/PRIVATE int log_transfer(proc_nr, opcode, position, iov, nr_req)int proc_nr;			/* process doing the request */int opcode;			/* DEV_GATHER or DEV_SCATTER */off_t position;			/* offset on device to read or write */iovec_t *iov;			/* pointer to read or write request vector */unsigned nr_req;		/* length of request vector */{/* Read or write one the driver's minor devices. */  unsigned count;  vir_bytes user_vir;  struct device *dv;  unsigned long dv_size;  int accumulated_read = 0;  struct logdevice *log;  static int f;  if(log_device < 0 || log_device >= NR_DEVS)  	return EIO;  /* Get minor device number and check for /dev/null. */  dv = &log_geom[log_device];  dv_size = cv64ul(dv->dv_size);  log = &logdevices[log_device];  while (nr_req > 0) {	/* How much to transfer and where to / from. */	count = iov->iov_size;	user_vir = iov->iov_addr;	switch (log_device) {	case MINOR_KLOG:	    if (opcode == DEV_GATHER) {	    	if (log->log_proc_nr || count < 1) {	    		/* There's already someone hanging to read, or	    		 * no real I/O requested.	    		 */	    		return(OK);	    	}	    	if (!log->log_size) {	    		if(accumulated_read)	    			return OK;	    		/* No data available; let caller block. */	    		log->log_proc_nr = proc_nr;	    		log->log_iosize = count;	    		log->log_user_vir = user_vir;	    		log->log_revive_alerted = 0;			/* Device_caller is a global in drivers library. */	    		log->log_source = device_caller;#if LOG_DEBUG	    		printf("blocked %d (%d)\n", 	    			log->log_source, log->log_proc_nr);#endif	    		return(SUSPEND);	    	}	    	count = subread(log, count, proc_nr, user_vir);	    	if(count < 0) {	    		return count;	    	}	    	accumulated_read += count;	    } else {	    	count = subwrite(log, count, proc_nr, user_vir);	    	if(count < 0)	    		return count;	    }	    break;	/* Unknown (illegal) minor device. */	default:	    return(EINVAL);	}	/* Book the number of bytes transferred. */	iov->iov_addr += count;  	if ((iov->iov_size -= count) == 0) { iov++; nr_req--; }  }  return(OK);}/*============================================================================* *				log_do_open				      * *============================================================================*/PRIVATE int log_do_open(dp, m_ptr)struct driver *dp;message *m_ptr;{  if (log_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO);  return(OK);}/*============================================================================* *				log_geometry				      * *============================================================================*/PRIVATE void log_geometry(entry)struct partition *entry;{  /* take a page from the fake memory device geometry */  entry->heads = 64;  entry->sectors = 32;  entry->cylinders = div64u(log_geom[log_device].dv_size, SECTOR_SIZE) /  	(entry->heads * entry->sectors);}/*============================================================================* *				log_cancel				      * *============================================================================*/PRIVATE int log_cancel(dp, m_ptr)struct driver *dp;message *m_ptr;{  int d;  d = m_ptr->TTY_LINE;  if(d < 0 || d >= NR_DEVS)  	return EINVAL;  logdevices[d].log_proc_nr = 0;  logdevices[d].log_revive_alerted = 0;  return(OK);}/*============================================================================* *				do_status				      * *============================================================================*/PRIVATE void do_status(message *m_ptr){	int d; 	message m;	/* Caller has requested pending status information, which currently	 * can be pending available select()s, or REVIVE events. One message	 * is returned for every event, or DEV_NO_STATUS if no (more) events	 * are to be returned.	 */	for(d = 0; d < NR_DEVS; d++) {		/* Check for revive callback. */		if(logdevices[d].log_proc_nr && logdevices[d].log_revive_alerted		   && logdevices[d].log_source == m_ptr->m_source) {			m.m_type = DEV_REVIVE;			m.REP_PROC_NR = logdevices[d].log_proc_nr;			m.REP_STATUS  = logdevices[d].log_status;  			send(m_ptr->m_source, &m);			logdevices[d].log_proc_nr = 0;			logdevices[d].log_revive_alerted = 0;#if LOG_DEBUG    		printf("revived %d with %d bytes\n", 			m.REP_PROC_NR, m.REP_STATUS);#endif			return;		}		/* Check for select callback. */		if(logdevices[d].log_selected && logdevices[d].log_select_proc == m_ptr->m_source 			&& logdevices[d].log_select_alerted) {			m.m_type = DEV_IO_READY;			m.DEV_SEL_OPS = logdevices[d].log_select_ready_ops;			m.DEV_MINOR   = d;#if LOG_DEBUG    		printf("select sending sent\n");#endif  			send(m_ptr->m_source, &m);			logdevices[d].log_selected &= ~logdevices[d].log_select_ready_ops;			logdevices[d].log_select_alerted = 0;#if LOG_DEBUG    		printf("select send sent\n");#endif			return;		}	}	/* No event found. */	m.m_type = DEV_NO_STATUS;  	send(m_ptr->m_source, &m);	return;}/*============================================================================* *				log_signal				      * *============================================================================*/PRIVATE void log_signal(dp, m_ptr)struct driver *dp;message *m_ptr;{  sigset_t sigset = m_ptr->NOTIFY_ARG;  if (sigismember(&sigset, SIGKMESS)) {	do_new_kmess(m_ptr);  }	}	/*============================================================================* *				log_other				      * *============================================================================*/PRIVATE int log_other(dp, m_ptr)struct driver *dp;message *m_ptr;{	int r;	/* This function gets messages that the generic driver doesn't	 * understand.	 */	switch(m_ptr->m_type) {	case DIAGNOSTICS: {		r = do_diagnostics(m_ptr);		break;	}	case DEV_STATUS: {		do_status(m_ptr);		r = EDONTREPLY;		break;	}	case NOTIFY_FROM(TTY_PROC_NR):		do_new_kmess(m_ptr);		r = EDONTREPLY;		break;	default:		r = EINVAL;		break;	}	return r;}/*============================================================================* *				log_select				      * *============================================================================*/PRIVATE int log_select(dp, m_ptr)struct driver *dp;message *m_ptr;{  int d, ready_ops = 0, ops = 0;  d = m_ptr->TTY_LINE;  if(d < 0 || d >= NR_DEVS) {#if LOG_DEBUG  	printf("line %d? EINVAL\n", d);#endif  	return EINVAL;  }  ops = m_ptr->PROC_NR & (SEL_RD|SEL_WR|SEL_ERR);  	/* Read blocks when there is no log. */  if((m_ptr->PROC_NR & SEL_RD) && logdevices[d].log_size > 0) {#if LOG_DEBUG  	printf("log can read; size %d\n", logdevices[d].log_size);#endif  	ready_ops |= SEL_RD; /* writes never block */ }  	/* Write never blocks. */  if(m_ptr->PROC_NR & SEL_WR) ready_ops |= SEL_WR;	/* Enable select calback if no operations were	 * ready to go, but operations were requested,	 * and notify was enabled.	 */  if((m_ptr->PROC_NR & SEL_NOTIFY) && ops && !ready_ops) {  	logdevices[d].log_selected |= ops;  	logdevices[d].log_select_proc = m_ptr->m_source;#if LOG_DEBUG  	printf("log setting selector.\n");#endif  }#if LOG_DEBUG  printf("log returning ops %d\n", ready_ops);#endif  return(ready_ops);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久影院| 国产精品久久久久久妇女6080| 精品日韩在线一区| 国产精品久久久久一区二区三区共| 天天综合网天天综合色| aaa亚洲精品一二三区| 日韩一区二区麻豆国产| 亚洲亚洲人成综合网络| 国产91精品入口| 精品入口麻豆88视频| 国产一区二区三区不卡在线观看 | 成人在线一区二区三区| 91精品国产一区二区人妖| 亚洲欧美一区二区久久| 国产成a人无v码亚洲福利| 日韩女同互慰一区二区| 亚洲成精国产精品女| 色国产综合视频| 中文字幕在线不卡视频| 大胆亚洲人体视频| 亚洲国产精品99久久久久久久久 | 欧美xxxx老人做受| 日韩二区三区在线观看| 欧美日韩一区不卡| 亚洲电影视频在线| 欧美在线播放高清精品| 一区二区三区自拍| 在线视频一区二区三| 亚洲婷婷国产精品电影人久久| 成人免费高清在线| 国产精品妹子av| 成人av中文字幕| 国产精品久久久久精k8| 99热精品国产| 亚洲欧美日韩一区| 在线免费一区三区| 午夜精品久久久久久久久久久| 欧美日韩在线播放三区四区| 国产精品一区二区在线看| 久久综合色天天久久综合图片| 久久99精品国产91久久来源| 2021国产精品久久精品| 国产成人av电影在线播放| 欧美国产精品一区| 91小视频免费看| 亚洲国产成人porn| 日韩欧美一区二区免费| 国产剧情一区在线| 亚洲欧美日韩国产另类专区| 欧美亚洲高清一区二区三区不卡| 天天做天天摸天天爽国产一区 | 日本高清免费不卡视频| 亚洲国产精品久久艾草纯爱| 欧美一级理论性理论a| 国产精品一区二区三区网站| 亚洲品质自拍视频| 91精品国产品国语在线不卡| 国产一区二区三区免费播放| 中文字幕欧美国产| 欧美日韩和欧美的一区二区| 久久99国产乱子伦精品免费| 国产精品日韩成人| 中文字幕永久在线不卡| 欧美亚洲尤物久久| 国产在线国偷精品免费看| 自拍偷自拍亚洲精品播放| 欧美酷刑日本凌虐凌虐| 国产激情91久久精品导航| 一卡二卡三卡日韩欧美| 精品久久久久香蕉网| 色哟哟一区二区| 狠狠色丁香久久婷婷综合丁香| 中文字幕日韩一区| 欧美不卡一区二区三区| 色综合夜色一区| 国产在线视频一区二区三区| 一区二区三区中文字幕电影| 久久久精品黄色| 884aa四虎影成人精品一区| 不卡一区在线观看| 裸体在线国模精品偷拍| 亚洲精品v日韩精品| 欧美激情一区在线| 日韩一区二区三区在线观看| 色综合久久久久久久| 国产精品一区二区三区乱码| 天天爽夜夜爽夜夜爽精品视频| 国产精品国产三级国产aⅴ中文| 欧美一级久久久| 欧美日韩在线播放| 色综合久久中文综合久久牛| 国产乱码精品一品二品| 美女一区二区三区| 五月婷婷久久综合| 亚洲综合成人在线| 亚洲色欲色欲www| 欧美高清在线精品一区| 欧美精品一区二区三区久久久| 欧美影院一区二区| 99re这里只有精品6| 粉嫩av一区二区三区在线播放 | 91网站最新网址| 国产成人免费高清| 国产精品一区在线观看你懂的| 日本美女一区二区三区视频| 亚洲一二三区视频在线观看| 亚洲蜜臀av乱码久久精品蜜桃| 欧美国产精品v| 国产农村妇女精品| 国产亚洲美州欧州综合国| 26uuu另类欧美亚洲曰本| 日韩三级精品电影久久久 | 日韩影视精彩在线| 亚洲福中文字幕伊人影院| 亚洲一区二区五区| 国产伦精品一区二区三区免费迷 | 亚洲免费视频成人| 亚洲视频小说图片| 亚洲已满18点击进入久久| 亚洲一区免费在线观看| 香蕉久久夜色精品国产使用方法| 一区二区国产视频| 亚洲丰满少妇videoshd| 日本一道高清亚洲日美韩| 麻豆精品久久久| 国产呦萝稀缺另类资源| 不卡视频免费播放| 色欧美88888久久久久久影院| 欧美伊人精品成人久久综合97| 欧美精品一卡两卡| 精品不卡在线视频| 国产精品久久久久久久久免费樱桃| 亚洲色大成网站www久久九九| 亚洲一区二区三区在线看| 日本最新不卡在线| 丰满少妇久久久久久久| 色婷婷av一区二区三区大白胸| 欧美精品乱人伦久久久久久| 欧美一级高清大全免费观看| 国产欧美综合色| 一区二区三区精品久久久| 六月丁香婷婷久久| www.亚洲人| 91精品国产综合久久蜜臀| 精品粉嫩超白一线天av| 国产精品综合一区二区三区| 99精品欧美一区二区三区小说 | 精品国产免费人成电影在线观看四季 | 亚洲欧美电影一区二区| 婷婷六月综合亚洲| 国产成人综合视频| 在线精品视频一区二区| 精品免费99久久| 亚洲一区在线电影| 国产精品资源网| 欧美嫩在线观看| 国产精品私人自拍| 免费观看在线色综合| 不卡免费追剧大全电视剧网站| 欧美福利电影网| 一区精品在线播放| 国内精品伊人久久久久av一坑| 色素色在线综合| 久久久91精品国产一区二区精品 | 国产精品美日韩| 日本va欧美va精品| 日本道精品一区二区三区| 久久毛片高清国产| av在线不卡网| 26uuu亚洲婷婷狠狠天堂| 亚洲成a天堂v人片| 色综合激情久久| 国产视频一区二区三区在线观看| 性欧美疯狂xxxxbbbb| 97se亚洲国产综合自在线| 久久综合九色欧美综合狠狠| 亚洲成人先锋电影| 色综合久久综合网97色综合 | 91精品国产色综合久久不卡蜜臀| 中文字幕一区二区三区四区不卡 | 本田岬高潮一区二区三区| 精品精品欲导航| 日产国产欧美视频一区精品| 日本高清成人免费播放| 中文字幕一区日韩精品欧美| 国产91高潮流白浆在线麻豆| 日韩欧美国产一区在线观看| 日日噜噜夜夜狠狠视频欧美人| 欧美在线999| 悠悠色在线精品| 在线观看区一区二| 亚洲黄色录像片| 色成年激情久久综合| 一区二区在线电影| 在线精品视频小说1| 一区二区激情视频| 欧美日韩视频一区二区| 亚洲国产精品影院| 91精品中文字幕一区二区三区 | 亚洲乱码国产乱码精品精98午夜|