⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ft.c

📁 AnyQ服务端源代码(2004/10/28)源码
💻 C
📖 第 1 页 / 共 4 页
字号:
		free(conn->internal);	return;}faim_internal void aim_conn_close_rend(aim_session_t *sess, aim_conn_t *conn){	if (conn->type != AIM_CONN_TYPE_RENDEZVOUS)		return;	if (conn->subtype == AIM_CONN_SUBTYPE_OFT_SENDFILE)		connclose_sendfile(sess, conn);	else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_GETFILE)		connclose_getfile(sess, conn);	else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)		connclose_directim(sess, conn);	return;}faim_internal void aim_conn_kill_rend(aim_session_t *sess, aim_conn_t *conn){	if (conn->type != AIM_CONN_TYPE_RENDEZVOUS)		return;	if (conn->subtype == AIM_CONN_SUBTYPE_OFT_SENDFILE)		connkill_sendfile(sess, conn);	else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_GETFILE)		connkill_getfile(sess, conn);	else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)		connkill_directim(sess, conn);	return;}static int handlehdr_directim(aim_session_t *sess, aim_conn_t *conn, fu8_t *hdr){	aim_frame_t fr;	aim_rxcallback_t userfunc;	fu32_t payloadlength;	fu16_t flags;	char *snptr = NULL;	fr.conn = conn;	payloadlength = aimutil_get32(hdr+22);	flags = aimutil_get16(hdr+32);	snptr = (char *)hdr+38;	faimdprintf(sess, 2, "faim: OFT frame: handlehdr_directim: %04x / %04x / %s\n", payloadlength, flags, snptr);	if (flags == 0x000e) { 		int ret = 0;		if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING)))			ret = userfunc(sess, &fr, snptr);		return ret;	} else if ((flags == 0x0000) && payloadlength) { 		char *msg;		int ret = 0;		if (!(msg = calloc(1, payloadlength+1)))			return -1;		if (aim_recv(conn->fd, msg, payloadlength) < payloadlength) {			free(msg);			return -1;		}		msg[payloadlength] = '\0';		if ( (userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING)) )			ret = userfunc(sess, &fr, snptr, msg);		free(msg);		return ret;	}	return 0;}static int handlehdr_getfile_listing(aim_session_t *sess, aim_conn_t *conn, fu8_t *hdr){#if 0	struct aim_filetransfer_priv *ft;	struct aim_fileheader_t *fh;	struct aim_msgcookie_t *cook;	struct command_tx_struct *newoft;	aim_rxcallback_t userfunc;	faimdprintf(sess, 2,"faim: rend: fileget 0x1108\n");	fh = aim_oft_getfh(hdr);	faim_mutex_unlock(&conn->active);	if (!(cook = aim_checkcookie(sess, fh->bcookie, AIM_COOKIETYPE_OFTGET))) {		free(fh);		return -1;	}	ft = cook->data;	/* we're waaaaiiiting.. for listing.txt */	ft->state = 2;	memcpy(&(ft->fh), fh, sizeof(struct aim_fileheader_t));	free(fh);	if(aim_cachecookie(sess, cook) == -1) {		faimdprintf(sess, 1, "error caching cookie\n");		return -1;	}     	if (!(newoft = aim_tx_new(sess, conn, AIM_FRAMETYPE_OFT, 0x1209, 0))) {		aim_conn_close(conn);		return -1;	}	memcpy(newoft->hdr.oft.magic, "OFT2", 4);	newoft->hdr.oft.hdr2len = 0x100 - 8;	if (!(newoft->hdr.oft.hdr2 = (char *)calloc(1,newoft->hdr.oft.hdr2len))) {		newoft->lock = 0;		aim_frame_destroy(newoft);		return -1;	}	if (!(aim_oft_buildheader((unsigned char *)newoft->hdr.oft.hdr2, &(ft->fh)))) {		newoft->lock = 0;		aim_frame_destroy(newoft);		return -1;	}	newoft->lock = 0;	aim_tx_enqueue(sess, newoft);#endif	return -1;}static int handlehdr_getfile_listing2(aim_session_t *sess, aim_conn_t *conn, fu8_t *hdr){#if 0	struct aim_filetransfer_priv *ft;	struct aim_fileheader_t *fh;	struct aim_msgcookie_t *cook;	int ret = 0;	aim_rxcallback_t userfunc;		fh = aim_oft_getfh(hdr);	if (!(cook = aim_checkcookie(sess, fh->bcookie, AIM_COOKIETYPE_OFTGET)))		faimdprintf(sess, 2, "shit, no cookie in 0x1209. (%i/%s)going to crash..\n",  AIM_COOKIETYPE_OFTGET, fh->bcookie);	ft = cook->data;	if (ft->fh.size != fh->size)		faimdprintf(sess, 2, "hrm. ft->fh.size (%ld) != fh->size (%ld). um. using ft->fh.size\n", ft->fh.size, fh->size);	if ( (userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILELISTINGREQ)))		ret = userfunc(sess, NULL, conn, fh);	faimdprintf(sess, 2, "faim: get_command_rendezvous: hit end of 1209\n");	free(fh);	return ret;#else	return -1;#endif}static int handlehdr_getfile_listing3(aim_session_t *sess, aim_conn_t *conn, fu8_t *hdr){#if 0	struct aim_filetransfer_priv *ft;	struct aim_msgcookie_t *cook;	struct aim_fileheader_t *fh;	aim_rxcallback_t userfunc;	fh = aim_oft_getfh(hdr);	if (!(cook = aim_checkcookie(sess, fh->bcookie, AIM_COOKIETYPE_OFTGET))) {		free(fh);		return -1;	}	free(fh);	ft = cook->data;	if (aim_cachecookie(sess, cook) == -1)		return -1;	if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILELISTINGRXCONFIRM)))		return userfunc(sess, NULL, conn);#endif	return -1;}static int handlehdr_getfile_request(aim_session_t *sess, aim_conn_t *conn, fu8_t *hdr){#if 0	struct aim_filetransfer_priv *ft;	struct aim_msgcookie_t *cook;	struct aim_fileheader_t *fh;	struct command_tx_struct *newoft;	int i = 0;	aim_rxcallback_t userfunc;	fh = aim_oft_getfh(hdr);	if (!(cook = aim_checkcookie(sess, fh->bcookie, AIM_COOKIETYPE_OFTGET))) {		free(fh);		return -1;	}	ft = cook->data;	memcpy(&(ft->fh), fh, sizeof(struct aim_fileheader_t));	free(fh);	aim_cachecookie(sess, cook);	faimdprintf(sess, 2, "faim: fileget: %s seems to want %s\n", ft->sn, ft->fh.name);	if ( (userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILEREQ)) )		i = userfunc(sess, NULL, conn, &(ft->fh), cook->cookie);	if (i < 0)		return i;	if (!(newoft = aim_tx_new(sess, conn, AIM_FRAMETYPE_OFT, 0x0101, 0))) {		faimdprintf(sess, 2, "faim: send_final_transfer: tx_new OFT failed\n");		return -1;	}	newoft->lock = 1;	memcpy(newoft->hdr.oft.magic, "OFT2", 4);	newoft->hdr.oft.hdr2len = 0x100 - 8;	if (!(newoft->hdr.oft.hdr2 = calloc(1,newoft->hdr.oft.hdr2len))) {		aim_frame_destroy(newoft);		return -1;	} 	/* protocol BS: nrecvd, recvcsum to 0, flags to 0x20. */	ft->fh.nrecvd = 0;	ft->fh.recvcsum = 0;	ft->fh.flags = 0x20;	aim_oft_buildheader((unsigned char *)newoft->hdr.oft.hdr2, &(ft->fh));	newoft->lock = 0;	aim_tx_enqueue(sess, newoft);	faimdprintf(sess, 2, "faim: OFT: OFT file header enqueued.\n");	return i;#else	return -1;#endif}static int handlehdr_getfile_sending(aim_session_t *sess, aim_conn_t *conn, fu8_t *hdr){#if 0	struct aim_fileheader_t *fh;	struct aim_filetransfer_priv *ft;	struct aim_msgcookie_t *cook;	struct command_tx_struct *newoft;	aim_rxcallback_t userfunc;	fh = aim_oft_getfh(hdr);	if (!(cook = aim_checkcookie(sess, fh->bcookie, AIM_COOKIETYPE_OFTGET))) {		free(fh);		return -1;	}	free(fh);	ft = cook->data;	ft->state = 3;	if (aim_cachecookie(sess, cook) == -1)		return -1;	faimdprintf(sess, 2, "faim: fileget: %s seems to want to send %s\n", ft->sn, ft->fh.name);	if (!(newoft = aim_tx_new(sess, conn, AIM_FRAMETYPE_OFT, 0x0202, 0))) {		faimdprintf(sess, 2, "faim: send_final_transfer: tx_new OFT failed\n");		return -1;	}	newoft->lock = 1;	memcpy(newoft->hdr.oft.magic, "OFT2", 4);	newoft->hdr.oft.hdr2len = 0x100 - 8;	if (!(newoft->hdr.oft.hdr2 = calloc(1,newoft->hdr.oft.hdr2len))) {		aim_frame_destroy(newoft);		return -1;	}	aim_oft_buildheader((unsigned char *)newoft->hdr.oft.hdr2, &(ft->fh));	newoft->lock = 0;	aim_tx_enqueue(sess, newoft);	faimdprintf(sess, 2, "faim: OFT: OFT 0x0202 enqueued.\n");	if ( (userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILEREQ)) == NULL)		return 1;#else	return -1;#endif}static int handlehdr_getfile_recv(aim_session_t *sess, aim_conn_t *conn, fu8_t *hdr){#if 0	struct aim_fileheader_t *fh;	struct aim_filetransfer_priv *ft;	struct aim_msgcookie_t *cook;	int ret = 1;	aim_rxcallback_t userfunc;	fh = aim_oft_getfh(hdr);	if (!(cook = aim_checkcookie(sess, fh->bcookie, AIM_COOKIETYPE_OFTGET))) {		free(fh);		return -1;	}	ft = cook->data;	faimdprintf(sess, 2, "faim: get_rend: looks like we're ready to send data.(oft 0x0202)\n");	if ( (userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILESEND)) )		ret = userfunc(sess, NULL, conn, fh);	free(fh);	return ret;#else	return -1;#endif}static int handlehdr_getfile_finish(aim_session_t *sess, aim_conn_t *conn, fu8_t *hdr){#if 0	struct aim_fileheader_t *fh;	aim_rxcallback_t userfunc;	fh = aim_oft_getfh(hdr);	faimdprintf(sess, 2, "faim: get_rend: looks like we're done with a transfer (oft 0x0204)\n");	if ( (userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILECOMPLETE)) )		userfunc(sess, NULL, conn, fh);	free(fh);#endif	return -1;}/** * aim_get_command_rendezvous - OFT equivalent of aim_get_command * @sess: session to work on * @conn: conn to pull data from  * * this reads and handles data from conn->fd. currently a little rough * around the edges */faim_internal int aim_get_command_rendezvous(aim_session_t *sess, aim_conn_t *conn){	fu8_t hdrbuf1[6];	fu8_t *hdr = NULL;	int hdrlen, hdrtype;	int ret = -1;	if (!sess || !conn)		return -1;	memset(hdrbuf1, 0, sizeof(hdrbuf1));	/* I guess? I didn't understand any of that mess... */	if (conn->subtype == AIM_CONN_SUBTYPE_OFT_GETFILE)		return getcommand_getfile(sess, conn);	/* XXX fix all the error cases here */	if (aim_recv(conn->fd, hdrbuf1, 6) < 6) {		faimdprintf(sess, 2, "faim: rend: read error (fd: %i)\n", conn->fd);		aim_conn_close(conn);		return -1;	}	hdrlen = aimutil_get16(hdrbuf1+4);	hdrlen -= 6;	hdr = malloc(hdrlen);	if (aim_recv(conn->fd, hdr, hdrlen) < hdrlen) {		faimdprintf(sess, 2, "faim: rend: read2 error on %d (%d)\n", conn->fd, hdrlen);		free(hdr);		aim_conn_close(conn);		return -1;	}	hdrtype = aimutil_get16(hdr);	if (hdrtype == 0x0001)		ret = handlehdr_directim(sess, conn, hdr);	else if (hdrtype == 0x1108) /* getfile listing.txt incoming tx->rx */		ret = handlehdr_getfile_listing(sess, conn, hdr);	else if (hdrtype == 0x1209) /* get file listing ack rx->tx */		ret = handlehdr_getfile_listing2(sess, conn, hdr);	else if (hdrtype == 0x120b) /* get file listing rx confirm */		ret = handlehdr_getfile_listing3(sess, conn, hdr);	else if (hdrtype == 0x120c) /* getfile request */		ret = handlehdr_getfile_request(sess, conn, hdr);	else if (hdrtype == 0x0101) /* getfile sending data */		ret = handlehdr_getfile_sending(sess, conn, hdr);	else if (hdrtype == 0x0202) /* getfile recv data */		ret = handlehdr_getfile_recv(sess, conn, hdr);	else if (hdrtype == 0x0204) /* getfile finished */		ret = handlehdr_getfile_finish(sess, conn, hdr);	else {		faimdprintf(sess, 2,"faim: OFT frame: uknown type %04x\n", hdrtype);		ret = -1;	}		free(hdr);	if (ret == -1)		aim_conn_close(conn);	return ret;}#if 0/** * aim_oft_getfh - extracts an &aim_fileheader_t from buffer hdr. * @hdr: buffer to extract header from   * * returns pointer to new struct on success; %NULL on error.   * */static struct aim_fileheader_t *aim_oft_getfh(unsigned char *hdr) {  struct aim_fileheader_t *fh;  int i, j;  if (!(fh = calloc(1, sizeof(struct aim_fileheader_t))))    return NULL;    /* [0] and [1] are the type. we can ignore those here. */  i = 2;  for(j = 0; j < 8; j++, i++)    fh->bcookie[j] = hdr[i];  fh->encrypt = aimutil_get16(hdr+i);  i += 2;  fh->compress = aimutil_get16(hdr+i);  i += 2;  fh->totfiles = aimutil_get16(hdr+i);  i += 2;  fh->filesleft = aimutil_get16(hdr+i);  i += 2;  fh->totparts = aimutil_get16(hdr+i);  i += 2;  fh->partsleft = aimutil_get16(hdr+i);  i += 2;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -