📄 d_netfil.c
字号:
// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: d_netfil.c,v 1.19 2001/04/17 22:26:07 calumr Exp $//// Copyright (C) 1998-2000 by DooM Legacy Team.//// This program is free software; you can redistribute it and/or// modify it under the terms of the GNU General Public License// as published by the Free Software Foundation; either version 2// of the License, or (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.////// $Log: d_netfil.c,v $// Revision 1.19 2001/04/17 22:26:07 calumr// Initial Mac add//// Revision 1.18 2001/03/30 17:12:49 bpereira// no message//// Revision 1.17 2001/02/24 13:35:19 bpereira// no message//// Revision 1.16 2001/02/13 20:37:27 metzgermeister// *** empty log message ***//// Revision 1.15 2001/02/10 12:27:13 bpereira// no message//// Revision 1.14 2001/01/25 22:15:41 bpereira// added heretic support//// Revision 1.13 2000/10/08 13:30:00 bpereira// no message//// Revision 1.12 2000/10/02 18:25:44 bpereira// no message//// Revision 1.11 2000/09/28 20:57:14 bpereira// no message//// Revision 1.10 2000/09/10 10:39:06 metzgermeister// *** empty log message ***//// Revision 1.9 2000/08/31 14:30:55 bpereira// no message//// Revision 1.8 2000/08/11 19:10:13 metzgermeister// *** empty log message ***//// Revision 1.7 2000/08/10 14:52:38 ydario// OS/2 port//// Revision 1.6 2000/04/16 18:38:07 bpereira// no message//// Revision 1.5 2000/03/07 03:32:24 hurdler// fix linux compilation//// Revision 1.4 2000/03/05 17:10:56 bpereira// no message//// Revision 1.3 2000/02/27 00:42:10 hurdler// fix CR+LF problem//// Revision 1.2 2000/02/26 00:28:42 hurdler// Mostly bug fix (see borislog.txt 23-2-2000, 24-2-2000)////// DESCRIPTION:// Transfer a file using HSendPacket////-----------------------------------------------------------------------------#include <stdio.h>#include <fcntl.h>#ifdef __OS2__#include <sys/types.h>#endif // __OS2__#include <sys/stat.h>#include <time.h>#if defined( WIN32) || defined( __DJGPP__ ) #include <io.h>#include <direct.h>#else#include <sys/types.h>#include <dirent.h>#include <utime.h>#endif#ifndef __WIN32__#include <unistd.h>#else#include <sys/utime.h>#endif#ifdef __DJGPP__#include <dir.h>#include <utime.h>#endif#include "doomdef.h"#include "doomstat.h"#include "d_clisrv.h"#include "g_game.h"#include "i_net.h"#include "i_system.h"#include "m_argv.h"#include "d_net.h"#include "w_wad.h"#include "d_netfil.h"#include "z_zone.h"#include "byteptr.h"#include "p_setup.h"#include "m_misc.h"#include "m_menu.h"// sender structuretypedef struct filetx_s { int ram; char *filename; // name of the file or ptr of the data in ram ULONG size; char fileid; int node; // destination struct filetx_s *next; // a queu} filetx_t;// current transfers (one for eatch node)struct { filetx_t *txlist; ULONG position; FILE* currentfile;} transfer[MAXNETNODES];// read time of file : stat _stmtime// write time of file : utime// receiver structureint fileneedednum;fileneeded_t fileneeded[MAX_WADFILES];char *downloaddir="DOWNLOAD";static int timezoneoffset;#if defined(__DJGPP__)//BP: TODO : find an equivalent for dos/linuxstatic int timezone = 0;#endifvoid D_NetFileInit(void){#ifndef __MACOS__ // BP: set correct localtime so time comparison work ! tzset(); // manualy convert timestamps timezoneoffset = timezone; // no more convert timestamps timezone=0;#endif}// fill the serverinfo packet with wad file loadedchar *PutFileNeeded(void){ int i; char *p; char wadfilename[MAX_WADPATH]; p=(byte *)&netbuffer->u.serverinfo.fileneeded; for(i=0;i<numwadfiles;i++) { if(notimecheck) WRITEULONG(p,0); else WRITEULONG(p,wadfiles[i]->timestamp); WRITEULONG(p,wadfiles[i]->filesize); strcpy(wadfilename,wadfiles[i]->filename); nameonly(wadfilename); WRITESTRING(p,wadfilename); } netbuffer->u.serverinfo.fileneedednum=i; return p;}// parce the serverinfo packet and fill fileneeded table on client void D_ParseFileneeded(boolean notimecheck, int fileneedednum_parm, char *fileneededstr){ int i; byte *p; fileneedednum=fileneedednum_parm; p=fileneededstr; for(i=0;i<fileneedednum;i++) { fileneeded[i].status = FS_NOTFOUND; fileneeded[i].timestamp = READULONG(p); fileneeded[i].totalsize = READULONG(p); fileneeded[i].phandle = NULL; if( notimecheck ) fileneeded[i].timestamp=0; READSTRING(p,fileneeded[i].filename); }}// void CL_PrepareDownloadSaveGame(const char *tmpsave){ fileneedednum = 1; fileneeded[0].status = FS_REQUESTED; fileneeded[0].timestamp = 0; fileneeded[0].totalsize = -1; fileneeded[0].phandle = NULL; strcpy(fileneeded[0].filename,tmpsave);}// send the name of file who status is FS_NOTFOUND of the fileneeded tableboolean SendRequestFile(void){ char *p; int i; ULONG totalfreespaceneeded=0; INT64 availablefreespace; if( M_CheckParm("-nodownload") ) { char s[1024]=""; for(i=0;i<fileneedednum;i++) if( fileneeded[i].status!=FS_FOUND ) { strcat(s,"\n "); strcat(s,fileneeded[i].filename); strcat(s," "); strcat(s,asctime(localtime(&fileneeded[i].timestamp))); s[strlen(s)-1]='\0'; // remove \n put by asctime if(fileneeded[i].status==FS_NOTFOUND) strcat(s," not found"); else strcat(s," found but with differant date/time"); } I_Error("To play with this server you should have this files : %s\n" "use -notime if you want to disable time check\n" "or remove -nodownload if you want to download the files !\n",s); } netbuffer->packettype = PT_REQUESTFILE; p=netbuffer->u.textcmd; for(i=0;i<fileneedednum;i++) if( fileneeded[i].status==FS_NOTFOUND || fileneeded[i].status == FS_FOUNDWRONGDATE) { if( fileneeded[i].status==FS_NOTFOUND ) totalfreespaceneeded += fileneeded[i].totalsize; nameonly(fileneeded[i].filename); WRITECHAR(p,i); // fileid WRITESTRING(p,fileneeded[i].filename); // put it in download dir strcatbf(fileneeded[i].filename,downloaddir,"/"); fileneeded[i].status = FS_REQUESTED; } WRITECHAR(p,-1); I_GetDiskFreeSpace(&availablefreespace);// CONS_Printf("free byte %d\n",availablefreespace); if(totalfreespaceneeded>availablefreespace) I_Error("To play on this server you should download %dKb\n" "but you have only %dKb freespace on this drive\n", totalfreespaceneeded,availablefreespace); // prepare to download I_mkdir(downloaddir,755); return HSendPacket(servernode,true,0,p-(char *)netbuffer->u.textcmd);}// get request filepak and put it to the send queuevoid Got_RequestFilePak(int node){ char *p; p=netbuffer->u.textcmd; while(*p!=-1) { SendFile(node,p+1,*p); p++; // skip fileid SKIPSTRING(p); }}// client check if the filedeened arent already loaded or on the diskint CL_CheckFiles(void){ int i,j; char wadfilename[MAX_WADPATH]; int ret=1; if( M_CheckParm("-nofiles") ) return 1; // the first is the iwad (the main wad file) // do not check file date, also don't donwload it (copyright problem) strcpy(wadfilename,wadfiles[0]->filename); nameonly(wadfilename); if( stricmp(wadfilename,fileneeded[0].filename)!=0 ) { M_StartMessage(va("You cannot connect to this server since it use %s\n" "You are using %s\n",fileneeded[0].filename,wadfilename), NULL, MM_NOTHING); return 2; } fileneeded[0].status=FS_OPEN; for (i=1;i<fileneedednum;i++) { if(devparm) CONS_Printf("searching for '%s' ",fileneeded[i].filename); // check in allready loaded files for(j=1;wadfiles[j];j++) { strcpy(wadfilename,wadfiles[j]->filename); nameonly(wadfilename); if( stricmp(wadfilename,fileneeded[i].filename)==0 && (wadfiles[j]->timestamp ==fileneeded[i].timestamp || wadfiles[j]->timestamp+timezoneoffset==fileneeded[i].timestamp || fileneeded[i].timestamp==0)) { if(devparm) CONS_Printf("already loaded\n"); fileneeded[i].status=FS_OPEN; break; } } if( fileneeded[i].status!=FS_NOTFOUND ) continue; fileneeded[i].status = recsearch(fileneeded[i].filename,fileneeded[i].timestamp,true); if(devparm) CONS_Printf("found %d\n",fileneeded[i].status); if( fileneeded[i].status != FS_FOUND ) ret=0; } return ret;}// load it nowvoid CL_LoadServerFiles(void){ int i; for (i=1;i<fileneedednum;i++) { if( fileneeded[i].status == FS_OPEN ) // allready loaded continue; else if( fileneeded[i].status == FS_FOUND ) { P_AddWadFile(fileneeded[i].filename,NULL); fileneeded[i].status = FS_OPEN; } else if( fileneeded[i].status == FS_FOUNDWRONGDATE) { P_AddWadFile(fileneeded[i].filename,NULL); fileneeded[i].status = FS_OPEN; CONS_Printf("\2File %s found but with differant date\n",fileneeded[i].filename); } else I_Error("Try to load file %s with status of %d\n",fileneeded[i].filename,fileneeded[i].status); }}// little optimization to test if there is a file in the queuestatic int filetosend=0;void SendFile(int node,char *filename, char fileid){ filetx_t **q,*p; int i; boolean found=0; char wadfilename[MAX_WADPATH]; q=&transfer[node].txlist; while(*q) q=&((*q)->next); *q=(filetx_t *)malloc(sizeof(filetx_t)); if(!*q) I_Error("SendFile : No more ram\n"); p=*q; p->filename=(char *)malloc(MAX_WADPATH); strcpy(p->filename,filename); // a minimum of security, can't get only file in legacy direcory nameonly(p->filename); // check first in wads loaded the majority of case for(i=0;wadfiles[i] && !found;i++) { strcpy(wadfilename,wadfiles[i]->filename); nameonly(wadfilename); if(stricmp(wadfilename,p->filename)==0) { found = true; // copy filename with full path strcpy(p->filename,wadfiles[i]->filename); } } if( !found ) { DEBFILE(va("%s not found in wadfiles\n",filename)); if(recsearch(p->filename,0,true)==0) { // not found // don't inform client (probably hacker) DEBFILE(va("Client %d request %s : not found\n",node,filename)); free(p->filename); free(p); *q=NULL; return; } else return; } DEBFILE(va("Sending file %s to %d (id=%d)\n",filename,node,fileid)); p->ram=SF_FILE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -