📄 ft.c
字号:
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 + -