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

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

?? tty.c

?? 優(yōu)龍2410linux2.6.8內(nèi)核源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*    RFCOMM implementation for Linux Bluetooth stack (BlueZ).   Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>   Copyright (C) 2002 Marcel Holtmann <marcel@holtmann.org>   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License version 2 as   published by the Free Software Foundation;   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS    SOFTWARE IS DISCLAIMED.*//* * RFCOMM TTY. * * $Id: tty.c,v 1.24 2002/10/03 01:54:38 holtmann Exp $ */#include <linux/config.h>#include <linux/module.h>#include <linux/tty.h>#include <linux/tty_driver.h>#include <linux/tty_flip.h>#include <linux/slab.h>#include <linux/skbuff.h>#include <net/bluetooth/bluetooth.h>#include <net/bluetooth/rfcomm.h>#ifndef CONFIG_BT_RFCOMM_DEBUG#undef  BT_DBG#define BT_DBG(D...)#endif#define RFCOMM_TTY_MAGIC 0x6d02		/* magic number for rfcomm struct */#define RFCOMM_TTY_PORTS RFCOMM_MAX_DEV	/* whole lotta rfcomm devices */#define RFCOMM_TTY_MAJOR 216		/* device node major id of the usb/bluetooth.c driver */#define RFCOMM_TTY_MINOR 0static struct tty_driver *rfcomm_tty_driver;struct rfcomm_dev {	struct list_head	list;	atomic_t		refcnt;	char			name[12];	int			id;	unsigned long		flags;	int			opened;	int			err;	bdaddr_t		src;	bdaddr_t		dst;	u8 			channel;	uint 			modem_status;	struct rfcomm_dlc	*dlc;	struct tty_struct	*tty;	wait_queue_head_t       wait;	struct tasklet_struct   wakeup_task;	atomic_t 		wmem_alloc;};static LIST_HEAD(rfcomm_dev_list);static rwlock_t rfcomm_dev_lock = RW_LOCK_UNLOCKED;static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb);static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err);static void rfcomm_dev_modem_status(struct rfcomm_dlc *dlc, u8 v24_sig);static void rfcomm_tty_wakeup(unsigned long arg);/* ---- Device functions ---- */static void rfcomm_dev_destruct(struct rfcomm_dev *dev){	struct rfcomm_dlc *dlc = dev->dlc;	BT_DBG("dev %p dlc %p", dev, dlc);	rfcomm_dlc_lock(dlc);	/* Detach DLC if it's owned by this dev */	if (dlc->owner == dev)		dlc->owner = NULL;	rfcomm_dlc_unlock(dlc);	rfcomm_dlc_put(dlc);	tty_unregister_device(rfcomm_tty_driver, dev->id);	/* Refcount should only hit zero when called from rfcomm_dev_del()	   which will have taken us off the list. Everything else are	   refcounting bugs. */	BUG_ON(!list_empty(&dev->list));	kfree(dev);	/* It's safe to call module_put() here because socket still 	   holds reference to this module. */	module_put(THIS_MODULE);}static inline void rfcomm_dev_hold(struct rfcomm_dev *dev){	atomic_inc(&dev->refcnt);}static inline void rfcomm_dev_put(struct rfcomm_dev *dev){	/* The reason this isn't actually a race, as you no	   doubt have a little voice screaming at you in your	   head, is that the refcount should never actually	   reach zero unless the device has already been taken	   off the list, in rfcomm_dev_del(). And if that's not	   true, we'll hit the BUG() in rfcomm_dev_destruct()	   anyway. */	if (atomic_dec_and_test(&dev->refcnt))		rfcomm_dev_destruct(dev);}static struct rfcomm_dev *__rfcomm_dev_get(int id){	struct rfcomm_dev *dev;	struct list_head  *p;	list_for_each(p, &rfcomm_dev_list) {		dev = list_entry(p, struct rfcomm_dev, list);		if (dev->id == id)			return dev;	}	return NULL;}static inline struct rfcomm_dev *rfcomm_dev_get(int id){	struct rfcomm_dev *dev;	read_lock(&rfcomm_dev_lock);	dev = __rfcomm_dev_get(id);	if (dev)		rfcomm_dev_hold(dev);	read_unlock(&rfcomm_dev_lock);	return dev;}static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc){	struct rfcomm_dev *dev;	struct list_head *head = &rfcomm_dev_list, *p;	int err = 0;	BT_DBG("id %d channel %d", req->dev_id, req->channel);		dev = kmalloc(sizeof(struct rfcomm_dev), GFP_KERNEL);	if (!dev)		return -ENOMEM;	memset(dev, 0, sizeof(struct rfcomm_dev));	write_lock_bh(&rfcomm_dev_lock);	if (req->dev_id < 0) {		dev->id = 0;		list_for_each(p, &rfcomm_dev_list) {			if (list_entry(p, struct rfcomm_dev, list)->id != dev->id)				break;			dev->id++;			head = p;		}	} else {		dev->id = req->dev_id;		list_for_each(p, &rfcomm_dev_list) {			struct rfcomm_dev *entry = list_entry(p, struct rfcomm_dev, list);			if (entry->id == dev->id) {				err = -EADDRINUSE;				goto out;			}			if (entry->id > dev->id - 1)				break;			head = p;		}	}	if ((dev->id < 0) || (dev->id > RFCOMM_MAX_DEV - 1)) {		err = -ENFILE;		goto out;	}	sprintf(dev->name, "rfcomm%d", dev->id);	list_add(&dev->list, head);	atomic_set(&dev->refcnt, 1);	bacpy(&dev->src, &req->src);	bacpy(&dev->dst, &req->dst);	dev->channel = req->channel;	dev->flags = req->flags & 		((1 << RFCOMM_RELEASE_ONHUP) | (1 << RFCOMM_REUSE_DLC));	init_waitqueue_head(&dev->wait);	tasklet_init(&dev->wakeup_task, rfcomm_tty_wakeup, (unsigned long) dev);	rfcomm_dlc_lock(dlc);	dlc->data_ready   = rfcomm_dev_data_ready;	dlc->state_change = rfcomm_dev_state_change;	dlc->modem_status = rfcomm_dev_modem_status;	dlc->owner = dev;	dev->dlc   = dlc;	rfcomm_dlc_unlock(dlc);	/* It's safe to call __module_get() here because socket already 	   holds reference to this module. */	__module_get(THIS_MODULE);out:	write_unlock_bh(&rfcomm_dev_lock);	if (err) {		kfree(dev);		return err;	}	tty_register_device(rfcomm_tty_driver, dev->id, NULL);	return dev->id;}static void rfcomm_dev_del(struct rfcomm_dev *dev){	BT_DBG("dev %p", dev);	write_lock_bh(&rfcomm_dev_lock);	list_del_init(&dev->list);	write_unlock_bh(&rfcomm_dev_lock);	rfcomm_dev_put(dev);}/* ---- Send buffer ---- */static inline unsigned int rfcomm_room(struct rfcomm_dlc *dlc){	/* We can't let it be zero, because we don't get a callback	   when tx_credits becomes nonzero, hence we'd never wake up */	return dlc->mtu * (dlc->tx_credits?:1);}static void rfcomm_wfree(struct sk_buff *skb){	struct rfcomm_dev *dev = (void *) skb->sk;	atomic_sub(skb->truesize, &dev->wmem_alloc);	if (test_bit(RFCOMM_TTY_ATTACHED, &dev->flags))		tasklet_schedule(&dev->wakeup_task);	rfcomm_dev_put(dev);}static inline void rfcomm_set_owner_w(struct sk_buff *skb, struct rfcomm_dev *dev){	rfcomm_dev_hold(dev);	atomic_add(skb->truesize, &dev->wmem_alloc);	skb->sk = (void *) dev;	skb->destructor = rfcomm_wfree;}static struct sk_buff *rfcomm_wmalloc(struct rfcomm_dev *dev, unsigned long size, int priority){	if (atomic_read(&dev->wmem_alloc) < rfcomm_room(dev->dlc)) {		struct sk_buff *skb = alloc_skb(size, priority);		if (skb) {			rfcomm_set_owner_w(skb, dev);			return skb;		}	}	return NULL;}/* ---- Device IOCTLs ---- */#define NOCAP_FLAGS ((1 << RFCOMM_REUSE_DLC) | (1 << RFCOMM_RELEASE_ONHUP))static int rfcomm_create_dev(struct sock *sk, void __user *arg){	struct rfcomm_dev_req req;	struct rfcomm_dlc *dlc;	int id;	if (copy_from_user(&req, arg, sizeof(req)))		return -EFAULT;	BT_DBG("sk %p dev_id %id flags 0x%x", sk, req.dev_id, req.flags);	if (req.flags != NOCAP_FLAGS && !capable(CAP_NET_ADMIN))		return -EPERM;	if (req.flags & (1 << RFCOMM_REUSE_DLC)) {		/* Socket must be connected */		if (sk->sk_state != BT_CONNECTED)			return -EBADFD;		dlc = rfcomm_pi(sk)->dlc;		rfcomm_dlc_hold(dlc);	} else {		dlc = rfcomm_dlc_alloc(GFP_KERNEL);		if (!dlc)			return -ENOMEM;	}	id = rfcomm_dev_add(&req, dlc);	if (id < 0) {		rfcomm_dlc_put(dlc);		return id;	}	if (req.flags & (1 << RFCOMM_REUSE_DLC)) {		/* DLC is now used by device.		 * Socket must be disconnected */		sk->sk_state = BT_CLOSED;	}	return id;}static int rfcomm_release_dev(void __user *arg){	struct rfcomm_dev_req req;	struct rfcomm_dev *dev;	if (copy_from_user(&req, arg, sizeof(req)))		return -EFAULT;	BT_DBG("dev_id %id flags 0x%x", req.dev_id, req.flags);	if (!(dev = rfcomm_dev_get(req.dev_id)))		return -ENODEV;	if (dev->flags != NOCAP_FLAGS && !capable(CAP_NET_ADMIN)) {		rfcomm_dev_put(dev);		return -EPERM;	}	if (req.flags & (1 << RFCOMM_HANGUP_NOW))		rfcomm_dlc_close(dev->dlc, 0);	rfcomm_dev_del(dev);	rfcomm_dev_put(dev);	return 0;}static int rfcomm_get_dev_list(void __user *arg){	struct rfcomm_dev_list_req *dl;	struct rfcomm_dev_info *di;	struct list_head *p;	int n = 0, size, err;	u16 dev_num;	BT_DBG("");	if (get_user(dev_num, (u16 __user *) arg))		return -EFAULT;	if (!dev_num || dev_num > (PAGE_SIZE * 4) / sizeof(*di))		return -EINVAL;	size = sizeof(*dl) + dev_num * sizeof(*di);	if (!(dl = kmalloc(size, GFP_KERNEL)))		return -ENOMEM;	di = dl->dev_info;	read_lock_bh(&rfcomm_dev_lock);	list_for_each(p, &rfcomm_dev_list) {		struct rfcomm_dev *dev = list_entry(p, struct rfcomm_dev, list);		(di + n)->id      = dev->id;		(di + n)->flags   = dev->flags;		(di + n)->state   = dev->dlc->state;		(di + n)->channel = dev->channel;		bacpy(&(di + n)->src, &dev->src);		bacpy(&(di + n)->dst, &dev->dst);		if (++n >= dev_num)			break;	}	read_unlock_bh(&rfcomm_dev_lock);	dl->dev_num = n;	size = sizeof(*dl) + n * sizeof(*di);	err = copy_to_user(arg, dl, size);	kfree(dl);	return err ? -EFAULT : 0;}static int rfcomm_get_dev_info(void __user *arg){	struct rfcomm_dev *dev;	struct rfcomm_dev_info di;	int err = 0;	BT_DBG("");	if (copy_from_user(&di, arg, sizeof(di)))		return -EFAULT;	if (!(dev = rfcomm_dev_get(di.id)))		return -ENODEV;	di.flags   = dev->flags;	di.channel = dev->channel;	di.state   = dev->dlc->state;	bacpy(&di.src, &dev->src);	bacpy(&di.dst, &dev->dst);	if (copy_to_user(arg, &di, sizeof(di)))		err = -EFAULT;	rfcomm_dev_put(dev);	return err;}int rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg){	BT_DBG("cmd %d arg %p", cmd, arg);	switch (cmd) {	case RFCOMMCREATEDEV:		return rfcomm_create_dev(sk, arg);	case RFCOMMRELEASEDEV:		return rfcomm_release_dev(arg);	case RFCOMMGETDEVLIST:		return rfcomm_get_dev_list(arg);	case RFCOMMGETDEVINFO:		return rfcomm_get_dev_info(arg);	}	return -EINVAL;}/* ---- DLC callbacks ---- */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆精品一区二区综合av| 色哟哟亚洲精品| 欧美成人video| 青青青伊人色综合久久| 欧美一区二区三区思思人| 麻豆成人综合网| 国产精品网友自拍| 91视频xxxx| 亚洲va在线va天堂| 欧美成人一区二区三区片免费| 久久国产剧场电影| 国产精品久久久久久久久快鸭| 91视频www| 另类小说视频一区二区| 日本一区二区三区四区在线视频 | 日韩成人精品视频| 久久久久国产精品麻豆ai换脸 | 亚洲视频一二三| 欧美日韩久久不卡| 国产精品一区久久久久| 亚洲久草在线视频| 日韩一区二区不卡| bt欧美亚洲午夜电影天堂| 亚洲成人1区2区| 国产日韩欧美a| 欧美日韩美女一区二区| 国产精品一区专区| 亚洲伊人色欲综合网| 日韩欧美一二三区| 91蜜桃视频在线| 裸体在线国模精品偷拍| 亚洲婷婷综合色高清在线| 欧美精品在线一区二区三区| 国产成人午夜精品5599| 亚洲第一综合色| 国产精品视频看| 91精品福利在线一区二区三区| 国产传媒久久文化传媒| 日产精品久久久久久久性色| 国产精品视频观看| 国产欧美久久久精品影院| 欧美日韩久久一区二区| 成人av小说网| 精品一区二区三区免费毛片爱| 日韩毛片一二三区| 精品粉嫩aⅴ一区二区三区四区| 91美女福利视频| 奇米影视7777精品一区二区| 91黄色免费版| 国产一区二区久久| 欧美高清在线一区| 国产精品成人网| 精品国产一二三| 欧美久久久久久蜜桃| 懂色av一区二区夜夜嗨| 紧缚捆绑精品一区二区| 亚洲福利视频三区| 一区二区免费看| 18欧美亚洲精品| 国产网红主播福利一区二区| 日韩情涩欧美日韩视频| 欧美婷婷六月丁香综合色| 94色蜜桃网一区二区三区| 狠狠久久亚洲欧美| 日韩国产高清在线| 五月激情综合婷婷| 亚洲一区二区三区四区在线观看 | 国产成人午夜电影网| 麻豆国产欧美日韩综合精品二区| 亚洲一二三四区| 一区二区在线看| 一区二区三区精品久久久| 日韩理论片中文av| 综合婷婷亚洲小说| 亚洲视频免费在线| 亚洲欧美乱综合| 亚洲男人的天堂在线观看| 18成人在线视频| 最新日韩av在线| 亚洲日穴在线视频| 亚洲图片有声小说| 天堂久久一区二区三区| 视频一区国产视频| 男人操女人的视频在线观看欧美 | 麻豆成人综合网| 久久精品国产**网站演员| 国内精品久久久久影院薰衣草| 麻豆免费精品视频| 裸体一区二区三区| 丁香一区二区三区| 韩国成人在线视频| 亚洲欧美色图小说| 中文字幕一区二区在线观看| 国产999精品久久| 欧美日韩国产美女| 在线观看欧美精品| 99久久99久久精品免费看蜜桃| 国内成人精品2018免费看| 欧美一区二区三区免费观看视频| 色综合天天天天做夜夜夜夜做| 99精品黄色片免费大全| 大尺度一区二区| 高清不卡一二三区| 国产三级久久久| 日韩欧美精品在线| 久久精品国产网站| 日韩精品免费专区| 成人免费不卡视频| 欧美成人一区二区三区片免费| 欧美国产激情一区二区三区蜜月| 亚洲日本青草视频在线怡红院| 奇米一区二区三区av| 色天使久久综合网天天| 久久久亚洲精品一区二区三区| 亚洲精品免费在线观看| 国产91在线看| 精品国产91乱码一区二区三区| 亚洲综合视频在线观看| 91香蕉视频在线| 亚洲欧美日韩人成在线播放| 成人看片黄a免费看在线| 欧美日韩高清影院| 一区二区三区欧美日| 不卡视频在线观看| 国产无一区二区| 成人午夜视频免费看| 中文字幕国产一区二区| 免费一区二区视频| 欧美成人bangbros| 国产69精品久久777的优势| 国产亚洲美州欧州综合国| 成人激情午夜影院| 久久综合久久综合久久| 久久精工是国产品牌吗| 久久色在线观看| 成人三级伦理片| 亚洲日本韩国一区| 欧美日韩专区在线| 久久精品av麻豆的观看方式| 26uuu国产一区二区三区| 成人综合婷婷国产精品久久免费| 综合欧美一区二区三区| 日韩欧美第一区| 亚洲视频狠狠干| 欧美大片国产精品| 在线一区二区三区做爰视频网站| 免费看日韩精品| 亚洲私人影院在线观看| 欧美老年两性高潮| 成人免费av网站| 九色综合国产一区二区三区| 中文字幕亚洲不卡| 国产乱码精品一区二区三区五月婷| 久久久久88色偷偷免费 | 不卡av在线网| 天天影视涩香欲综合网| 国产精品高潮呻吟| 日韩午夜小视频| 99国产精品久久久久久久久久| 首页欧美精品中文字幕| 亚洲日本在线天堂| 欧美国产1区2区| 蓝色福利精品导航| 久久久久久久免费视频了| 91精品国产综合久久精品| 欧美亚洲动漫制服丝袜| 一本到不卡精品视频在线观看 | 日韩视频一区二区三区在线播放| 91免费观看视频| eeuss影院一区二区三区| 精品系列免费在线观看| 蜜臀久久99精品久久久久宅男 | 国产99久久久国产精品| 中文成人av在线| 久久嫩草精品久久久精品| 2020国产精品自拍| 久久久久国产精品麻豆ai换脸 | 99re成人精品视频| 色欧美片视频在线观看在线视频| 欧美性色黄大片手机版| 在线成人高清不卡| 日韩情涩欧美日韩视频| 欧美成人艳星乳罩| 久久综合五月天婷婷伊人| 日韩亚洲欧美中文三级| 91福利在线免费观看| 91精品国产综合久久小美女| 精品国产在天天线2019| 国产精品三级电影| 亚洲电影激情视频网站| 国产老女人精品毛片久久| 91天堂素人约啪| 日韩西西人体444www| 亚洲人妖av一区二区| 一区二区三区电影在线播| 日本成人在线不卡视频| 国产91精品露脸国语对白| 欧美性大战xxxxx久久久| 六月丁香婷婷久久| 大胆亚洲人体视频|