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

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

?? proxy.c

?? RTSP PROXY Server and client
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* 
  * 
  *  kRtspProxyd
  * 
  *  Many basic functions for rtsp parsing
  *
  */

#include <linux/kernel.h>
#include <linux/net.h>
#include <net/sock.h>
#include <linux/inet.h>
#include "proxy.h"
#include "prototypes.h"

#define MAX_SOCK_ADDR 128
int	gUserLimit = 20;
atomic_t	gNumUsers = ATOMIC_INIT(0);
shok	*gShokList = NULL;

static int gUDPPortMin = 2000;
static int gUDPPortMax = 65536;
atomic_t gNextPort = ATOMIC_INIT(-1);
atomic_t gMaxPorts = ATOMIC_INIT(0);
unsigned int gProxyIP; //sefIP


t_cmd_map cmd_map[] = {
	{"DESCRIBE",	ttDescribe},
	{"SETUP",	ttSetup},	
	{"PLAY",	ttPlay},
	{"PAUSE",	ttPause},
	{"STOP",	ttStop},
	{"TEARDOWN",	ttTeardown},
	{"OPTIONS",     ttOptions},
	{"ANNOUNCE",    ttAnnounce},
	{"REDIRECT", 	ttRedirect},
	{"GET_PARAMETER", ttGetParameter},
	{"SET_PARAMETER", ttSetParameter},
	{NULL,		ttNone}
};

char *str_sep(char **stringp, char *delim)
{
	int j, dl, i, sl;
	char *newstring, *ret;

	if (*stringp == NULL)
		return NULL;

	dl = strlen(delim);
	sl = strlen(*stringp);
	newstring = NULL;
	ret = *stringp;

	for (i=0; i<sl; i++) {
		for (j=0; j<dl; j++) {
			if ((*stringp)[i] == delim[j]) {
				(*stringp)[i] = '\0';
				newstring = &((*stringp)[i+1]);
				i = sl; j = dl;
			}
		}
	}

	*stringp = newstring;
	return ret;
}


static inline char to_lower(char c)
{
	if (c >= 'A' && c <= 'Z')
		return ((c - 'A') + 'a');
	return c;
}


int strn_casecmp(char *str1, char *str2, int l)
{
	int	ret;
	
	ret = to_lower(*str1) - to_lower(*str2);
	while (l-- && to_lower(*str1) && to_lower(*str2) && ((ret = to_lower(*str1++) - to_lower(*str2++)) == 0))
		;
	return ret;
}

int is_command(char *inp, char *cmd, char *server)
{
	int 	l;
	char	*p;

	l = strlen(inp);

	if (l < 17)		/* "RTSP/1.0" (8) + " rtsp:// " (9) */
		return 0;
	if (strn_casecmp(&inp[l-8], "RTSP/1.0", 8) != 0)
		return 0;

	p = inp;
	while (*p && (*p != ' '))
		*cmd++ = *p++;
	*cmd = '\0';

	if (strn_casecmp(p, " rtsp://", 8) != 0)
		return 0;

	p += 8;
	while (*p && (*p != '/'))
		*server++ = *p++;
	*server = '\0';

	return 1;
}

/**********************************************/
int has_two_crlfs(char *s)
{
	int		l, n;
	char	*p;
	l = strlen(s);
	if (l < 4)
		return 0;
	n = 3;
	p = s + n;
	while (n < l) {
		if (s[n] != '\n')
			n += 1;
		else if (s[n-1] != '\r' || s[n-2] != '\n' || s[n-3] != '\r')
			n += 2;
		else
			return n+1;
	}
	return 0;
}


void send_rtsp_error(struct socket *sock, int refusal)
{ 

       char *refusal_string;

       EnterFunction("send_rtsp_error");
       
	switch (refusal) {
		case kServerNotFound:
 			refusal_string = "RTSP/1.0 462 Destination unreachable\r\n";
			break;
		case kUnknownError:
 			refusal_string = "RTSP/1.0 500 Unknown proxy error\r\n";
			break;
		case kPermissionDenied:
 			refusal_string = "RTSP/1.0 403 Proxy denied\r\n";
			break;
		case kTooManyUsers:
 			refusal_string = "RTSP/1.0 503 Too many proxy users\r\n";
			break;
		default:
 			refusal_string = "RTSP/1.0 500 Unknown proxy error\r\n";
			break;
	}

	(void)SendBuffer(sock, refusal_string, strlen(refusal_string));
	LeaveFunction("send_rtsp_error");
}

int str_casecmp(char *str1, char *str2)
{
	int	ret;
	
	ret = *str1 - *str2;
	while (*str1 && *str2 && ((ret = *str1++ - *str2++) == 0))
		;
	return ret;
}

int cmd_to_transaction_type(char *cmd)
{
	t_cmd_map	*map;
	map = cmd_map;
	while (map->cmd != NULL) {
		if (str_casecmp(map->cmd, cmd) == 0)
			return map->type;
		map++;
	}
	return ttNone;
}

/**********************************************/
int has_trackID(char *inp, int *trackID)
{
	int 	l;
	char	*p;
	l = strlen(inp);

	if (l < 18)		/* "RTSP/1.0" (8) + "trackID=n " (10) */
		return 0;
	if (strn_casecmp(inp + l - 8, "RTSP/1.0", 8) != 0)
		return 0;

	p = inp;
	while (p) {
		p = strchr(p, '=');
		if (p - 7 < inp) {
			p++;
			continue;
		}
		if (strn_casecmp(p - 7, "trackid=", 8) != 0) {
			p++;
			continue;
		}
		*trackID = atoi(p + 1);
		return 1;
	}
	return 0;
}


int track_id_to_idx(rtsp_session *s, int id)
{
	int i;
	for (i=0; i<s->numTracks; i++) {
		if (s->trk[i].ID == id)
			return i;
	}
	return -1;
}

/**********************************************/
int has_client_port(char *inp, unsigned short *port)
{
	int		l;
	char	*p;
	l = strlen(inp);

	if (l < 23)		/* "Transport:<>client_port=n" (23) */
		return 0;
	if (strn_casecmp(inp, "transport", 9) != 0)
		return 0;
	
	p = inp;
	while (p) {
		p = strchr(p, '=');
		if (p - 11 < inp) {
			p++;
			continue;
		}
		if (strn_casecmp(p - 11, "client_port=", 12) != 0) {
			p++;
			continue;
		}
		*port = atoi(p + 1);
		*++p = '\0';
		return 1;
	}
	return 0;
}


ipList *find_ip_in_list(ipList *list, unsigned int ip)
{
	ipList *cur = list;

      EnterFunction("find_ip_in_list");

	while (cur) {
	
		if (cur->ip == ip) {
			return cur;
		}
		cur = cur->next;
	}
      LeaveFunction("find_ip_in_list");
      return NULL;
}

shok *find_available_shok(unsigned int fromIP, unsigned int toIP, int withSib, const int CPUNR)
{	
	shok	*cur = threadinfo[CPUNR].gShokQueue;

	while (cur) {
		KRTSPROXYD_OUT(KERN_INFO " looking for IP %xin shok\n", toIP);
		if (find_ip_in_list(cur->ips, toIP) == NULL) {
			if (withSib) {
				KRTSPROXYD_OUT(KERN_INFO "looking for IP %x in SIB shok\n", toIP);
				if (find_ip_in_list(cur->sib->ips, toIP) == NULL)
					return cur;
			}
			else
				return cur;
		}
		cur = cur->next;
	}

	return NULL;
}

int add_ip_to_list(ipList **list, unsigned int ip)
{
	ipList	*newEl;

	newEl = (ipList*)kmalloc(sizeof(ipList), GFP_KERNEL);
	if (!newEl)
		return 0;
	newEl->ip = ip;
	newEl->what_to_do = NULL;
	newEl->what_to_do_it_with = NULL;
	newEl->next = *list;
	*list = newEl;

	return 1;
}

 struct socket *new_socket_tcp(void)
{
	struct socket *sock;
	int err;
	
       err = sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock);
      	
	if (err<0) 
       {
	     KRTSPROXYD_OUT(KERN_ERR "Error during creation of tcp socket; terminating\n");
	     sock_release(sock);
	     return NULL;
	}    
	atomic_inc(&gMaxPorts);
	return sock;
}

void set_socket_reuse_address(struct socket *skt)
{
	int i = 1;
	skt->sk->prot->setsockopt(skt->sk, SOL_SOCKET, SO_REUSEADDR, (char*)&i, sizeof(i));
}

/**********************************************/
static struct socket *new_socket_udp(void)
{
	struct socket *sock = NULL;
	int err;
	
       err = sock_create(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock);
	if (err<0) 
       {
	     KRTSPROXYD_OUT(KERN_ERR "Error during creation of udp socket; terminating\n");
	     sock_release(sock);
	     return NULL;
	}    
	atomic_inc(&gMaxPorts);
	return sock;
}

int bind_socket_to_address(struct socket *skt, unsigned int address, unsigned short port, int is_listener)
{
	struct sockaddr_in sin;
	int err;

	if (address == (unsigned int)0xFFFFFFF)
		address = INADDR_ANY;
		
	memset(&sin, 0, sizeof(sin));
	sin.sin_family = AF_INET;
	sin.sin_port = htons(port);
	sin.sin_addr.s_addr = address; //already is network byte order!

	err = skt->ops->bind(skt,(struct sockaddr*)&sin,sizeof(sin));
	if (err < 0)
	{
		KRTSPROXYD_OUT(KERN_ERR "kRtspProxyd: Error binding socket. This means that some other \n");
		KRTSPROXYD_OUT(KERN_ERR "        daemon is (or was a short time ago) using port %i.\n",port);
		return 0;	
	}

	/* Grrr... setsockopt() does this. */
//	skt->sk->reuse   = 1; //success!!
       return 1;
}

//fromIp and toIp are all NBO
shok *make_new_shok(unsigned int fromIP, unsigned int toIP, int withSib, const int CPUNR)
{
	shok *theShok1 = NULL, *theShok2 = NULL;
	struct socket *skt1 = NULL, *skt2 = NULL;
	unsigned short port1 = (unsigned short)0xFFFF, port2 = (unsigned short)0xFFFF;

	theShok1 = (shok*)kmalloc(sizeof(shok), GFP_KERNEL);
	if (!theShok1)
		goto bail_error;
	if (withSib) {
		theShok2 = (shok*)kmalloc(sizeof(shok), GFP_KERNEL);
		if (!theShok2)
			goto bail_error;
	}

	if (atomic_read(&gNextPort) == -1)
		atomic_set(&gNextPort, gUDPPortMin);

retry:

	if ((skt1 = new_socket_udp()) == NULL)
		goto bail_error;

       	if ((atomic_read(&gNextPort) & 0x1) && withSib) //odd number
			atomic_inc(&gNextPort);
		if (atomic_read(&gNextPort) > gUDPPortMax)
          		atomic_set(&gNextPort, gUDPPortMin);
 while (bind_socket_to_address(skt1, fromIP, port1 = atomic_read(&gNextPort), 0) != 1)
 	{
 	    atomic_inc(&gNextPort);
 	    if ((atomic_read(&gNextPort) & 0x1) && withSib) //odd number
			atomic_inc(&gNextPort);
		if (atomic_read(&gNextPort) > gUDPPortMax)
          		atomic_set(&gNextPort, gUDPPortMin);
 	}
 atomic_inc(&gNextPort);

 if (withSib) {
       	if ((skt2 = new_socket_udp()) == NULL)
			goto bail_error;

		if (bind_socket_to_address(skt2, fromIP, port2 = atomic_read(&gNextPort), 0) != 1) {
			sock_release(skt1);
			sock_release(skt2);
			skt1 = NULL;
			skt2 = NULL;
			atomic_inc(&gNextPort);
			goto retry;
		}
		else atomic_inc(&gNextPort);
	}

       make_socket_nonblocking(skt1);
	theShok1->socket = skt1;
	theShok1->port = port1;
	theShok1->ips = NULL;

	if (withSib) {
              make_socket_nonblocking(skt2);

		theShok2->socket = skt2;
		theShok2->port = port2;
		theShok2->ips = NULL;
		theShok2->sib = theShok1;

		theShok1->sib = theShok2;
		theShok1->next = theShok2;
		theShok2->next = threadinfo[CPUNR].gShokQueue;
	}
	else {
		theShok1->sib = NULL;
		theShok1->next = threadinfo[CPUNR].gShokQueue;
	}

	add_ips_to_shok(theShok1, fromIP, toIP, withSib);
	threadinfo[CPUNR].gShokQueue = theShok1;

	return theShok1;	

bail_error:
	sock_release(skt1);
	sock_release(skt2);
	if (theShok1 != NULL)
		kfree(theShok1);
	if (theShok2 != NULL)
		kfree(theShok2);
	return NULL;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区二区三区四区 | 成人黄色免费短视频| 5月丁香婷婷综合| 五月天中文字幕一区二区| 色一区在线观看| 亚洲欧美另类小说| 欧美亚洲综合在线| 天天av天天翘天天综合网色鬼国产| 欧美三区在线观看| 日韩精品午夜视频| 久久综合狠狠综合久久综合88| 国产一区二区久久| 中文av一区特黄| 91国在线观看| 日本sm残虐另类| 国产欧美精品在线观看| av在线不卡网| 亚洲成av人片一区二区三区| 91精品久久久久久蜜臀| 国产精品一区三区| 18欧美乱大交hd1984| 欧美色老头old∨ideo| 精品一区二区三区久久| 欧美激情中文字幕一区二区| 色婷婷av一区二区三区大白胸| 日日摸夜夜添夜夜添精品视频 | 欧美喷潮久久久xxxxx| 青青草国产成人99久久| 国产色综合一区| 欧美少妇bbb| 国产一区二区三区高清播放| 久久精品欧美日韩| 日本道免费精品一区二区三区| 青青草一区二区三区| 国产欧美日韩综合| 欧美精品一卡二卡| 国产成人自拍网| 午夜精品久久久久久久久久| 久久久久高清精品| 欧美影视一区二区三区| 国产九色sp调教91| 亚洲成a人v欧美综合天堂| 久久综合资源网| 777欧美精品| 99精品一区二区三区| 看电视剧不卡顿的网站| 亚洲欧美一区二区三区久本道91| 日韩女优av电影| 欧美中文字幕不卡| 高清日韩电视剧大全免费| 免费三级欧美电影| 亚洲日本乱码在线观看| 久久久综合视频| 日韩一区二区电影在线| 欧美羞羞免费网站| 不卡av在线网| 国产经典欧美精品| 奇米影视一区二区三区小说| 一区二区三区欧美久久| 日本一区二区成人在线| 欧美不卡视频一区| 538在线一区二区精品国产| 91亚洲国产成人精品一区二三| 国内精品国产成人国产三级粉色| 亚洲高清免费视频| 亚洲一区二区精品视频| 自拍偷拍亚洲欧美日韩| 中文字幕精品一区二区精品绿巨人| 日韩无一区二区| 欧美久久久久久久久久| 欧美一区二区三区在线视频| 色94色欧美sute亚洲线路一ni | 亚洲精品综合在线| 国产欧美精品一区| 久久精品视频免费| 久久精品视频一区二区三区| 精品美女在线播放| 欧美成人午夜电影| www国产亚洲精品久久麻豆| 精品国产一区二区三区久久久蜜月 | 成人久久久精品乱码一区二区三区| 国产在线精品一区二区不卡了| 久久国产精品99久久久久久老狼| 日本成人中文字幕在线视频| 肉色丝袜一区二区| 日韩精品三区四区| 精品亚洲成a人| 国内精品久久久久影院色| 国产一区二区不卡老阿姨| 国产乱色国产精品免费视频| 国产成人在线观看| va亚洲va日韩不卡在线观看| 成熟亚洲日本毛茸茸凸凹| 成人丝袜高跟foot| 91久久精品一区二区二区| 日本丶国产丶欧美色综合| 欧美日韩免费观看一区二区三区| 欧亚一区二区三区| 欧美高清视频www夜色资源网| 91精品国产一区二区三区| 亚洲精品一区二区三区香蕉| 久久无码av三级| 中文字幕日韩一区| 亚洲电影一级黄| 国产一区二区三区观看| 成人激情免费网站| 欧美三区在线观看| 精品99999| 日韩久久一区二区| 蜜臀精品久久久久久蜜臀 | 国产精品欧美经典| 亚洲va欧美va人人爽| 激情伊人五月天久久综合| 成人黄色在线视频| 欧美日韩一级黄| 久久久噜噜噜久噜久久综合| 日韩伦理av电影| 国产电影精品久久禁18| 成人国产视频在线观看| 717成人午夜免费福利电影| 久久久久国产精品人| 一区二区三区中文在线| 久久99精品国产.久久久久久 | 欧美电视剧免费全集观看| 欧美国产精品中文字幕| 亚洲va欧美va天堂v国产综合| 国产在线精品一区二区不卡了| 一本久久a久久免费精品不卡| 欧美一区二区成人6969| 国产精品久久久久久久久果冻传媒| 日韩国产在线一| 99国产精品一区| 精品黑人一区二区三区久久| 亚洲精品大片www| 国产在线视视频有精品| 精品视频色一区| 国产精品初高中害羞小美女文| 天堂av在线一区| 色偷偷成人一区二区三区91| 久久蜜桃一区二区| 美女尤物国产一区| 欧美日韩大陆一区二区| 亚洲色图一区二区| 欧美伦理视频网站| 中文字幕亚洲不卡| 欧美一级片在线| 天堂在线一区二区| 欧美日韩一区二区在线视频| 日韩欧美黄色影院| 欧美aa在线视频| 欧美男男青年gay1069videost| 99re成人精品视频| 2014亚洲片线观看视频免费| 久久99国产精品久久99果冻传媒| 国产一区二区h| 精品第一国产综合精品aⅴ| 欧美体内she精视频| 国产亚洲精品福利| 午夜精品一区二区三区三上悠亚| 99re成人精品视频| 中文字幕+乱码+中文字幕一区| 精品一区二区三区在线播放| 欧美日韩精品免费观看视频| 国产精品久久久久久久久免费桃花 | 国产精品三级视频| 成人免费在线视频| 福利一区二区在线| 国产精品久久久久久久久果冻传媒| 理论电影国产精品| 欧美xxx久久| 日本欧美一区二区在线观看| 欧美理论片在线| 一区二区三区毛片| 色婷婷av一区二区三区软件| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 国产精品自拍在线| 久久久精品免费免费| 蜜桃传媒麻豆第一区在线观看| 欧美综合一区二区三区| 国产日韩欧美精品电影三级在线| 免费在线视频一区| 日韩欧美在线1卡| 青青草91视频| 日韩欧美美女一区二区三区| 丝袜脚交一区二区| 欧美中文字幕久久| 亚洲一二三四在线| 91精品黄色片免费大全| 亚洲精品免费在线观看| 欧美日韩不卡视频| 免费成人美女在线观看.| 日韩一本二本av| 久久综合色天天久久综合图片| 国产美女久久久久| 黄色资源网久久资源365| 9i看片成人免费高清| 亚洲国产精品一区二区久久| 久久精品日韩一区二区三区| 欧美日韩精品系列| 北岛玲一区二区三区四区|