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

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

?? axsock.c

?? uCLinux下的一個TCP/IP協(xié)議棧源碼
?? C
字號:
#include <errno.h>
#include "global.h"
#include "mbuf.h"
#include "lapb.h"
#include "ax25.h"
#include "socket.h"
#include "usock.h"

char Ax25_eol[] = "\r";

static void autobind(struct usock *up);

/* The following two variables are needed because there can be only one
 * socket listening on each of the AX.25 modes (I and UI)
 */
int Axi_sock = -1;	/* Socket number listening for AX25 connections */
static int Axui_sock = -1;	/* Socket number listening for AX25 UI frames */
static struct mbuf *Bcq;	/* Queue of incoming UI frames */

/* Function that handles incoming UI frames from lapb.c */
void
beac_input(
struct iface *iface,
uint8 *src,
struct mbuf **bpp
){
	struct mbuf *hdr;
	struct sockaddr_ax *sax;

	if(Axui_sock == -1){
		/* Nobody there to read it */
		free_p(bpp);
	} else {
		pushdown(&hdr,NULL,sizeof(struct sockaddr_ax));
		sax = (struct sockaddr_ax *)hdr->data;
		sax->sax_family = AF_AX25;
		memcpy(sax->ax25_addr,src,AXALEN);
		strncpy(sax->iface,iface->name,ILEN);
		hdr->next = (*bpp);
		*bpp = NULL;
		enqueue(&Bcq,&hdr);
	}
}
int
so_ax_sock(
struct usock *up,
int protocol
){
	return 0;
}
int
so_axui_sock(
struct usock *up,
int protocol
){
	return 0;
}

int
so_axui_bind(
struct usock *up
){
	if(Axui_sock != -1){
		errno = EADDRINUSE;
		return -1;
	}
	Axui_sock = up->index;
	return 0;
}
int
so_ax_listen(
struct usock *up,
int backlog
){
	struct sockaddr_ax *local;

	if(up->name == NULL)
		autobind(up);
	if(up != itop(Axi_sock)){
		errno = EOPNOTSUPP;
		return -1;
	}
	local = (struct sockaddr_ax *)up->name;
	up->cb.ax25 = open_ax25(NULL,local->ax25_addr,NULL,
	 backlog ? AX_SERVER:AX_PASSIVE,0,
	 s_arcall,s_atcall,s_ascall,Axi_sock);
	return 0;
}
int
so_ax_conn(
struct usock *up
){
	struct sockaddr_ax *local,*remote,localtmp;
	struct ax25_cb *ax25;
	struct iface *iface;
	int s;

	s = up->index;
	remote = (struct sockaddr_ax *)up->peername;
	if((iface = if_lookup(remote->iface)) == NULL){
		errno = EINVAL;
		return -1;
	}
	local = (struct sockaddr_ax *)up->name;
	if(local == NULL){
		/* The local address was unspecified; set it from
		 * the interface we'll use
		 */
		localtmp.sax_family = AF_AX25;
		memcpy(localtmp.ax25_addr,iface->hwaddr,AXALEN);
		memcpy(localtmp.iface,remote->iface,ILEN);
		bind(s,(struct sockaddr *)&localtmp,sizeof(localtmp));
		local = (struct sockaddr_ax *)up->name;
	}
	/* If we already have an AX25 link we can use it */
	if((up->cb.ax25 = find_ax25(remote->ax25_addr)) != NULL
	   && up->cb.ax25->state != LAPB_DISCONNECTED &&
	   up->cb.ax25->user == -1) {
		up->cb.ax25->user = s;
		up->cb.ax25->r_upcall = s_arcall;
		up->cb.ax25->t_upcall = s_atcall;
		up->cb.ax25->s_upcall = s_ascall;
		if(up->cb.ax25->state == LAPB_CONNECTED
		   || up->cb.ax25->state == LAPB_RECOVERY)
		    	return 0;
	} else {
		up->cb.ax25 = open_ax25(iface,local->ax25_addr,
		 remote->ax25_addr,AX_ACTIVE,
		 Axwindow,s_arcall,s_atcall,s_ascall,s);
	}
	/* Wait for the connection to complete */
	while((ax25 = up->cb.ax25) != NULL && ax25->state != LAPB_CONNECTED){
		if(up->noblock){
			errno = EWOULDBLOCK;
			return -1;
		} else if((errno = kwait(up)) != 0){
			return -1;
		}
	}
	if(ax25 == NULL){
		/* Connection probably already exists */
		free(up->peername);
		up->peername = NULL;
		errno = ECONNREFUSED;
		return -1;
	}
	return 0;
}
int
so_axui_conn(
struct usock *up
){
	if(up->name == NULL)
		autobind(up);
	return 0;
}

int
so_ax_recv(
struct usock *up,
struct mbuf **bpp,
struct sockaddr *from,
int *fromlen
){
	struct ax25_cb *ax25;
	int cnt;
	
	while((ax25 = up->cb.ax25) != NULL
	 && (*bpp = recv_ax25(ax25,(uint16)0)) == NULL){
		if(up->noblock){
			errno = EWOULDBLOCK;
			return -1;
		} else if((errno = kwait(up)) != 0){
			return -1;
		}
	}
	if(ax25 == NULL){
		/* Connection went away */
		errno = ENOTCONN;
		return -1;
	}
	cnt = (*bpp)->cnt;
	return cnt;
}
int
so_axui_recv(
struct usock *up,
struct mbuf **bpp,
struct sockaddr *from,
int *fromlen
){
	int s;

	s = up->index;

	while(s == Axui_sock && Bcq == NULL){
		if(up->noblock){
			errno = EWOULDBLOCK;
			return -1;
		} else if((errno = kwait(&Bcq)) != 0){
			return -1;
		}
	}
	if(s != Axui_sock){
		errno = ENOTCONN;
		return -1;
	}
	*bpp = dequeue(&Bcq);

	if(from != NULL && fromlen != NULL
	   && *fromlen >= sizeof(struct sockaddr_ax)){
		pullup(bpp,from,sizeof(struct sockaddr_ax));
		*fromlen = sizeof(struct sockaddr_ax);
	} else {
		pullup(bpp,NULL,sizeof(struct sockaddr_ax));
	}
	return len_p(*bpp);
}
int	
so_ax_send(
struct usock *up,
struct mbuf **bpp,
struct sockaddr *to
){
	struct ax25_cb *ax25;

	if((ax25 = up->cb.ax25) == NULL){
		free_p(bpp);
		errno = ENOTCONN;
		return -1;
	}
	send_ax25(ax25,bpp,PID_NO_L3);

	while((ax25 = up->cb.ax25) != NULL &&
	 len_q(ax25->txq) * ax25->paclen > ax25->window){
		if(up->noblock){
			errno = EWOULDBLOCK;
			return -1;
		} else if((errno = kwait(up)) != 0){
			return -1;
		}
	}
	if(ax25 == NULL){
		errno = EBADF;
		return -1;
	}
	return 0;
}
int	
so_axui_send(
struct usock *up,
struct mbuf **bpp,
struct sockaddr *to
){
	struct sockaddr_ax *local,*remote;

	local = (struct sockaddr_ax *)up->name;
	if(to != NULL)
		remote = (struct sockaddr_ax *)to;
	else if(up->peername != NULL){
		remote = (struct sockaddr_ax *)up->peername;
	} else {
		free_p(bpp);
		errno = ENOTCONN;
		return -1;
	}
	ax_output(if_lookup(remote->iface),remote->ax25_addr,
	  local->ax25_addr,PID_NO_L3,bpp);
	return 0;
}

int
so_ax_qlen(
struct usock *up,
int rtx
){
	int len;

	if(up->cb.ax25 == NULL){
		errno = ENOTCONN;
		return -1;
	}
	switch(rtx){
	case 0:
		len = len_p(up->cb.ax25->rxq);
		break;
	case 1:	/* Number of packets, not bytes */
		len = len_q(up->cb.ax25->txq);
	}
	return len;
}
int
so_axui_qlen(
struct usock *up,
int rtx
){
	int len;

	switch(rtx){	
	case 0:
		len = len_q(Bcq);
		break;
	case 1:
		len = 0;		
		break;
	}
	return len;
}
int
so_ax_kick(
struct usock *up
){
	if(up->cb.ax25 != NULL)
		kick_ax25(up->cb.ax25);
	return 0;
}
int
so_ax_shut(
struct usock *up,
int how
){
	if(up->cb.ax25 == NULL)
		return 0;
	switch(how){
	case 0:
	case 1:	/* Attempt regular disconnect */
		disc_ax25(up->cb.ax25);
		break;
	case 2: /* Blow it away */
		reset_ax25(up->cb.ax25);
		up->cb.ax25 = NULL;
		break;
	}
	return 0;	
}
int
so_ax_close(
struct usock *up
){
	if(up->cb.ax25 != NULL){
		/* Tell the CLOSED upcall there's no more socket */
		up->cb.ax25->user = -1;
		disc_ax25(up->cb.ax25);
	}
	return 0;
}
int
so_axui_close(
struct usock *up
){
	Axui_sock = -1;
	free_q(&Bcq);
	ksignal(&Bcq,0);	/* Unblock any reads */
	return 0;
}
/* AX.25 receive upcall */
void
s_arcall(
struct ax25_cb *axp,
int cnt
){
	int ns;
	struct usock *up,*nup,*oup;
	union sp sp;

	up = itop(axp->user);
	/* When AX.25 data arrives for the first time the AX.25 listener
	   is notified, if active. If the AX.25 listener is a server its
	   socket is duplicated in the same manner as in s_tscall().
	 */
	if (Axi_sock != -1 && axp->user == -1) {
		oup = up = itop(Axi_sock);
		/* From now on, use the same upcalls as the listener */
		axp->t_upcall = up->cb.ax25->t_upcall;
		axp->r_upcall = up->cb.ax25->r_upcall;
		axp->s_upcall = up->cb.ax25->s_upcall;
		if (up->cb.ax25->flags.clone) {
			/* Clone the socket */
			ns = socket(AF_AX25,SOCK_STREAM,0);
			nup = itop(ns);
			ASSIGN(*nup,*up);
			axp->user = ns;
			nup->cb.ax25 = axp;
			/* Allocate new memory for the name areas */
			nup->name = mallocw(sizeof(struct sockaddr_ax));
			nup->peername = mallocw(sizeof(struct sockaddr_ax));
			/* Store the new socket # in the old one */
			up->rdysock = ns;
			up = nup;
		} else {
			axp->user = Axi_sock;
			del_ax25(up->cb.ax25);
			up->cb.ax25 = axp;
			/* Allocate space for the peer's name */
			up->peername = mallocw(sizeof(struct sockaddr_ax));
			/* Store the old socket # in the old socket */
			up->rdysock = Axi_sock;
		}
		/* Load the addresses. Memory for the name has already
		 * been allocated, either above or in the original bind.
		 */
		sp.ax = (struct sockaddr_ax *)up->name;
		sp.ax->sax_family = AF_AX25;
		memcpy(sp.ax->ax25_addr,axp->local,AXALEN);
		memcpy(sp.ax->iface,axp->iface->name,ILEN);
		up->namelen = sizeof(struct sockaddr_ax);

		sp.ax = (struct sockaddr_ax *)up->peername;
		sp.ax->sax_family = AF_AX25;
		memcpy(sp.ax->ax25_addr,axp->remote,AXALEN);
		memcpy(sp.ax->iface,axp->iface->name,ILEN);
		up->peernamelen = sizeof(struct sockaddr_ax);
		/* Wake up the guy accepting it, and let him run */
		ksignal(oup,1);
		kwait(NULL);
		return;
	}
	/* Wake up anyone waiting, and let them run */
	ksignal(up,1);
	kwait(NULL);
}
/* AX.25 transmit upcall */
void
s_atcall(
struct ax25_cb *axp,
int cnt
){
	/* Wake up anyone waiting, and let them run */
	ksignal(itop(axp->user),1);
	kwait(NULL);
}
/* AX25 state change upcall routine */
void
s_ascall(
register struct ax25_cb *axp,
int old,
int new
){
	int s;
	struct usock *up;

	s = axp->user;
	up = itop(s);

	switch(new){
	case LAPB_DISCONNECTED:
		/* Clean up. If the user has already closed the socket,
		 * then up will be null (s was set to -1 by the close routine).
		 * If not, then this is an abnormal close (e.g., a reset)
		 * and clearing out the pointer in the socket structure will
		 * prevent any further operations on what will be a freed
		 * control block. Also wake up anybody waiting on events
		 * related to this block so they will notice it disappearing.
		 */
		if(up != NULL){
			up->errcodes[0] = axp->reason;
			up->cb.ax25 = NULL;
		}
		del_ax25(axp);
		break;
	default:	/* Other transitions are ignored */
		break;
	}
	ksignal(up,0);	/* In case anybody's waiting */
}

/* Issue an automatic bind of a local AX25 address */
static void
autobind(
struct usock *up
){
	struct sockaddr_ax local;
	int s;

	s = up->index;
	local.sax_family = AF_AX25;
	memcpy(local.ax25_addr,Mycall,AXALEN);
	bind(s,(struct sockaddr *)&local,sizeof(struct sockaddr_ax));
}
int
checkaxaddr(
struct sockaddr *name,
int namelen
){
	struct sockaddr_ax *sock;

	sock = (struct sockaddr_ax *)name;
	if(sock->sax_family != AF_AX25 || namelen != sizeof(struct sockaddr_ax))
		return -1;
	return 0;
}
char *
axpsocket(
struct sockaddr *p
){
	struct sockaddr_ax *axp;
	static char buf[30];
	char tmp[11];

	axp = (struct sockaddr_ax *)p;
	pax25(tmp,axp->ax25_addr);
	if(strlen(axp->iface) != 0)
		sprintf(buf,"%s on %s",tmp,axp->iface);
	else
		strcpy(buf,tmp);
	return buf;
}
char *
axstate(
struct usock *up
){
	return Ax25states[up->cb.ax25->state];	
}
so_ax_stat(
struct usock *up
){
	st_ax25(up->cb.ax25);
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
性久久久久久久久久久久 | 成人禁用看黄a在线| 日韩欧美一区在线| 麻豆国产欧美日韩综合精品二区| 884aa四虎影成人精品一区| 青青国产91久久久久久| 欧美成人福利视频| 国产成人av电影在线| 亚洲欧美综合在线精品| 欧美视频中文一区二区三区在线观看| 亚洲午夜在线视频| 日韩免费看的电影| 国产成人精品www牛牛影视| 专区另类欧美日韩| 欧美日本视频在线| 国产精品亚洲午夜一区二区三区 | 欧美三级视频在线播放| 婷婷成人综合网| 久久女同性恋中文字幕| 99久久精品国产毛片| 五月开心婷婷久久| 国产亚洲精品超碰| 欧美色偷偷大香| 国产一区二区三区免费在线观看| 亚洲天堂2016| 欧美一区二区三区白人| 成人va在线观看| 五月天婷婷综合| 国产蜜臀av在线一区二区三区| 91啦中文在线观看| 美腿丝袜在线亚洲一区| 自拍偷自拍亚洲精品播放| 91精品国产乱| 一本到一区二区三区| 久久成人免费日本黄色| 亚洲男帅同性gay1069| 欧美www视频| 色视频欧美一区二区三区| 精品中文字幕一区二区| 一区二区在线观看不卡| 久久精品这里都是精品| 精品视频1区2区3区| 成人丝袜高跟foot| 免费观看成人av| 亚洲欧洲综合另类| 国产三级精品三级| 欧美一区二区三区免费在线看 | 在线视频你懂得一区二区三区| 久久国产精品色| 亚洲午夜电影在线| 国产精品久久午夜夜伦鲁鲁| 精品久久国产老人久久综合| 欧美性猛交xxxx黑人交| 成人黄色网址在线观看| 久草这里只有精品视频| 婷婷综合五月天| 亚洲伦理在线免费看| 亚洲国产成人一区二区三区| 欧美成人伊人久久综合网| 欧美挠脚心视频网站| 日本久久一区二区三区| 成人一区二区三区视频 | 蜜桃精品在线观看| 亚洲国产精品嫩草影院| 自拍偷在线精品自拍偷无码专区| 国产视频一区在线播放| 精品91自产拍在线观看一区| 欧美精品1区2区3区| 欧美性生活一区| 91黄色在线观看| 91极品视觉盛宴| 色欧美乱欧美15图片| 一本大道久久a久久精品综合| 成人晚上爱看视频| 波多野结衣欧美| 成人免费电影视频| a美女胸又www黄视频久久| 福利电影一区二区三区| 国产91丝袜在线播放0| 国产成人精品免费| 成人激情文学综合网| 99在线精品一区二区三区| a亚洲天堂av| 一本到高清视频免费精品| 91久久精品日日躁夜夜躁欧美| 在线中文字幕一区二区| 在线观看视频一区| 精品1区2区3区| 日韩一区二区三区视频在线观看| 日韩女优电影在线观看| 久久久高清一区二区三区| 国产日韩欧美综合一区| 国产精品丝袜一区| 亚洲精品老司机| 日韩国产欧美视频| 韩国v欧美v日本v亚洲v| 成人激情电影免费在线观看| 91视频国产资源| 欧美日韩国产片| 精品久久国产老人久久综合| 亚洲国产精品成人综合色在线婷婷| 亚洲欧洲日韩av| 午夜精品久久久久久久久久久 | 91高清在线观看| 在线不卡一区二区| 久久这里只有精品首页| 《视频一区视频二区| 亚洲第一激情av| 国产专区欧美精品| 91免费观看国产| 欧美一级黄色大片| 欧美韩日一区二区三区四区| 亚洲日本青草视频在线怡红院| 亚洲国产日韩a在线播放性色| 麻豆精品国产传媒mv男同| 国产精品69毛片高清亚洲| 一本色道久久综合亚洲91| 欧美一区二区视频在线观看2020| 久久久三级国产网站| 1024亚洲合集| 麻豆精品国产传媒mv男同| 波多野结衣在线一区| 91精品婷婷国产综合久久性色| 国产精品婷婷午夜在线观看| 天天综合天天做天天综合| 国产一区福利在线| 精品视频一区二区三区免费| 久久精品视频一区二区| 香蕉成人啪国产精品视频综合网 | 中文字幕在线不卡视频| 日韩一区精品视频| www.久久久久久久久| 日韩精品一区二| 亚洲大尺度视频在线观看| 成人三级在线视频| 欧美成人精品3d动漫h| 亚洲综合一二区| av在线不卡免费看| 精品久久久久av影院 | 在线播放欧美女士性生活| 国产精品视频免费| 麻豆成人综合网| 欧美日韩国产一级二级| 亚洲精品日产精品乱码不卡| 国内精品国产成人| 91精品国产综合久久精品图片| 亚洲视频电影在线| 国产成人免费视频网站 | www精品美女久久久tv| 香蕉乱码成人久久天堂爱免费| 99久久综合色| 国产精品视频一区二区三区不卡| 久久激五月天综合精品| 91精品福利在线一区二区三区 | 国产午夜精品理论片a级大结局| 日韩国产成人精品| 日本高清成人免费播放| 中文字幕亚洲一区二区va在线| 国产成人av电影在线播放| 久久久久久影视| 国产剧情一区二区| 久久奇米777| 国产河南妇女毛片精品久久久| 欧美不卡在线视频| 紧缚奴在线一区二区三区| 日韩精品一区二区三区老鸭窝| 美国十次综合导航| 日韩精品在线看片z| 九九九精品视频| 国产亚洲短视频| 丁香激情综合国产| 18成人在线观看| 色吊一区二区三区| 亚洲综合一二区| 6080日韩午夜伦伦午夜伦| 五月激情综合婷婷| 日韩一卡二卡三卡四卡| 免费在线欧美视频| 久久蜜臀中文字幕| www.亚洲国产| 一区二区三区在线视频观看58| 色综合天天综合狠狠| 一级女性全黄久久生活片免费| 欧美日韩一区视频| 麻豆精品一区二区综合av| 久久九九久久九九| 99久久精品国产观看| 亚洲夂夂婷婷色拍ww47| 欧美一区二区成人| 国产九色精品成人porny | 91丨porny丨在线| 一区二区免费看| 欧美一二三区精品| 国产伦理精品不卡| 亚洲精品视频在线观看免费| 在线电影一区二区三区| 国产尤物一区二区在线| 18欧美亚洲精品| 欧美一区二区精品在线| 成人在线一区二区三区|