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

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

?? tty.c

?? 優龍2410linux2.6.8內核源代碼
?? 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 ---- */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲第一狼人社区| 欧美日韩在线播放| 欧美在线观看禁18| 精品国内二区三区| 亚洲一区二区三区自拍| 国产成人亚洲综合a∨婷婷| 欧美体内she精视频| 久久久久久久免费视频了| 一区二区免费看| 国产成人福利片| 日韩一区二区影院| 亚洲一区二区欧美| 99久久er热在这里只有精品15| 精品免费日韩av| 日韩精品一二三| 欧美亚洲综合在线| 亚洲国产高清不卡| 国产乱妇无码大片在线观看| 7777精品伊人久久久大香线蕉的| 日韩美女视频一区| 国产91精品精华液一区二区三区 | 不卡一二三区首页| 精品99一区二区| 国产尤物一区二区| 精品少妇一区二区三区日产乱码 | 欧美偷拍一区二区| 亚洲精品久久7777| 日本乱人伦aⅴ精品| 自拍偷拍亚洲激情| 97久久精品人人澡人人爽| 成人免费在线观看入口| av在线不卡免费看| 日韩毛片高清在线播放| 99国产精品视频免费观看| 综合网在线视频| 色狠狠av一区二区三区| 亚洲高清视频中文字幕| 欧美少妇xxx| 免费人成黄页网站在线一区二区| 日韩亚洲欧美一区二区三区| 精品夜夜嗨av一区二区三区| 精品国产区一区| 国产一区二区三区四区五区美女| 久久精品一区二区三区不卡牛牛| 国产成人自拍在线| 国产精品久久久久一区| 91麻豆国产香蕉久久精品| 亚洲综合色在线| 91麻豆精品久久久久蜜臀| 老司机精品视频导航| 国产视频一区二区三区在线观看 | 国产精品不卡在线| 99精品久久99久久久久| 亚洲成av人综合在线观看| 日韩精品一区二区三区在线| 国产成人亚洲综合a∨婷婷图片| 国产精品美女久久久久久久| 在线观看视频91| 久久精品国产亚洲5555| 国产精品福利电影一区二区三区四区| 一本到三区不卡视频| 婷婷亚洲久悠悠色悠在线播放| 精品福利一区二区三区免费视频| 国产91精品久久久久久久网曝门| 亚洲欧美日韩在线| 日韩午夜小视频| 99视频精品全部免费在线| 亚洲电影一级黄| 国产日韩欧美高清在线| 欧美三级电影网站| 国产一区二区导航在线播放| 亚洲在线视频网站| 久久久久久99精品| 欧美日韩亚洲高清一区二区| 国产v综合v亚洲欧| 日韩影视精彩在线| 亚洲手机成人高清视频| 日韩女优视频免费观看| 91国模大尺度私拍在线视频| 国产精品资源站在线| 亚洲国产精品麻豆| 国产精品国产自产拍高清av| 欧美一区二区播放| 91视频在线看| 从欧美一区二区三区| 日韩不卡一区二区| 一级日本不卡的影视| 日本一区二区视频在线| 欧美大片在线观看一区二区| 色综合天天综合| 懂色av噜噜一区二区三区av| 免费的国产精品| 亚洲图片欧美综合| 中文字幕一区二区视频| 国产亚洲成aⅴ人片在线观看| 91精品国产aⅴ一区二区| 91九色最新地址| 99re亚洲国产精品| eeuss鲁一区二区三区| 国产精品亚洲成人| 韩国欧美国产一区| 美女网站色91| 日本不卡一区二区三区| 日韩经典中文字幕一区| 一区二区国产视频| 亚洲女人****多毛耸耸8| 中文字幕日本不卡| 国产精品国产三级国产普通话三级| 久久久九九九九| 久久久久99精品国产片| 久久亚洲精品小早川怜子| 精品乱码亚洲一区二区不卡| 日韩欧美一级在线播放| 日韩精品一区在线观看| 欧美一区二区成人| 欧美顶级少妇做爰| 日韩午夜激情电影| 日韩精品在线网站| 久久婷婷色综合| 欧美国产精品专区| 欧美国产精品专区| 亚洲欧洲99久久| 亚洲一卡二卡三卡四卡无卡久久 | 黄网站免费久久| 久久99国产精品成人| 国内不卡的二区三区中文字幕| 国产又黄又大久久| 波多野结衣亚洲一区| 色婷婷久久久亚洲一区二区三区| 91麻豆国产福利在线观看| 欧美色手机在线观看| 日韩一区二区三区在线| 欧美www视频| 中国av一区二区三区| 一区二区三区中文字幕在线观看| 亚洲线精品一区二区三区八戒| 免费看日韩精品| 国产成人丝袜美腿| 97se亚洲国产综合自在线观| 欧美精品 日韩| 国产婷婷精品av在线| 一区二区三区在线观看国产| 美日韩一区二区三区| 成人免费视频国产在线观看| 欧美在线视频不卡| 日韩欧美卡一卡二| 国产精品丝袜91| 日韩精品成人一区二区三区 | 国产精品美女久久久久久2018| 一区二区不卡在线播放 | 日本精品免费观看高清观看| 91精品国产综合久久久久久漫画| 久久综合成人精品亚洲另类欧美| 亚洲视频图片小说| 美女一区二区久久| 色综合色综合色综合| 精品少妇一区二区三区视频免付费| 国产精品另类一区| 免费在线观看成人| 色av成人天堂桃色av| 久久久亚洲国产美女国产盗摄| 亚洲综合激情小说| 国产乱码精品一区二区三 | 日本二三区不卡| 久久久久久99久久久精品网站| 亚洲一区二区三区四区在线| 成人一级片网址| 欧美一区二区三区播放老司机| 亚洲图片你懂的| 国内精品久久久久影院一蜜桃| 欧洲国产伦久久久久久久| 国产欧美日韩在线看| 三级久久三级久久久| 色综合久久精品| 国产欧美久久久精品影院| 蜜臀av性久久久久蜜臀aⅴ流畅| 91久久精品一区二区三| 国产精品美女久久久久久久久| 精品亚洲国产成人av制服丝袜| 欧美日韩激情在线| 亚洲欧美一区二区视频| 国产另类ts人妖一区二区| 日韩欧美国产一二三区| 亚洲午夜在线电影| 色94色欧美sute亚洲13| 欧美国产国产综合| 国产精品综合一区二区三区| 制服丝袜日韩国产| 亚洲超丰满肉感bbw| 在线观看91精品国产入口| 亚洲视频免费在线观看| www..com久久爱| 国产精品水嫩水嫩| 成人手机在线视频| 国产欧美一区二区在线| 高清视频一区二区| 国产日本一区二区| 成人精品电影在线观看| 国产欧美日韩视频在线观看| 国产成人aaaa|