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

📄 d_netfil.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 2 页
字号:
// 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 + -