Code: Show/Hide void __stdcall handleFileTransfer(hostMessage *m) { DEFLATE_CLASS /* Field Length Description 0 1 Type byte 1 16 File name 17 ... [Compressed] file */ char *name = msg + 1; char *buffer = msg + 17; Uint32 i, length = len - 17; if (len <= 17) { handleUnknown(m); return; } for (i = 0; i < 16; ++i) { char c = name[i]; if (c == 0) break; switch (c) { case '/': case '\\': h->logEvent("WARNING: Invalid downloaded-file name path ignored. (%s)", name); return; }; if ((c < ' ') || (c > '~')) { h->logEvent("WARNING: Invalid downloaded-file name chars ignored."); return; } } if (i == 16) { h->logEvent("WARNING: Unterminated downloaded-file name ignored."); return; } if (*name) { // regular file String fname = "get/"; fname += name; ofstream file(fname.msg, ios::binary); if (file) { file.write(buffer, length); h->logEvent("Received file: %s", fname.msg); h->imports->talk(makeFile(fname.msg)); } else { h->logEvent("Unable to open file for write: %s", fname.msg); } } else { // news file h->downloadingNews = false; if (decompress_to_file("get/news.txt", buffer, length)) h->logEvent("News file successfully transferred!"); else h->logEvent("Unable to decompress news file."); } } |