|
|
1.1 ! root 1: #include <unistd.h> ! 2: #include <signal.h> ! 3: #include <stdlib.h> ! 4: #include <limits.h> ! 5: #include <sys/time.h> ! 6: #include <sys/types.h> ! 7: #include <unistd.h> ! 8: #include <fcntl.h> ! 9: #include <stdarg.h> ! 10: #include <stdio.h> ! 11: #include <sys/ipc.h> ! 12: #include <sys/shm.h> ! 13: #include <sys/stat.h> ! 14: #include <string.h> ! 15: #include <ctype.h> ! 16: #include <sys/wait.h> ! 17: #include <sys/mman.h> ! 18: #include <errno.h> ! 19: ! 20: #include "quakedef.h" ! 21: ! 22: #define TICRATE (1.0/30) ! 23: ! 24: FILE *debugfile=0; ! 25: ! 26: // ======================================================================= ! 27: // General routines ! 28: // ======================================================================= ! 29: ! 30: void I_DebugNumber(int y, int val) ! 31: { ! 32: } ! 33: ! 34: /* ! 35: void I_Printf (char *fmt, ...) ! 36: { ! 37: va_list argptr; ! 38: char text[1024]; ! 39: ! 40: va_start (argptr,fmt); ! 41: vsprintf (text,fmt,argptr); ! 42: va_end (argptr); ! 43: fprintf(stderr, "%s", text); ! 44: ! 45: Con_Print (text); ! 46: } ! 47: */ ! 48: ! 49: void I_Printf (char *fmt, ...) ! 50: { ! 51: va_list argptr; ! 52: char text[1024], *t_p; ! 53: int l, r; ! 54: ! 55: va_start (argptr,fmt); ! 56: vsprintf (text,fmt,argptr); ! 57: va_end (argptr); ! 58: ! 59: l = strlen(text); ! 60: t_p = text; ! 61: ! 62: // make sure everything goes through, even though we are non-blocking ! 63: while (l) ! 64: { ! 65: r = write (1, text, l); ! 66: if (r == -1) ! 67: { ! 68: sleep (0); ! 69: continue; ! 70: } ! 71: t_p += r; ! 72: l -= r; ! 73: } ! 74: } ! 75: ! 76: void I_Quit (void) ! 77: { ! 78: fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY); ! 79: S_Shutdown(); ! 80: exit(0); ! 81: } ! 82: ! 83: void I_Error (char *error, ...) ! 84: { ! 85: va_list argptr; ! 86: char string[1024]; ! 87: ! 88: fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY); ! 89: va_start (argptr,error); ! 90: vsprintf (string,error,argptr); ! 91: va_end (argptr); ! 92: fprintf(stderr, "Error: %s\n", string); ! 93: S_Shutdown(); ! 94: VID_Shutdown(); ! 95: exit(-1); ! 96: } ! 97: ! 98: void I_Warn (char *warning, ...) ! 99: { ! 100: va_list argptr; ! 101: char string[1024]; ! 102: ! 103: va_start (argptr,warning); ! 104: vsprintf (string,warning,argptr); ! 105: va_end (argptr); ! 106: fprintf(stderr, "Warning: %s", string); ! 107: } ! 108: ! 109: /* ! 110: ============ ! 111: Sys_FileTime ! 112: ! 113: returns -1 if not present ! 114: ============ ! 115: */ ! 116: int Sys_FileTime (char *path) ! 117: { ! 118: struct stat buf; ! 119: ! 120: if (stat (path,&buf) == -1) ! 121: return -1; ! 122: ! 123: return buf.st_mtime; ! 124: } ! 125: ! 126: ! 127: void Sys_mkdir (char *path) ! 128: { ! 129: mkdir (path, 0777); ! 130: } ! 131: ! 132: int Sys_FileOpenRead (char *path, int *handle) ! 133: { ! 134: int h; ! 135: struct stat fileinfo; ! 136: ! 137: ! 138: h = open (path, O_RDONLY, 0666); ! 139: *handle = h; ! 140: if (h == -1) ! 141: return -1; ! 142: ! 143: if (fstat (h,&fileinfo) == -1) ! 144: I_Error ("Error fstating %s", path); ! 145: ! 146: return fileinfo.st_size; ! 147: } ! 148: ! 149: int Sys_FileOpenWrite (char *path) ! 150: { ! 151: int handle; ! 152: ! 153: umask (0); ! 154: ! 155: handle = open(path,O_RDWR | O_CREAT | O_TRUNC ! 156: , 0666); ! 157: ! 158: if (handle == -1) ! 159: I_Error ("Error opening %s: %s", path,strerror(errno)); ! 160: ! 161: return handle; ! 162: } ! 163: ! 164: int Sys_FileWrite (int handle, void *src, int count) ! 165: { ! 166: return write (handle, src, count); ! 167: } ! 168: ! 169: void Sys_FileClose (int handle) ! 170: { ! 171: close (handle); ! 172: } ! 173: ! 174: void Sys_FileSeek (int handle, int position) ! 175: { ! 176: lseek (handle, position, SEEK_SET); ! 177: } ! 178: ! 179: int Sys_FileRead (int handle, void *dest, int count) ! 180: { ! 181: return read (handle, dest, count); ! 182: } ! 183: ! 184: void I_DebugLog(char *file, char *fmt, ...) ! 185: { ! 186: va_list argptr; ! 187: static char data[1024]; ! 188: int fd; ! 189: ! 190: va_start(argptr, fmt); ! 191: vsprintf(data, fmt, argptr); ! 192: va_end(argptr); ! 193: // fd = open(file, O_WRONLY | O_BINARY | O_CREAT | O_APPEND, 0666); ! 194: fd = open(file, O_WRONLY | O_CREAT | O_APPEND, 0666); ! 195: write(fd, data, strlen(data)); ! 196: close(fd); ! 197: } ! 198: ! 199: /*============= ! 200: StartMSRInterval ! 201: ============= ! 202: */ ! 203: void StartMSRInterval(int msreg) ! 204: { ! 205: } ! 206: ! 207: /* ! 208: ============= ! 209: EndMSRInterval ! 210: ============= ! 211: */ ! 212: unsigned long EndMSRInterval() ! 213: { ! 214: return 0; ! 215: } ! 216: ! 217: cvar_t sys_showfiles = {"showfiles","1"}; ! 218: ! 219: ! 220: void Sys_EditFile(char *filename) ! 221: { ! 222: ! 223: char cmd[256]; ! 224: char *term; ! 225: char *editor; ! 226: ! 227: term = getenv("TERM"); ! 228: if (term && !strcmp(term, "xterm")) ! 229: { ! 230: editor = getenv("VISUAL"); ! 231: if (!editor) ! 232: editor = getenv("EDITOR"); ! 233: if (!editor) ! 234: editor = getenv("EDIT"); ! 235: if (!editor) ! 236: editor = "vi"; ! 237: sprintf(cmd, "xterm -e %s %s", editor, filename); ! 238: system(cmd); ! 239: } ! 240: ! 241: } ! 242: ! 243: double I_FloatTime (void) ! 244: { ! 245: struct timeval tp; ! 246: struct timezone tzp; ! 247: static int secbase; ! 248: ! 249: gettimeofday(&tp, &tzp); ! 250: ! 251: if (!secbase) ! 252: { ! 253: secbase = tp.tv_sec; ! 254: return tp.tv_usec/1000000.0; ! 255: } ! 256: ! 257: return (tp.tv_sec - secbase) + tp.tv_usec/1000000.0; ! 258: } ! 259: ! 260: // ======================================================================= ! 261: // Sleeps for microseconds ! 262: // ======================================================================= ! 263: ! 264: static volatile int oktogo; ! 265: ! 266: void alarm_handler(int x) ! 267: { ! 268: oktogo=1; ! 269: } ! 270: ! 271: void I_Sleep(int usecs) ! 272: { ! 273: ! 274: struct itimerval it; ! 275: ! 276: it.it_interval.tv_sec = 0; ! 277: it.it_interval.tv_usec = 0; ! 278: it.it_value.tv_sec = usecs / 1000000; ! 279: it.it_value.tv_usec = usecs % 1000000; ! 280: ! 281: signal(SIGALRM, alarm_handler); ! 282: ! 283: oktogo=0; ! 284: setitimer(ITIMER_REAL, &it, 0); ! 285: while (!oktogo) sleep(0); ! 286: ! 287: } ! 288: ! 289: byte *I_ZoneBase (int *size) ! 290: { ! 291: ! 292: char *QUAKEOPT = getenv("QUAKEOPT"); ! 293: ! 294: *size = 0xc00000; ! 295: if (QUAKEOPT) ! 296: { ! 297: while (*QUAKEOPT) ! 298: if (tolower(*QUAKEOPT++) == 'm') ! 299: { ! 300: *size = atof(QUAKEOPT) * 1024*1024; ! 301: break; ! 302: } ! 303: } ! 304: return malloc (*size); ! 305: ! 306: } ! 307: ! 308: void SV_LineRefresh(void) ! 309: { ! 310: } ! 311: ! 312: void Sys_Sleep(void) ! 313: { ! 314: sleep(0); ! 315: } ! 316: ! 317: void I_GetMemory(quakeparms_t *parms) ! 318: { ! 319: FILE *f; ! 320: char buffer[256]; ! 321: char *procparse; ! 322: int freemem, buffermem, totalmem; ! 323: int rc, suggestion; ! 324: ! 325: parms->memsize = 8*1024*1024; ! 326: ! 327: f = fopen("/proc/meminfo", "r"); ! 328: if (f) ! 329: { ! 330: fgets(buffer, sizeof buffer, f); ! 331: procparse = "%s %d %d %d %d %d"; ! 332: rc = fscanf(f, procparse, buffer, &totalmem, buffer, &freemem, ! 333: buffer, &buffermem); ! 334: ! 335: suggestion = (9*buffermem)/10 + freemem; ! 336: if (suggestion > totalmem) ! 337: I_Printf("[%s] did not properly parse /proc/meminfo\n", procparse); ! 338: if (suggestion > parms->memsize && suggestion < totalmem) ! 339: parms->memsize = suggestion; ! 340: ! 341: fclose(f); ! 342: } ! 343: else ! 344: I_Printf("Did you know /proc breaks up painful gas bubbles?\n"); ! 345: ! 346: parms->membase = malloc (parms->memsize); ! 347: ! 348: } ! 349: ! 350: ! 351: void floating_point_exception_handler(int whatever) ! 352: { ! 353: // I_Warn("floating point exception\n"); ! 354: signal(SIGFPE, floating_point_exception_handler); ! 355: } ! 356: ! 357: int main (int c, char **v) ! 358: { ! 359: ! 360: extern qboolean pr_debugerrors; ! 361: double time, oldtime, newtime; ! 362: quakeparms_t parms; ! 363: ! 364: pr_debugerrors = false; ! 365: ! 366: signal(SIGFPE, floating_point_exception_handler); ! 367: ! 368: fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY); ! 369: ! 370: parms.memsize = 0x2000000; ! 371: parms.membase = malloc (parms.memsize); ! 372: parms.basedir = "/flem/quake"; ! 373: ! 374: COM_InitArgv (c, v); ! 375: ! 376: parms.argc = com_argc; ! 377: parms.argv = com_argv; ! 378: ! 379: Quake_Init(&parms); ! 380: ! 381: if (COM_CheckParm ("-debugfile")) ! 382: { ! 383: char hostname[80]; ! 384: char filename[80]; ! 385: ! 386: gethostname(hostname, sizeof(hostname)); ! 387: sprintf (filename, "%s.dbg",hostname); ! 388: debugfile = fopen (filename,"w"); ! 389: ! 390: net_debug = true; ! 391: } ! 392: ! 393: oldtime = I_FloatTime (); ! 394: while (1) ! 395: { ! 396: // find time spent rendering last frame ! 397: newtime = I_FloatTime (); ! 398: time = newtime - oldtime; ! 399: ! 400: // if ( !cl_connected && time < TICRATE) ! 401: if ( host_dedicated && time < TICRATE) ! 402: { ! 403: I_Sleep (1); ! 404: continue; // not time to run a server only tic yet ! 405: } ! 406: ! 407: Host_Frame(time); ! 408: // CL_Frame(time); ! 409: ! 410: oldtime = newtime; ! 411: } ! 412: ! 413: Quake_Shutdown(); ! 414: ! 415: } ! 416: ! 417: ! 418: /* ! 419: ================ ! 420: I_MakeCodeWriteable ! 421: ================ ! 422: */ ! 423: void I_MakeCodeWriteable (unsigned long startaddr, unsigned long length) ! 424: { ! 425: ! 426: int r; ! 427: unsigned int addr; ! 428: int psize = getpagesize(); ! 429: ! 430: addr = startaddr & ~(psize-1); ! 431: ! 432: r = mprotect((char*)addr, length + startaddr - addr, 7); ! 433: ! 434: if (r < 0) ! 435: I_Error("Protection change failed\n"); ! 436: ! 437: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.