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

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

?? tty.c

?? 優龍2410linux2.6.8內核源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb){	struct rfcomm_dev *dev = dlc->owner;	struct tty_struct *tty;       	if (!dev || !(tty = dev->tty)) {		kfree_skb(skb);		return;	}	BT_DBG("dlc %p tty %p len %d", dlc, tty, skb->len);	if (test_bit(TTY_DONT_FLIP, &tty->flags)) {		register int i;		for (i = 0; i < skb->len; i++) {			if (tty->flip.count >= TTY_FLIPBUF_SIZE)				tty_flip_buffer_push(tty);			tty_insert_flip_char(tty, skb->data[i], 0);		}		tty_flip_buffer_push(tty);	} else		tty->ldisc.receive_buf(tty, skb->data, NULL, skb->len);	kfree_skb(skb);}static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err){	struct rfcomm_dev *dev = dlc->owner;	if (!dev)		return;		BT_DBG("dlc %p dev %p err %d", dlc, dev, err);	dev->err = err;	wake_up_interruptible(&dev->wait);	if (dlc->state == BT_CLOSED) {		if (!dev->tty) {			if (test_bit(RFCOMM_RELEASE_ONHUP, &dev->flags)) {				rfcomm_dev_hold(dev);				rfcomm_dev_del(dev);				/* We have to drop DLC lock here, otherwise				   rfcomm_dev_put() will dead lock if it's				   the last reference. */				rfcomm_dlc_unlock(dlc);				rfcomm_dev_put(dev);				rfcomm_dlc_lock(dlc);			}		} else 			tty_hangup(dev->tty);	}}static void rfcomm_dev_modem_status(struct rfcomm_dlc *dlc, u8 v24_sig){	struct rfcomm_dev *dev = dlc->owner;	if (!dev)		return;		BT_DBG("dlc %p dev %p v24_sig 0x%02x", dlc, dev, v24_sig);	dev->modem_status = 		((v24_sig & RFCOMM_V24_RTC) ? (TIOCM_DSR | TIOCM_DTR) : 0) |		((v24_sig & RFCOMM_V24_RTR) ? (TIOCM_RTS | TIOCM_CTS) : 0) |		((v24_sig & RFCOMM_V24_IC)  ? TIOCM_RI : 0) |		((v24_sig & RFCOMM_V24_DV)  ? TIOCM_CD : 0);}/* ---- TTY functions ---- */static void rfcomm_tty_wakeup(unsigned long arg){	struct rfcomm_dev *dev = (void *) arg;	struct tty_struct *tty = dev->tty;	if (!tty)		return;	BT_DBG("dev %p tty %p", dev, tty);	if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags) && tty->ldisc.write_wakeup)                (tty->ldisc.write_wakeup)(tty);	wake_up_interruptible(&tty->write_wait);#ifdef SERIAL_HAVE_POLL_WAIT	wake_up_interruptible(&tty->poll_wait);#endif}static int rfcomm_tty_open(struct tty_struct *tty, struct file *filp){	DECLARE_WAITQUEUE(wait, current);	struct rfcomm_dev *dev;	struct rfcomm_dlc *dlc;	int err, id;        id = tty->index;	BT_DBG("tty %p id %d", tty, id);	/* We don't leak this refcount. For reasons which are not entirely	   clear, the TTY layer will call our ->close() method even if the	   open fails. We decrease the refcount there, and decreasing it	   here too would cause breakage. */	dev = rfcomm_dev_get(id);	if (!dev)		return -ENODEV;	BT_DBG("dev %p dst %s channel %d opened %d", dev, batostr(&dev->dst), dev->channel, dev->opened);	if (dev->opened++ != 0)		return 0;	dlc = dev->dlc;	/* Attach TTY and open DLC */	rfcomm_dlc_lock(dlc);	tty->driver_data = dev;	dev->tty = tty;	rfcomm_dlc_unlock(dlc);	set_bit(RFCOMM_TTY_ATTACHED, &dev->flags);	err = rfcomm_dlc_open(dlc, &dev->src, &dev->dst, dev->channel);	if (err < 0)		return err;	/* Wait for DLC to connect */	add_wait_queue(&dev->wait, &wait);	while (1) {		set_current_state(TASK_INTERRUPTIBLE);		if (dlc->state == BT_CLOSED) {			err = -dev->err;			break;		}		if (dlc->state == BT_CONNECTED)			break;		if (signal_pending(current)) {			err = -EINTR;			break;		}		schedule();	}	set_current_state(TASK_RUNNING);	remove_wait_queue(&dev->wait, &wait);	return err;}static void rfcomm_tty_close(struct tty_struct *tty, struct file *filp){	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;	if (!dev)		return;	BT_DBG("tty %p dev %p dlc %p opened %d", tty, dev, dev->dlc, dev->opened);	if (--dev->opened == 0) {		/* Close DLC and dettach TTY */		rfcomm_dlc_close(dev->dlc, 0);		clear_bit(RFCOMM_TTY_ATTACHED, &dev->flags);		tasklet_kill(&dev->wakeup_task);		rfcomm_dlc_lock(dev->dlc);		tty->driver_data = NULL;		dev->tty = NULL;		rfcomm_dlc_unlock(dev->dlc);	}	rfcomm_dev_put(dev);}static int rfcomm_tty_write(struct tty_struct *tty, int from_user, const unsigned char *buf, int count){	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;	struct rfcomm_dlc *dlc = dev->dlc;	struct sk_buff *skb;	int err = 0, sent = 0, size;	BT_DBG("tty %p from_user %d count %d", tty, from_user, count);	while (count) {		size = min_t(uint, count, dlc->mtu);		if (from_user)			skb = rfcomm_wmalloc(dev, size + RFCOMM_SKB_RESERVE, GFP_KERNEL);		else			skb = rfcomm_wmalloc(dev, size + RFCOMM_SKB_RESERVE, GFP_ATOMIC);				if (!skb)			break;		skb_reserve(skb, RFCOMM_SKB_HEAD_RESERVE);		if (from_user)			copy_from_user(skb_put(skb, size), buf + sent, size);		else			memcpy(skb_put(skb, size), buf + sent, size);		if ((err = rfcomm_dlc_send(dlc, skb)) < 0) {			kfree_skb(skb);			break;		}		sent  += size;		count -= size;	}	return sent ? sent : err;}static int rfcomm_tty_write_room(struct tty_struct *tty){	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;	int room;	BT_DBG("tty %p", tty);	room = rfcomm_room(dev->dlc) - atomic_read(&dev->wmem_alloc);	if (room < 0)		room = 0;	return room;}static int rfcomm_tty_ioctl(struct tty_struct *tty, struct file *filp, unsigned int cmd, unsigned long arg){	BT_DBG("tty %p cmd 0x%02x", tty, cmd);	switch (cmd) {	case TCGETS:		BT_DBG("TCGETS is not supported");		return -ENOIOCTLCMD;	case TCSETS:		BT_DBG("TCSETS is not supported");		return -ENOIOCTLCMD;	case TIOCMIWAIT:		BT_DBG("TIOCMIWAIT");		break;	case TIOCGICOUNT:		BT_DBG("TIOCGICOUNT");		break;	case TIOCGSERIAL:		BT_ERR("TIOCGSERIAL is not supported");		return -ENOIOCTLCMD;	case TIOCSSERIAL:		BT_ERR("TIOCSSERIAL is not supported");		return -ENOIOCTLCMD;	case TIOCSERGSTRUCT:		BT_ERR("TIOCSERGSTRUCT is not supported");		return -ENOIOCTLCMD;	case TIOCSERGETLSR:		BT_ERR("TIOCSERGETLSR is not supported");		return -ENOIOCTLCMD;	case TIOCSERCONFIG:		BT_ERR("TIOCSERCONFIG is not supported");		return -ENOIOCTLCMD;	default:		return -ENOIOCTLCMD;	/* ioctls which we must ignore */	}	return -ENOIOCTLCMD;}#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))static void rfcomm_tty_set_termios(struct tty_struct *tty, struct termios *old){	BT_DBG("tty %p", tty);	if ((tty->termios->c_cflag == old->c_cflag) &&		(RELEVANT_IFLAG(tty->termios->c_iflag) == RELEVANT_IFLAG(old->c_iflag)))		return;	/* handle turning off CRTSCTS */	if ((old->c_cflag & CRTSCTS) && !(tty->termios->c_cflag & CRTSCTS)) {		BT_DBG("turning off CRTSCTS");	}}static void rfcomm_tty_throttle(struct tty_struct *tty){	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;	BT_DBG("tty %p dev %p", tty, dev);		rfcomm_dlc_throttle(dev->dlc);}static void rfcomm_tty_unthrottle(struct tty_struct *tty){	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;	BT_DBG("tty %p dev %p", tty, dev);		rfcomm_dlc_unthrottle(dev->dlc);}static int rfcomm_tty_chars_in_buffer(struct tty_struct *tty){	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;	struct rfcomm_dlc *dlc = dev->dlc;	BT_DBG("tty %p dev %p", tty, dev);	if (skb_queue_len(&dlc->tx_queue))		return dlc->mtu;	return 0;}static void rfcomm_tty_flush_buffer(struct tty_struct *tty){	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;	if (!dev)		return;	BT_DBG("tty %p dev %p", tty, dev);	skb_queue_purge(&dev->dlc->tx_queue);	if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags) && tty->ldisc.write_wakeup)		tty->ldisc.write_wakeup(tty);}static void rfcomm_tty_send_xchar(struct tty_struct *tty, char ch){	BT_DBG("tty %p ch %c", tty, ch);}static void rfcomm_tty_wait_until_sent(struct tty_struct *tty, int timeout){	BT_DBG("tty %p timeout %d", tty, timeout);}static void rfcomm_tty_hangup(struct tty_struct *tty){	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;	if (!dev)		return;	BT_DBG("tty %p dev %p", tty, dev);	rfcomm_tty_flush_buffer(tty);	if (test_bit(RFCOMM_RELEASE_ONHUP, &dev->flags))		rfcomm_dev_del(dev);}static int rfcomm_tty_read_proc(char *buf, char **start, off_t offset, int len, int *eof, void *unused){	return 0;}static int rfcomm_tty_tiocmget(struct tty_struct *tty, struct file *filp){ 	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;	BT_DBG("tty %p dev %p", tty, dev); 	return dev->modem_status;}static int rfcomm_tty_tiocmset(struct tty_struct *tty, struct file *filp, unsigned int set, unsigned int clear){ 	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data; 	struct rfcomm_dlc *dlc = dev->dlc; 	u8 v24_sig;	BT_DBG("tty %p dev %p set 0x%02x clear 0x%02x", tty, dev, set, clear); 	rfcomm_dlc_get_modem_status(dlc, &v24_sig); 	if (set & TIOCM_DSR || set & TIOCM_DTR) 		v24_sig |= RFCOMM_V24_RTC; 	if (set & TIOCM_RTS || set & TIOCM_CTS) 		v24_sig |= RFCOMM_V24_RTR; 	if (set & TIOCM_RI) 		v24_sig |= RFCOMM_V24_IC; 	if (set & TIOCM_CD) 		v24_sig |= RFCOMM_V24_DV; 	if (clear & TIOCM_DSR || clear & TIOCM_DTR) 		v24_sig &= ~RFCOMM_V24_RTC; 	if (clear & TIOCM_RTS || clear & TIOCM_CTS) 		v24_sig &= ~RFCOMM_V24_RTR; 	if (clear & TIOCM_RI) 		v24_sig &= ~RFCOMM_V24_IC; 	if (clear & TIOCM_CD) 		v24_sig &= ~RFCOMM_V24_DV; 	rfcomm_dlc_set_modem_status(dlc, v24_sig); 	return 0;}/* ---- TTY structure ---- */static struct tty_operations rfcomm_ops = {	.open			= rfcomm_tty_open,	.close			= rfcomm_tty_close,	.write			= rfcomm_tty_write,	.write_room		= rfcomm_tty_write_room,	.chars_in_buffer	= rfcomm_tty_chars_in_buffer,	.flush_buffer		= rfcomm_tty_flush_buffer,	.ioctl			= rfcomm_tty_ioctl,	.throttle		= rfcomm_tty_throttle,	.unthrottle		= rfcomm_tty_unthrottle,	.set_termios		= rfcomm_tty_set_termios,	.send_xchar		= rfcomm_tty_send_xchar,	.hangup			= rfcomm_tty_hangup,	.wait_until_sent	= rfcomm_tty_wait_until_sent,	.read_proc		= rfcomm_tty_read_proc,	.tiocmget		= rfcomm_tty_tiocmget,	.tiocmset		= rfcomm_tty_tiocmset,};int rfcomm_init_ttys(void){	rfcomm_tty_driver = alloc_tty_driver(RFCOMM_TTY_PORTS);	if (!rfcomm_tty_driver)		return -1;	rfcomm_tty_driver->owner	= THIS_MODULE;	rfcomm_tty_driver->driver_name	= "rfcomm";	rfcomm_tty_driver->devfs_name	= "bluetooth/rfcomm/";	rfcomm_tty_driver->name		= "rfcomm";	rfcomm_tty_driver->major	= RFCOMM_TTY_MAJOR;	rfcomm_tty_driver->minor_start	= RFCOMM_TTY_MINOR;	rfcomm_tty_driver->type		= TTY_DRIVER_TYPE_SERIAL;	rfcomm_tty_driver->subtype	= SERIAL_TYPE_NORMAL;	rfcomm_tty_driver->flags	= TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS;	rfcomm_tty_driver->init_termios	= tty_std_termios;	rfcomm_tty_driver->init_termios.c_cflag	= B9600 | CS8 | CREAD | HUPCL | CLOCAL;	tty_set_operations(rfcomm_tty_driver, &rfcomm_ops);	if (tty_register_driver(rfcomm_tty_driver)) {		BT_ERR("Can't register RFCOMM TTY driver");		put_tty_driver(rfcomm_tty_driver);		return -1;	}	BT_INFO("RFCOMM TTY layer initialized");	return 0;}void rfcomm_cleanup_ttys(void){	tty_unregister_driver(rfcomm_tty_driver);	put_tty_driver(rfcomm_tty_driver);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜电影网亚洲视频| 一级日本不卡的影视| 亚洲欧美日韩系列| 青娱乐精品视频| a美女胸又www黄视频久久| 欧美电影在哪看比较好| 国产精品卡一卡二| 精品一区二区在线播放| 欧美日韩精品一区二区在线播放| 亚洲精品一线二线三线无人区| 一区二区三区日韩在线观看| 成人黄色一级视频| 国产网站一区二区三区| 美女www一区二区| 精品视频在线免费观看| 亚洲免费观看视频| aa级大片欧美| 国产精品无圣光一区二区| 国产一区二区三区四区五区美女| 欧美一区二区三区视频在线 | 91在线视频免费91| 久久精品视频一区二区三区| 免费成人在线影院| 欧美一级生活片| 日本中文字幕不卡| 91精品国产综合久久久久| 亚洲成人免费视频| 欧美视频在线观看一区二区| 一区二区三区精品| 在线一区二区三区四区| 一区二区理论电影在线观看| 91在线观看美女| 亚洲欧美日韩成人高清在线一区| 色综合天天做天天爱| 亚洲欧美电影院| 色88888久久久久久影院野外| 亚洲视频在线一区二区| 色综合久久久久久久久久久| 亚洲伊人色欲综合网| 在线国产电影不卡| 青青草97国产精品免费观看| 日韩三级视频中文字幕| 国产一区二区视频在线| 国产精品午夜免费| 91美女片黄在线观看91美女| 亚洲永久精品大片| 欧美美女bb生活片| 免费看欧美女人艹b| 欧美精品一区二区三区视频| 国产一区二区电影| 亚洲视频免费观看| 欧美日韩亚洲不卡| 麻豆91精品视频| 欧美国产激情一区二区三区蜜月| 成人v精品蜜桃久久一区| 一区二区三区精品在线观看| 欧美二区三区91| 国产成人av电影| 一区二区三区日韩在线观看| 欧美一卡2卡3卡4卡| 免费成人小视频| 国产精品国产三级国产aⅴ无密码| 91看片淫黄大片一级| 亚洲va韩国va欧美va精品| 精品国产凹凸成av人导航| 成人久久久精品乱码一区二区三区| 亚洲三级在线播放| 日韩一区二区高清| 99久久99久久综合| 久久99蜜桃精品| 亚洲视频狠狠干| 精品久久久久久久久久久久久久久| 精品一区二区三区日韩| 自拍偷自拍亚洲精品播放| 欧美一区二区免费观在线| 成人亚洲一区二区一| 日日摸夜夜添夜夜添亚洲女人| 欧美激情综合在线| 91精品国产综合久久久久久久| 国产成a人亚洲| 午夜久久久久久久久久一区二区| 国产三级欧美三级日产三级99| 欧美日韩在线播放三区| 成人妖精视频yjsp地址| 久久精品国产精品亚洲红杏| 国产精品久久久爽爽爽麻豆色哟哟 | 91香蕉国产在线观看软件| 免费成人深夜小野草| 亚洲精品菠萝久久久久久久| 久久久久久久久97黄色工厂| 欧美一区午夜精品| 在线观看不卡一区| yourporn久久国产精品| 国产在线一区观看| 日韩电影在线一区二区| 亚洲一区日韩精品中文字幕| 国产精品国产自产拍高清av王其| 日韩精品在线一区| 欧美一区二区三区四区视频| 欧美体内she精视频| 色中色一区二区| 97精品久久久午夜一区二区三区| 国产成人综合亚洲网站| 国产一区在线精品| 国内精品久久久久影院薰衣草| 日本中文在线一区| 秋霞午夜av一区二区三区| 首页国产欧美久久| 亚洲制服欧美中文字幕中文字幕| 亚洲人成亚洲人成在线观看图片 | 天天av天天翘天天综合网| 亚洲已满18点击进入久久| 国产精品福利一区二区三区| 国产亚洲精品精华液| 久久精品欧美一区二区三区麻豆| 欧美成人女星排名| 久久久综合激的五月天| 国产精品视频你懂的| 中文字幕av不卡| 亚洲人成亚洲人成在线观看图片| 亚洲欧美成人一区二区三区| 亚洲精品视频观看| 一区二区三区欧美久久| 午夜精品久久久久久久| 毛片一区二区三区| 国产精品一区二区黑丝| 高清不卡一区二区| 日本精品视频一区二区| 欧美精品久久一区| 日韩女优毛片在线| 久久久99精品久久| 最新热久久免费视频| 一区二区高清免费观看影视大全| 亚洲电影欧美电影有声小说| 日韩精品亚洲一区二区三区免费| 久久99久久99| 国产成人精品亚洲777人妖 | 亚洲女人的天堂| 午夜精品久久久久久久久久久 | 美腿丝袜亚洲一区| 国产成人综合视频| 91亚洲男人天堂| 欧美一区二区视频在线观看| 久久夜色精品国产欧美乱极品| 国产精品无圣光一区二区| 亚洲精品中文在线| 日本午夜一区二区| 成人高清免费在线播放| 欧美日韩国产123区| 欧美精品一区二区三区久久久| 国产精品对白交换视频| 日韩成人免费在线| 国产成人免费视频网站高清观看视频| 97久久精品人人爽人人爽蜜臀| 8x8x8国产精品| 国产三级一区二区三区| 偷窥少妇高潮呻吟av久久免费| 国产在线不卡视频| 欧美日韩一区在线| 国产欧美一区二区精品忘忧草 | 久久99国产精品久久| 91色乱码一区二区三区| 欧美成人a在线| 香蕉久久夜色精品国产使用方法 | 中文一区在线播放| 免费在线欧美视频| 一本大道av伊人久久综合| 久久久久国产免费免费 | 懂色一区二区三区免费观看| 在线观看亚洲一区| 日本一区二区综合亚洲| 美女网站一区二区| 欧美日韩综合在线| 亚洲三级在线看| 成人激情开心网| 国产色综合一区| 国产一区二区三区免费在线观看 | 在线亚洲人成电影网站色www| 久久久另类综合| 美女网站一区二区| 91精品国产综合久久小美女| 亚洲最新视频在线观看| 99re亚洲国产精品| 欧美经典三级视频一区二区三区| 精品一区二区三区在线视频| 欧美日韩不卡在线| 综合久久久久综合| 粉嫩aⅴ一区二区三区四区五区| 日韩欧美亚洲一区二区| 天堂蜜桃91精品| 欧美性猛交xxxx黑人交| 一区二区三区在线免费播放 | 欧美日韩视频在线观看一区二区三区| 国产精品成人在线观看| 成人免费高清视频在线观看| 久久美女高清视频| 国产一区不卡在线| 国产日韩成人精品| 成人网男人的天堂| 亚洲国产经典视频|