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

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

?? sock.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 sockets. * * $Id: sock.c,v 1.24 2002/10/03 01:00:34 maxk Exp $ */#include <linux/config.h>#include <linux/module.h>#include <linux/types.h>#include <linux/errno.h>#include <linux/kernel.h>#include <linux/major.h>#include <linux/sched.h>#include <linux/slab.h>#include <linux/poll.h>#include <linux/fcntl.h>#include <linux/init.h>#include <linux/interrupt.h>#include <linux/socket.h>#include <linux/skbuff.h>#include <linux/list.h>#include <linux/proc_fs.h>#include <linux/seq_file.h>#include <net/sock.h>#include <asm/system.h>#include <asm/uaccess.h>#include <net/bluetooth/bluetooth.h>#include <net/bluetooth/rfcomm.h>#ifndef CONFIG_BT_RFCOMM_DEBUG#undef  BT_DBG#define BT_DBG(D...)#endifstatic struct proto_ops rfcomm_sock_ops;static struct bt_sock_list rfcomm_sk_list = {	.lock = RW_LOCK_UNLOCKED};static void rfcomm_sock_close(struct sock *sk);static void rfcomm_sock_kill(struct sock *sk);/* ---- DLC callbacks ---- * * called under rfcomm_dlc_lock() */static void rfcomm_sk_data_ready(struct rfcomm_dlc *d, struct sk_buff *skb){	struct sock *sk = d->owner;	if (!sk)		return;	atomic_add(skb->len, &sk->sk_rmem_alloc);	skb_queue_tail(&sk->sk_receive_queue, skb);	sk->sk_data_ready(sk, skb->len);	if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf)		rfcomm_dlc_throttle(d);}static void rfcomm_sk_state_change(struct rfcomm_dlc *d, int err){	struct sock *sk = d->owner, *parent;	if (!sk)		return;	BT_DBG("dlc %p state %ld err %d", d, d->state, err);	bh_lock_sock(sk);	if (err)		sk->sk_err = err;	sk->sk_state = d->state;	parent = bt_sk(sk)->parent;	if (!parent) {		if (d->state == BT_CONNECTED)			rfcomm_session_getaddr(d->session, &bt_sk(sk)->src, NULL);		sk->sk_state_change(sk);	} else		parent->sk_data_ready(parent, 0);	bh_unlock_sock(sk);}/* ---- Socket functions ---- */static struct sock *__rfcomm_get_sock_by_addr(u8 channel, bdaddr_t *src){	struct sock *sk = NULL;	struct hlist_node *node;	sk_for_each(sk, node, &rfcomm_sk_list.head) {		if (rfcomm_pi(sk)->channel == channel && 				!bacmp(&bt_sk(sk)->src, src))			break;	}	return node ? sk : NULL;}/* Find socket with channel and source bdaddr. * Returns closest match. */static struct sock *__rfcomm_get_sock_by_channel(int state, u8 channel, bdaddr_t *src){	struct sock *sk = NULL, *sk1 = NULL;	struct hlist_node *node;	sk_for_each(sk, node, &rfcomm_sk_list.head) {		if (state && sk->sk_state != state)			continue;		if (rfcomm_pi(sk)->channel == channel) {			/* Exact match. */			if (!bacmp(&bt_sk(sk)->src, src))				break;			/* Closest match */			if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY))				sk1 = sk;		}	}	return node ? sk : sk1;}/* Find socket with given address (channel, src). * Returns locked socket */static inline struct sock *rfcomm_get_sock_by_channel(int state, u8 channel, bdaddr_t *src){	struct sock *s;	read_lock(&rfcomm_sk_list.lock);	s = __rfcomm_get_sock_by_channel(state, channel, src);	if (s) bh_lock_sock(s);	read_unlock(&rfcomm_sk_list.lock);	return s;}static void rfcomm_sock_destruct(struct sock *sk){	struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;	BT_DBG("sk %p dlc %p", sk, d);	skb_queue_purge(&sk->sk_receive_queue);	skb_queue_purge(&sk->sk_write_queue);	rfcomm_dlc_lock(d);	rfcomm_pi(sk)->dlc = NULL;		/* Detach DLC if it's owned by this socket */	if (d->owner == sk)		d->owner = NULL;	rfcomm_dlc_unlock(d);	rfcomm_dlc_put(d);	if (sk->sk_protinfo)		kfree(sk->sk_protinfo);}static void rfcomm_sock_cleanup_listen(struct sock *parent){	struct sock *sk;	BT_DBG("parent %p", parent);	/* Close not yet accepted dlcs */	while ((sk = bt_accept_dequeue(parent, NULL))) {		rfcomm_sock_close(sk);		rfcomm_sock_kill(sk);	}	parent->sk_state  = BT_CLOSED;	parent->sk_zapped = 1;}/* Kill socket (only if zapped and orphan) * Must be called on unlocked socket. */static void rfcomm_sock_kill(struct sock *sk){	if (!sk->sk_zapped || sk->sk_socket)		return;	BT_DBG("sk %p state %d refcnt %d", sk, sk->sk_state, atomic_read(&sk->sk_refcnt));	/* Kill poor orphan */	bt_sock_unlink(&rfcomm_sk_list, sk);	sock_set_flag(sk, SOCK_DEAD);	sock_put(sk);}static void __rfcomm_sock_close(struct sock *sk){	struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;	BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);	switch (sk->sk_state) {	case BT_LISTEN:		rfcomm_sock_cleanup_listen(sk);		break;	case BT_CONNECT:	case BT_CONNECT2:	case BT_CONFIG:	case BT_CONNECTED:		rfcomm_dlc_close(d, 0);	default:		sk->sk_zapped = 1;		break;	}}/* Close socket. * Must be called on unlocked socket. */static void rfcomm_sock_close(struct sock *sk){	lock_sock(sk);	__rfcomm_sock_close(sk);	release_sock(sk);}static void rfcomm_sock_init(struct sock *sk, struct sock *parent){	BT_DBG("sk %p", sk);	if (parent) 		sk->sk_type = parent->sk_type;}static struct sock *rfcomm_sock_alloc(struct socket *sock, int proto, int prio){	struct rfcomm_dlc *d;	struct sock *sk;	sk = bt_sock_alloc(sock, BTPROTO_RFCOMM, sizeof(struct rfcomm_pinfo), prio);	if (!sk)		return NULL;	sk_set_owner(sk, THIS_MODULE);	d = rfcomm_dlc_alloc(prio);	if (!d) {		sk_free(sk);		return NULL;	}	d->data_ready   = rfcomm_sk_data_ready;	d->state_change = rfcomm_sk_state_change;	rfcomm_pi(sk)->dlc = d;	d->owner = sk;	sk->sk_destruct = rfcomm_sock_destruct;	sk->sk_sndtimeo = RFCOMM_CONN_TIMEOUT;	sk->sk_sndbuf   = RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 10;	sk->sk_rcvbuf   = RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 10;	sk->sk_protocol = proto;	sk->sk_state    = BT_OPEN;	bt_sock_link(&rfcomm_sk_list, sk);	BT_DBG("sk %p", sk);	return sk;}static int rfcomm_sock_create(struct socket *sock, int protocol){	struct sock *sk;	BT_DBG("sock %p", sock);	sock->state = SS_UNCONNECTED;	if (sock->type != SOCK_STREAM && sock->type != SOCK_RAW)		return -ESOCKTNOSUPPORT;	sock->ops = &rfcomm_sock_ops;	if (!(sk = rfcomm_sock_alloc(sock, protocol, GFP_KERNEL)))		return -ENOMEM;	rfcomm_sock_init(sk, NULL);	return 0;}static int rfcomm_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len){	struct sockaddr_rc *sa = (struct sockaddr_rc *) addr;	struct sock *sk = sock->sk;	int err = 0;	BT_DBG("sk %p %s", sk, batostr(&sa->rc_bdaddr));	if (!addr || addr->sa_family != AF_BLUETOOTH)		return -EINVAL;	lock_sock(sk);	if (sk->sk_state != BT_OPEN) {		err = -EBADFD;		goto done;	}	write_lock_bh(&rfcomm_sk_list.lock);	if (sa->rc_channel && __rfcomm_get_sock_by_addr(sa->rc_channel, &sa->rc_bdaddr)) {		err = -EADDRINUSE;	} else {		/* Save source address */		bacpy(&bt_sk(sk)->src, &sa->rc_bdaddr);		rfcomm_pi(sk)->channel = sa->rc_channel;		sk->sk_state = BT_BOUND;	}	write_unlock_bh(&rfcomm_sk_list.lock);done:	release_sock(sk);	return err;}static int rfcomm_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags){	struct sockaddr_rc *sa = (struct sockaddr_rc *) addr;	struct sock *sk = sock->sk;	struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;	int err = 0;	BT_DBG("sk %p", sk);	if (addr->sa_family != AF_BLUETOOTH || alen < sizeof(struct sockaddr_rc))		return -EINVAL;	if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND)		return -EBADFD;	if (sk->sk_type != SOCK_STREAM)		return -EINVAL;	lock_sock(sk);	sk->sk_state = BT_CONNECT;	bacpy(&bt_sk(sk)->dst, &sa->rc_bdaddr);	rfcomm_pi(sk)->channel = sa->rc_channel;	err = rfcomm_dlc_open(d, &bt_sk(sk)->src, &sa->rc_bdaddr, sa->rc_channel);	if (!err)		err = bt_sock_wait_state(sk, BT_CONNECTED,				sock_sndtimeo(sk, flags & O_NONBLOCK));	release_sock(sk);	return err;}int rfcomm_sock_listen(struct socket *sock, int backlog){	struct sock *sk = sock->sk;	int err = 0;	BT_DBG("sk %p backlog %d", sk, backlog);	lock_sock(sk);	if (sk->sk_state != BT_BOUND) {		err = -EBADFD;		goto done;	}	if (!rfcomm_pi(sk)->channel) {		bdaddr_t *src = &bt_sk(sk)->src;		u8 channel;		err = -EINVAL;		write_lock_bh(&rfcomm_sk_list.lock);		for (channel = 1; channel < 31; channel++)			if (!__rfcomm_get_sock_by_addr(channel, src)) {				rfcomm_pi(sk)->channel = channel;				err = 0;				break;			}		write_unlock_bh(&rfcomm_sk_list.lock);		if (err < 0)			goto done;	}	sk->sk_max_ack_backlog = backlog;	sk->sk_ack_backlog = 0;	sk->sk_state = BT_LISTEN;done:	release_sock(sk);	return err;}int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int flags){	DECLARE_WAITQUEUE(wait, current);	struct sock *sk = sock->sk, *nsk;	long timeo;	int err = 0;	lock_sock(sk);	if (sk->sk_state != BT_LISTEN) {		err = -EBADFD;		goto done;	}	timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);	BT_DBG("sk %p timeo %ld", sk, timeo);	/* Wait for an incoming connection. (wake-one). */	add_wait_queue_exclusive(sk->sk_sleep, &wait);	while (!(nsk = bt_accept_dequeue(sk, newsock))) {		set_current_state(TASK_INTERRUPTIBLE);		if (!timeo) {			err = -EAGAIN;			break;		}		release_sock(sk);		timeo = schedule_timeout(timeo);		lock_sock(sk);		if (sk->sk_state != BT_LISTEN) {			err = -EBADFD;			break;		}		if (signal_pending(current)) {			err = sock_intr_errno(timeo);			break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一级二级| 一区二区国产视频| 国产xxx精品视频大全| 亚洲国产精品精华液2区45| 国产精品夜夜爽| 国产精品久久久久久久蜜臀| 波多野洁衣一区| 亚洲成a人v欧美综合天堂下载| 欧美日韩dvd在线观看| 另类欧美日韩国产在线| 亚洲国产精品传媒在线观看| 9人人澡人人爽人人精品| 亚洲一区视频在线观看视频| 欧美一区二区三区日韩| 国产一区二区视频在线| 亚洲精品免费在线观看| 日韩你懂的在线播放| www.日韩在线| 婷婷综合在线观看| 欧美极品美女视频| 欧美日韩久久久| 国产毛片精品视频| 亚洲综合色自拍一区| 精品国产露脸精彩对白| 色综合色狠狠天天综合色| 日本午夜一本久久久综合| 国产精品青草久久| 欧美一区二区三级| 99re这里只有精品首页| 成人动漫一区二区三区| 亚洲第一av色| 亚洲国产成人午夜在线一区| 欧美福利电影网| 成人动漫视频在线| 精品一区二区三区视频| 亚洲一区视频在线| 国产精品天美传媒| 日韩精品一区二区在线| 欧美中文字幕一区二区三区 | 色成年激情久久综合| 全部av―极品视觉盛宴亚洲| 中文字幕一区三区| 久久亚洲综合色| 欧美日韩另类一区| 99久久精品免费| 国产精品自拍毛片| 日本aⅴ精品一区二区三区| 亚洲激情图片qvod| 国产精品沙发午睡系列990531| 337p亚洲精品色噜噜噜| 色欧美乱欧美15图片| 成人免费看片app下载| 国内精品久久久久影院一蜜桃| 亚洲成人你懂的| 一区二区三区四区激情| 国产精品久久99| 国产午夜亚洲精品理论片色戒| 日韩限制级电影在线观看| 欧美亚洲免费在线一区| 91免费视频网| 99re这里只有精品首页| 成人国产视频在线观看| 国产精品123区| 国产精品18久久久久久久久| 久久97超碰色| 男女视频一区二区| 日本免费新一区视频| 日韩高清一区二区| 日韩福利电影在线| 蜜臀99久久精品久久久久久软件| 亚洲成人精品一区二区| 亚洲综合在线免费观看| 樱桃视频在线观看一区| 亚洲一级二级在线| 亚洲成人1区2区| 偷拍与自拍一区| 欧美aⅴ一区二区三区视频| 日韩电影免费在线看| 日本视频一区二区| 精品一区免费av| 国产一区二区0| 国产精品一二三四五| 成人激情开心网| 色婷婷国产精品综合在线观看| 91精品1区2区| 欧美色倩网站大全免费| 欧美一区二区三区在线视频| 欧美一区二区福利视频| 精品精品国产高清a毛片牛牛| 亚洲精品在线电影| 欧美激情艳妇裸体舞| 亚洲四区在线观看| 婷婷综合另类小说色区| 久久99国产精品久久99果冻传媒| 欧美日韩激情在线| 日韩女优视频免费观看| 国产午夜亚洲精品午夜鲁丝片 | 亚洲欧美激情一区二区| 亚洲精品成人少妇| 男男视频亚洲欧美| 国产经典欧美精品| 在线欧美小视频| 欧美成人a视频| 1024国产精品| 日韩二区在线观看| 丁香婷婷深情五月亚洲| 欧美中文字幕不卡| 精品国产精品一区二区夜夜嗨| 欧美极品少妇xxxxⅹ高跟鞋 | av高清不卡在线| 欧美探花视频资源| 国产日韩欧美亚洲| 亚洲一区二区三区四区的| 久久福利视频一区二区| 91免费在线看| 欧美精品一区二区三区蜜臀| 亚洲精品乱码久久久久久| 美国精品在线观看| 日本韩国精品一区二区在线观看| 日韩欧美一区电影| 亚洲日本成人在线观看| 美国毛片一区二区| 欧美性感一区二区三区| 日本一区二区三区免费乱视频| 午夜在线成人av| www.99精品| 欧美电视剧在线看免费| 亚洲精品成人精品456| 国产一区999| 欧美高清视频在线高清观看mv色露露十八 | 欧美裸体一区二区三区| 国产欧美精品一区| 日韩av中文字幕一区二区三区| 97精品电影院| 久久久久久亚洲综合影院红桃 | 免费的成人av| 欧美日韩中字一区| 亚洲欧洲av色图| 国产成人免费高清| 精品国产乱子伦一区| 亚洲超碰精品一区二区| 色哟哟亚洲精品| 国产精品国产三级国产aⅴ中文| 麻豆成人久久精品二区三区小说| 91福利精品第一导航| 国产精品国产三级国产aⅴ入口 | 777xxx欧美| 亚洲国产wwwccc36天堂| 97精品视频在线观看自产线路二| 久久久精品黄色| 激情欧美一区二区三区在线观看| 欧美高清www午色夜在线视频| 一区二区三区自拍| 色呦呦国产精品| 亚洲欧美乱综合| 91在线观看高清| 中文字幕在线一区| 日韩三级av在线播放| 亚洲电影你懂得| 欧美精品自拍偷拍动漫精品| 亚洲一二三区在线观看| 在线观看日韩一区| 一区二区三区中文在线| 欧美在线色视频| 五月婷婷综合激情| 欧美裸体一区二区三区| 日韩精品视频网站| 日韩午夜av电影| 精品综合免费视频观看| 日韩精品一区二区三区视频| 久久91精品国产91久久小草| 欧美tickling挠脚心丨vk| 久久99精品国产麻豆不卡| 精品第一国产综合精品aⅴ| 国产精品一区二区男女羞羞无遮挡| 久久久美女毛片| av亚洲精华国产精华| 亚洲精品免费播放| 欧美日韩一区精品| 青青国产91久久久久久| 久久久久久久久久电影| 白白色 亚洲乱淫| 一区二区三区视频在线看| 欧美无人高清视频在线观看| 视频一区欧美日韩| 2021国产精品久久精品| 成人免费看片app下载| 亚洲最新在线观看| 日韩三级在线免费观看| 国产999精品久久| 亚洲综合男人的天堂| 精品少妇一区二区三区日产乱码| 国产精品夜夜嗨| 一区二区三区不卡在线观看| 91精品久久久久久久91蜜桃| 国产一区视频导航| 亚洲欧美视频在线观看视频| 欧美日韩成人激情| 国产成人亚洲综合a∨猫咪| 亚洲欧美国产高清|