home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quakeworld_src / server / sys_unix.c < prev    next >
C/C++ Source or Header  |  2000-06-17  |  5KB  |  284 lines

  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20. #include <sys/types.h>
  21. #include "qwsvdef.h"
  22.  
  23. #ifdef NeXT
  24. #include <libc.h>
  25. #endif
  26.  
  27. #if defined(__linux__) || defined(sun)
  28. #include <sys/stat.h>
  29. #include <unistd.h>
  30. #include <sys/time.h>
  31. #include <errno.h>
  32. #else
  33. #include <sys/dir.h>
  34. #endif
  35.  
  36. cvar_t  sys_nostdout = {"sys_nostdout","0"};
  37. cvar_t  sys_extrasleep = {"sys_extrasleep","0"};
  38.  
  39. qboolean  stdin_ready;
  40.  
  41. /*
  42. ===============================================================================
  43.  
  44.         REQUIRED SYS FUNCTIONS
  45.  
  46. ===============================================================================
  47. */
  48.  
  49. /*
  50. ============
  51. Sys_FileTime
  52.  
  53. returns -1 if not present
  54. ============
  55. */
  56. int Sys_FileTime (char *path)
  57. {
  58.   struct  stat  buf;
  59.   
  60.   if (stat (path,&buf) == -1)
  61.     return -1;
  62.   
  63.   return buf.st_mtime;
  64. }
  65.  
  66.  
  67. /*
  68. ============
  69. Sys_mkdir
  70.  
  71. ============
  72. */
  73. void Sys_mkdir (char *path)
  74. {
  75.   if (mkdir (path, 0777) != -1)
  76.     return;
  77.   if (errno != EEXIST)
  78.     Sys_Error ("mkdir %s: %s",path, strerror(errno)); 
  79. }
  80.  
  81.  
  82. /*
  83. ================
  84. Sys_DoubleTime
  85. ================
  86. */
  87. double Sys_DoubleTime (void)
  88. {
  89.   struct timeval tp;
  90.   struct timezone tzp;
  91.   static int    secbase;
  92.  
  93.   gettimeofday(&tp, &tzp);
  94.   
  95.   if (!secbase)
  96.   {
  97.     secbase = tp.tv_sec;
  98.     return tp.tv_usec/1000000.0;
  99.   }
  100.   
  101.   return (tp.tv_sec - secbase) + tp.tv_usec/1000000.0;
  102. }
  103.  
  104. /*
  105. ================
  106. Sys_Error
  107. ================
  108. */
  109. void Sys_Error (char *error, ...)
  110. {
  111.   va_list   argptr;
  112.   char    string[1024];
  113.   
  114.   va_start (argptr,error);
  115.   vsprintf (string,error,argptr);
  116.   va_end (argptr);
  117.   printf ("Fatal error: %s\n",string);
  118.   
  119.   exit (1);
  120. }
  121.  
  122. /*
  123. ================
  124. Sys_Printf
  125. ================
  126. */
  127. void Sys_Printf (char *fmt, ...)
  128. {
  129.   va_list   argptr;
  130.   static char   text[2048];
  131.   unsigned char   *p;
  132.  
  133.   va_start (argptr,fmt);
  134.   vsprintf (text,fmt,argptr);
  135.   va_end (argptr);
  136.  
  137.   if (strlen(text) > sizeof(text))
  138.     Sys_Error("memory overwrite in Sys_Printf");
  139.  
  140.     if (sys_nostdout.value)
  141.         return;
  142.  
  143.   for (p = (unsigned char *)text; *p; p++) {
  144.     *p &= 0x7f;
  145.     if ((*p > 128 || *p < 32) && *p != 10 && *p != 13 && *p != 9)
  146.       printf("[%02x]", *p);
  147.     else
  148.       putc(*p, stdout);
  149.   }
  150.   fflush(stdout);
  151. }
  152.  
  153.  
  154. /*
  155. ================
  156. Sys_Quit
  157. ================
  158. */
  159. void Sys_Quit (void)
  160. {
  161.   exit (0);   // appkit isn't running
  162. }
  163.  
  164. static int do_stdin = 1;
  165.  
  166. /*
  167. ================
  168. Sys_ConsoleInput
  169.  
  170. Checks for a complete line of text typed in at the console, then forwards
  171. it to the host command processor
  172. ================
  173. */
  174. char *Sys_ConsoleInput (void)
  175. {
  176.   static char text[256];
  177.   int   len;
  178.  
  179.   if (!stdin_ready || !do_stdin)
  180.     return NULL;    // the select didn't say it was ready
  181.   stdin_ready = false;
  182.  
  183.   len = read (0, text, sizeof(text));
  184.   if (len == 0) {
  185.     // end of file
  186.     do_stdin = 0;
  187.     return NULL;
  188.   }
  189.   if (len < 1)
  190.     return NULL;
  191.   text[len-1] = 0;  // rip off the /n and terminate
  192.   
  193.   return text;
  194. }
  195.  
  196. /*
  197. =============
  198. Sys_Init
  199.  
  200. Quake calls this so the system can register variables before host_hunklevel
  201. is marked
  202. =============
  203. */
  204. void Sys_Init (void)
  205. {
  206.   Cvar_RegisterVariable (&sys_nostdout);
  207.   Cvar_RegisterVariable (&sys_extrasleep);
  208. }
  209.  
  210. /*
  211. =============
  212. main
  213. =============
  214. */
  215. void main(int argc, char *argv[])
  216. {
  217.   double      time, oldtime, newtime;
  218.   quakeparms_t  parms;
  219.   fd_set  fdset;
  220.   extern  int   net_socket;
  221.     struct timeval timeout;
  222.   int j;
  223.  
  224.   memset (&parms, 0, sizeof(parms));
  225.  
  226.   COM_InitArgv (argc, argv);  
  227.   parms.argc = com_argc;
  228.   parms.argv = com_argv;
  229.  
  230.   parms.memsize = 16*1024*1024;
  231.  
  232.   j = COM_CheckParm("-mem");
  233.   if (j)
  234.     parms.memsize = (int) (Q_atof(com_argv[j+1]) * 1024 * 1024);
  235.   if ((parms.membase = malloc (parms.memsize)) == NULL)
  236.     Sys_Error("Can't allocate %ld\n", parms.memsize);
  237.  
  238.   parms.basedir = ".";
  239.  
  240. /*
  241.   if (Sys_FileTime ("id1/pak0.pak") != -1)
  242.   else
  243.     parms.basedir = "/raid/quake/v2";
  244. */
  245.  
  246.   SV_Init (&parms);
  247.  
  248. // run one frame immediately for first heartbeat
  249.   SV_Frame (0.1);   
  250.  
  251. //
  252. // main loop
  253. //
  254.   oldtime = Sys_DoubleTime () - 0.1;
  255.   while (1)
  256.   {
  257.   // select on the net socket and stdin
  258.   // the only reason we have a timeout at all is so that if the last
  259.   // connected client times out, the message would not otherwise
  260.   // be printed until the next event.
  261.     FD_ZERO(&fdset);
  262.     if (do_stdin)
  263.       FD_SET(0, &fdset);
  264.     FD_SET(net_socket, &fdset);
  265.     timeout.tv_sec = 1;
  266.     timeout.tv_usec = 0;
  267.     if (select (net_socket+1, &fdset, NULL, NULL, &timeout) == -1)
  268.       continue;
  269.     stdin_ready = FD_ISSET(0, &fdset);
  270.  
  271.   // find time passed since last cycle
  272.     newtime = Sys_DoubleTime ();
  273.     time = newtime - oldtime;
  274.     oldtime = newtime;
  275.     
  276.     SV_Frame (time);    
  277.     
  278.   // extrasleep is just a way to generate a fucked up connection on purpose
  279.     if (sys_extrasleep.value)
  280.       usleep (sys_extrasleep.value);
  281.   } 
  282. }
  283.  
  284.