/* * Checks the file request response. */ BOOL PeerFileAccept (Connection *peer, UWORD ackstatus, UDWORD port) { Connection *flist, *fpeer; flist = PeerFileCreate (peer->serv); fpeer = ServerFindChild (flist->serv, peer->cont, TYPE_FILEDIRECT); if (!flist || !fpeer || !port || (ackstatus == TCP_ACK_REFUSE)) { if (fpeer) TCPClose (fpeer); return 0; } ASSERT_MSGDIRECT(peer); ASSERT_FILELISTEN(flist); ASSERT_FILEDIRECT(fpeer); fpeer->connect = 0; fpeer->oscar_dc_seq = 0; fpeer->port = port; fpeer->ip = peer->ip; s_repl (&fpeer->server, s_ip (fpeer->ip)); if (prG->verbose) rl_printf (i18n (2520, "Opening file transfer connection to %s:%s%ld%s... \n"), s_wordquote (fpeer->server), COLQUOTE, UD2UL (fpeer->port), COLNONE); TCPDispatchConn (fpeer); return 1; }
/* * Handle kill character */ static void rl_key_kill (void) { rl_goto (0); rl_linecompress (&rl_temp, 0, -1); s_repl (&rl_yank, rl_temp.txt); rl_tab_state = 0; rl_tab_len = 0; rl_key_cut (); }
/* * Handles an incoming file request. */ UBYTE PeerFileIncAccept (Connection *list, Event *event) { Connection *flist, *fpeer; Server *serv; Contact *cont; UDWORD opt_bytes, opt_acc; const char *opt_files; if (!OptGetVal (event->opt, CO_BYTES, &opt_bytes)) opt_bytes = 0; if (!OptGetStr (event->opt, CO_MSGTEXT, &opt_files)) opt_files = ""; ASSERT_MSGLISTEN(list); serv = list->serv; cont = event->cont; flist = PeerFileCreate (serv); if ((event->wait && !OptGetVal (event->wait->opt, CO_FILEACCEPT, &opt_acc)) || !opt_acc || !cont || !flist || !(fpeer = ServerChild (flist->serv, cont, TYPE_FILEDIRECT))) { const char *txt; if (!OptGetStr (event->wait->opt, CO_REFUSE, &txt)) txt = ""; IMIntMsgFat (cont, NOW, ims_offline, INT_FILE_REJING, txt, opt_files, 0, 0); return FALSE; } ASSERT_FILELISTEN (flist); ASSERT_FILEDIRECT (fpeer); fpeer->port = 0; fpeer->ip = 0; fpeer->connect = 0; fpeer->version = serv->oscar_dc->version; s_repl (&fpeer->server, NULL); fpeer->oscar_file_len = opt_bytes; fpeer->oscar_file_done = 0; IMIntMsgFat (cont, NOW, ims_offline, INT_FILE_ACKING, "", opt_files, 0, opt_bytes); return TRUE; }
io_err_t io_any_appendbuf (Connection *conn, Dispatcher *d, const char *buf, size_t count) { char *newbuf; conn->connect |= CONNECT_SELECT_W; DebugH (DEB_TCP, "conn %p append %ld to %ld", conn, (long int)count, (long int)d->outlen); if (!count) return IO_OK; if (d->outlen) newbuf = realloc (d->outbuf, d->outlen + count); else newbuf = malloc (count); if (!newbuf) { s_repl (&d->lasterr, ""); return IO_NO_MEM; } memcpy (newbuf + d->outlen, buf, count); d->outlen += count; d->outbuf = newbuf; return IO_OK; }
/* * "Logs in" TCP connection by opening listening socket. */ Event *RemoteOpen (Connection *remo) { s_repl (&remo->server, s_realpath (remo->pref_server)); rl_printf (i18n (2223, "Opening scripting FIFO at %s... "), s_wordquote (remo->server)); remo->connect = 0; remo->our_seq = 0; remo->open = &RemoteOpen; remo->dispatch = &RemoteDispatch; remo->reconnect = NULL; remo->close = &RemoteClose; remo->our_session = 0; remo->ip = 0; remo->port = 0; UtilIOConnectF (remo); if (remo->connect) remo->connect = CONNECT_OK | CONNECT_SELECT_R; return NULL; }