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

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

?? txqueue.c

?? AnyQ服務(wù)端源代碼(2004/10/28)源碼
?? C
字號:
/* *  aim_txqueue.c * * Herein lies all the mangement routines for the transmit (Tx) queue. * */#define FAIM_INTERNAL#include <aim.h>#include <pth.h>#ifndef _WIN32#include <sys/socket.h>#endif/* * Allocate a new tx frame. * * This is more for looks than anything else. * * Right now, that is.  If/when we implement a pool of transmit * frames, this will become the request-an-unused-frame part. * * framing = AIM_FRAMETYPE_OFT/FLAP * chan = channel for FLAP, hdrtype for OFT * */faim_internal aim_frame_t *aim_tx_new(aim_session_t *sess, aim_conn_t *conn, fu8_t framing, fu8_t chan, int datalen){	aim_frame_t *fr;	if (!conn) {		faimdprintf(sess, 0, "aim_tx_new: ERROR: no connection specified\n");		return NULL;	}	/* For sanity... */	if ((conn->type == AIM_CONN_TYPE_RENDEZVOUS) || 			(conn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT)) {		if (framing != AIM_FRAMETYPE_OFT) {			faimdprintf(sess, 0, "aim_tx_new: attempted to allocate inappropriate frame type for rendezvous connection\n");			return NULL;		}	} else {		if (framing != AIM_FRAMETYPE_FLAP) {			faimdprintf(sess, 0, "aim_tx_new: attempted to allocate inappropriate frame type for FLAP connection\n");			return NULL;		}	}	if (!(fr = (aim_frame_t *)malloc(sizeof(aim_frame_t))))		return NULL;	memset(fr, 0, sizeof(aim_frame_t));	fr->conn = conn; 	fr->hdrtype = framing;	if (fr->hdrtype == AIM_FRAMETYPE_FLAP) {		fr->hdr.flap.type = chan;	} else if (fr->hdrtype == AIM_FRAMETYPE_OFT) {		fr->hdr.oft.type = chan;		fr->hdr.oft.hdr2len = 0; /* this will get setup by caller */	} else 		faimdprintf(sess, 0, "tx_new: unknown framing\n");	if (datalen > 0) {		fu8_t *data;		if (!(data = (unsigned char *)malloc(datalen))) {			aim_frame_destroy(fr);			return NULL;		}		aim_bstream_init(&fr->data, data, datalen);	}	return fr;}/* * aim_tx_enqeue__queuebased() * * The overall purpose here is to enqueue the passed in command struct * into the outgoing (tx) queue.  Basically... *   1) Make a scope-irrelevent copy of the struct *   3) Mark as not-sent-yet *   4) Enqueue the struct into the list *   6) Return * * Note that this is only used when doing queue-based transmitting; * that is, when sess->tx_enqueue is set to &aim_tx_enqueue__queuebased. * */static int aim_tx_enqueue__queuebased(aim_session_t *sess, aim_frame_t *fr){	if (!fr->conn) {		faimdprintf(sess, 1, "aim_tx_enqueue: WARNING: enqueueing packet with no connecetion\n");		fr->conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS);	}	if (fr->hdrtype == AIM_FRAMETYPE_FLAP) {		/* assign seqnum -- XXX should really not assign until hardxmit */		fr->hdr.flap.seqnum = aim_get_next_txseqnum(fr->conn);	}	fr->handled = 0; /* not sent yet */	/* see overhead note in aim_rxqueue counterpart */	if (!sess->queue_outgoing)		sess->queue_outgoing = fr;	else {		aim_frame_t *cur;		for (cur = sess->queue_outgoing; cur->next; cur = cur->next)			;		cur->next = fr;	}	return 0;}/* * aim_tx_enqueue__immediate() * * Parallel to aim_tx_enqueue__queuebased, however, this bypasses * the whole queue mess when you want immediate writes to happen. * * Basically the same as its __queuebased couterpart, however * instead of doing a list append, it just calls aim_tx_sendframe() * right here.  *  */static int aim_tx_enqueue__immediate(aim_session_t *sess, aim_frame_t *fr){	if (!fr->conn) {		faimdprintf(sess, 1, "aim_tx_enqueue: ERROR: packet has no connection\n");		aim_frame_destroy(fr);		return 0;	}	if (fr->hdrtype == AIM_FRAMETYPE_FLAP)		fr->hdr.flap.seqnum = aim_get_next_txseqnum(fr->conn);	fr->handled = 0; /* not sent yet */	aim_tx_sendframe(sess, fr);	aim_frame_destroy(fr);	return 0;}faim_export int aim_tx_setenqueue(aim_session_t *sess, int what, int (*func)(aim_session_t *, aim_frame_t *)){		if (what == AIM_TX_QUEUED)		sess->tx_enqueue = &aim_tx_enqueue__queuebased;	else if (what == AIM_TX_IMMEDIATE) 		sess->tx_enqueue = &aim_tx_enqueue__immediate;	else if (what == AIM_TX_USER) {		if (!func)			return -EINVAL;		sess->tx_enqueue = func;	} else		return -EINVAL; /* unknown action */	return 0;}faim_internal int aim_tx_enqueue(aim_session_t *sess, aim_frame_t *fr){		/*	 * If we want to send a connection thats inprogress, we have to force	 * them to use the queue based version. Otherwise, use whatever they	 * want.	 */	if (fr && fr->conn && 			(fr->conn->status & AIM_CONN_STATUS_INPROGRESS)) {		return aim_tx_enqueue__queuebased(sess, fr);	}	return (*sess->tx_enqueue)(sess, fr);}/*  *  aim_get_next_txseqnum() * *   This increments the tx command count, and returns the seqnum *   that should be stamped on the next FLAP packet sent.  This is *   normally called during the final step of packet preparation *   before enqueuement (in aim_tx_enqueue()). * */faim_internal flap_seqnum_t aim_get_next_txseqnum(aim_conn_t *conn){	flap_seqnum_t ret;		ret = ++conn->seqnum;	return ret;}static int aim_send(int fd, const void *buf, size_t count){	int left, cur;	for (cur = 0, left = count; left; ) {		int ret;		ret = send(fd, ((unsigned char *)buf)+cur, left, 0);		if (ret == -1)			return -1;		else if (ret == 0)			return cur;		cur += ret;		left -= ret;	}	return cur;}static int aim_bstream_send(aim_bstream_t *bs, aim_conn_t *conn, size_t count){	int wrote = 0;	if (!bs || !conn || (count < 0))		return -EINVAL;	if (count > aim_bstream_empty(bs))		count = aim_bstream_empty(bs); /* truncate to remaining space */	if (count)		wrote = aim_send(conn->fd, bs->data + bs->offset, count);	if (((aim_session_t *)conn->sessv)->debug >= 2) {		int i;		aim_session_t *sess = (aim_session_t *)conn->sessv;		faimdprintf(sess, 2, "\nOutgoing data: (%d bytes)", wrote);		for (i = 0; i < wrote; i++) {			if (!(i % 8)) 				faimdprintf(sess, 2, "\n\t");			faimdprintf(sess, 2, "0x%02x ", *(bs->data + bs->offset + i));		}		faimdprintf(sess, 2, "\n");	}	bs->offset += wrote;	return wrote;	}static int sendframe_flap(aim_session_t *sess, aim_frame_t *fr){	aim_bstream_t obs;	fu8_t *obs_raw;	int payloadlen, err = 0, obslen;	payloadlen = aim_bstream_curpos(&fr->data);	if (!(obs_raw = malloc(6 + payloadlen)))		return -ENOMEM;	aim_bstream_init(&obs, obs_raw, 6 + payloadlen);	/* FLAP header */	aimbs_put8(&obs, 0x2a);	aimbs_put8(&obs, fr->hdr.flap.type);	aimbs_put16(&obs, fr->hdr.flap.seqnum);	aimbs_put16(&obs, payloadlen);	/* payload */	aim_bstream_rewind(&fr->data);	aimbs_putbs(&obs, &fr->data, payloadlen);	obslen = aim_bstream_curpos(&obs);	aim_bstream_rewind(&obs);	if (aim_bstream_send(&obs, fr->conn, obslen) != obslen)		err = -errno;		free(obs_raw); /* XXX aim_bstream_free */	fr->handled = 1;	fr->conn->lastactivity = time(NULL);	return err;}static int sendframe_oft(aim_session_t *sess, aim_frame_t *fr){	aim_bstream_t hbs;	fu8_t *hbs_raw;	int hbslen;	int err = 0;	hbslen = 8 + fr->hdr.oft.hdr2len;	if (!(hbs_raw = malloc(hbslen)))		return -1;	aim_bstream_init(&hbs, hbs_raw, hbslen);	aimbs_putraw(&hbs, fr->hdr.oft.magic, 4);	aimbs_put16(&hbs, fr->hdr.oft.hdr2len + 8);	aimbs_put16(&hbs, fr->hdr.oft.type);	aimbs_putraw(&hbs, fr->hdr.oft.hdr2, fr->hdr.oft.hdr2len);	aim_bstream_rewind(&hbs);		if (aim_bstream_send(&hbs, fr->conn, hbslen) != hbslen) {		err = -errno;			} else if (aim_bstream_curpos(&fr->data)) {		int len;		len = aim_bstream_curpos(&fr->data);		aim_bstream_rewind(&fr->data);				if (aim_bstream_send(&fr->data, fr->conn, len) != len)			err = -errno;	}	free(hbs_raw); /* XXX aim_bstream_free */	fr->handled = 1;	fr->conn->lastactivity = time(NULL);	return err;}faim_internal int aim_tx_sendframe(aim_session_t *sess, aim_frame_t *fr){	if (fr->hdrtype == AIM_FRAMETYPE_FLAP)		return sendframe_flap(sess, fr);	else if (fr->hdrtype == AIM_FRAMETYPE_OFT)		return sendframe_oft(sess, fr);	return -1;}faim_export int aim_tx_flushqueue(aim_session_t *sess){	aim_frame_t *cur;	for (cur = sess->queue_outgoing; cur; cur = cur->next) {		if (cur->handled)	       		continue; /* already been sent */		if (cur->conn && (cur->conn->status & AIM_CONN_STATUS_INPROGRESS))			continue;		/*		 * And now for the meager attempt to force transmit		 * latency and avoid missed messages.		 */		if ((cur->conn->lastactivity + cur->conn->forcedlatency) >= time(NULL)) {			/* 			 * XXX Just do this right.			 */			int duration = (cur->conn->lastactivity				 + cur->conn->forcedlatency) - time(NULL);			pth_nap(pth_time(0, duration * 1000));		}		/* XXX this should call the custom "queuing" function!! */		aim_tx_sendframe(sess, cur);	}	/* purge sent commands from queue */	aim_tx_purgequeue(sess);	return 0;}/* *  aim_tx_purgequeue() *   *  This is responsable for removing sent commands from the transmit  *  queue. This is not a required operation, but it of course helps *  reduce memory footprint at run time!   * */faim_export void aim_tx_purgequeue(aim_session_t *sess){	aim_frame_t *cur, **prev;	for (prev = &sess->queue_outgoing; (cur = *prev); ) {		if (cur->handled) {			*prev = cur->next;			aim_frame_destroy(cur);		} else			prev = &cur->next;	}	return;}/** * aim_tx_cleanqueue - get rid of packets waiting for tx on a dying conn * @sess: session * @conn: connection that's dying * * for now this simply marks all packets as sent and lets them * disappear without warning. * */faim_export void aim_tx_cleanqueue(aim_session_t *sess, aim_conn_t *conn){	aim_frame_t *cur;	for (cur = sess->queue_outgoing; cur; cur = cur->next) {		if (cur->conn == conn)			cur->handled = 1;	}	return;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品自拍毛片| 日韩精品一区二区三区视频播放 | 色综合久久久久网| 亚洲欧美在线高清| 色婷婷精品大在线视频| gogo大胆日本视频一区| 亚洲精品菠萝久久久久久久| 91极品视觉盛宴| 久久99九九99精品| 成人免费视频在线观看| 亚洲欧洲国产专区| 亚洲动漫第一页| 久久久影院官网| 欧美伊人精品成人久久综合97| 日韩黄色在线观看| 欧美激情综合在线| 欧美撒尿777hd撒尿| 国产成人亚洲综合色影视| 亚洲午夜久久久久中文字幕久| 一区二区三区成人| 国产精品毛片久久久久久久| 日韩精品一区在线| 久久久美女艺术照精彩视频福利播放| 久久亚洲精品国产精品紫薇| 日本韩国视频一区二区| 欧美日韩成人综合| 色综合久久中文字幕综合网| 欧美探花视频资源| 2019国产精品| 一区二区三区中文字幕| 久久av中文字幕片| 天天综合天天综合色| 亚洲免费看黄网站| 一色屋精品亚洲香蕉网站| 亚洲精品亚洲人成人网在线播放| 丝袜美腿成人在线| 成人av影视在线观看| 国内精品嫩模私拍在线| 蜜桃av一区二区| 日韩不卡手机在线v区| 丝袜亚洲另类丝袜在线| 国内外成人在线视频| 成人夜色视频网站在线观看| 国产成人精品免费看| 欧洲av在线精品| 欧美日韩一级片网站| 国产日韩欧美精品在线| 中文字幕精品综合| 日本亚洲天堂网| 99久久99久久精品免费看蜜桃| 成人激情文学综合网| 91精品国产一区二区| 欧美日韩成人综合在线一区二区 | 中文字幕精品综合| 免费在线观看一区| 精品无人区卡一卡二卡三乱码免费卡 | 韩国av一区二区三区| 欧美乱妇23p| 日韩欧美成人一区二区| 亚洲乱码国产乱码精品精的特点 | 欧美在线制服丝袜| 欧美国产国产综合| 黑人巨大精品欧美黑白配亚洲| 欧美影视一区在线| 亚洲女与黑人做爰| 成人午夜碰碰视频| 国产精品视频一区二区三区不卡| 奇米精品一区二区三区在线观看| 91国偷自产一区二区开放时间| 国产日韩av一区| 国产大陆精品国产| 久久久久99精品国产片| 精品一区二区三区在线观看| 欧美一区二区三区四区高清 | 日本一区二区三区免费乱视频| 美女mm1313爽爽久久久蜜臀| 欧美一区二区三区视频免费播放 | 视频一区中文字幕| 欧美日韩高清在线播放| 亚洲国产精品自拍| 欧美日韩亚洲综合在线 | 国产成人综合在线播放| 日韩欧美的一区| 国模无码大尺度一区二区三区| 欧美电影免费观看高清完整版在线| 青青草原综合久久大伊人精品优势| 91精品国产综合久久久久久久久久 | 国产麻豆精品在线观看| 91久久久免费一区二区| 夜色激情一区二区| 91精品国产综合久久蜜臀| 免费成人av在线播放| 26uuu久久天堂性欧美| 国产酒店精品激情| 国产精品女人毛片| 91一区在线观看| 欧美大片免费久久精品三p| 久久精品国产亚洲a| 久久精子c满五个校花| 日本成人在线一区| 久久丝袜美腿综合| 99久久99久久久精品齐齐| 亚洲一级片在线观看| fc2成人免费人成在线观看播放| 亚洲人成网站在线| 欧美一区二区免费| 成人免费视频app| 亚洲国产欧美另类丝袜| 欧美精品一区二区三区一线天视频| 亚洲高清免费观看 | 成人在线视频一区二区| 亚洲一区影音先锋| 欧美xxxxx牲另类人与| 日本不卡视频在线观看| 国产日产欧美一区二区视频| 在线观看视频一区二区| 国产精品一区二区免费不卡| 亚洲伊人伊色伊影伊综合网| 26uuu成人网一区二区三区| 色婷婷av一区二区三区软件| 久久精品国产免费看久久精品| 国产精品看片你懂得| 成人黄色网址在线观看| 午夜精品爽啪视频| 国产精品久久久久久久久免费樱桃 | 3atv在线一区二区三区| 高清在线成人网| 国产精品女主播av| 日韩一二三四区| 美国一区二区三区在线播放| 亚洲欧美日韩国产综合| 精品国产乱码久久久久久久| 一本色道久久综合亚洲aⅴ蜜桃 | 欧美精品三级在线观看| 成人免费视频视频| 国模少妇一区二区三区| 免费精品99久久国产综合精品| 中文字幕一区二区三区蜜月 | 亚洲毛片av在线| 久久精品一级爱片| 6080午夜不卡| 欧美日韩一区二区三区四区五区| 成人晚上爱看视频| 裸体在线国模精品偷拍| 日韩精品成人一区二区在线| 亚洲成人一二三| 日韩欧美久久一区| 欧美日韩视频第一区| 91成人网在线| 欧美在线观看一区| 91极品视觉盛宴| 色婷婷综合五月| 一本到高清视频免费精品| 91丨porny丨在线| 99精品一区二区| 99久久精品免费精品国产| 成人免费三级在线| 99精品国产视频| 一本久久精品一区二区| 欧美自拍丝袜亚洲| 欧美三级电影网| 欧美一级精品大片| 日韩免费高清视频| 久久美女高清视频| 亚洲小说欧美激情另类| 亚洲影视资源网| 日韩av一级电影| 国产伦精品一区二区三区免费迷 | 欧美aaaaaa午夜精品| 免费看欧美女人艹b| 国产麻豆欧美日韩一区| 不卡av在线网| 欧美在线三级电影| 精品成人私密视频| 国产精品美女一区二区三区 | 日本一区二区三区电影| 国产精品第四页| 一区二区高清视频在线观看| 五月婷婷色综合| 国产精品影视在线| 色素色在线综合| 日韩精品在线看片z| 国产精品三级视频| 天堂在线亚洲视频| 国产精品羞羞答答xxdd| 一本色道久久加勒比精品| 日韩精品一区二区三区在线观看| 国产农村妇女毛片精品久久麻豆| 一区二区三区精品在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎 | 欧美调教femdomvk| 国产亚洲va综合人人澡精品 | 久久se精品一区精品二区| 国产福利91精品| 欧美精品 日韩| 中文字幕制服丝袜成人av| 水野朝阳av一区二区三区| 成人网在线播放| 欧美xxxxxxxx| 亚洲国产一区二区视频|