|
|
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: #include <mntent.h> ! 20: ! 21: #include <dlfcn.h> ! 22: ! 23: #include "../qcommon/qcommon.h" ! 24: ! 25: #include "../linux/rw_linux.h" ! 26: ! 27: cvar_t *nostdout; ! 28: ! 29: unsigned sys_frame_time; ! 30: ! 31: uid_t saved_euid; ! 32: qboolean stdin_active = true; ! 33: ! 34: // ======================================================================= ! 35: // General routines ! 36: // ======================================================================= ! 37: ! 38: void Sys_ConsoleOutput (char *string) ! 39: { ! 40: if (nostdout && nostdout->value) ! 41: return; ! 42: ! 43: fputs(string, stdout); ! 44: } ! 45: ! 46: void Sys_Printf (char *fmt, ...) ! 47: { ! 48: va_list argptr; ! 49: char text[1024]; ! 50: unsigned char *p; ! 51: ! 52: va_start (argptr,fmt); ! 53: vsprintf (text,fmt,argptr); ! 54: va_end (argptr); ! 55: ! 56: if (strlen(text) > sizeof(text)) ! 57: Sys_Error("memory overwrite in Sys_Printf"); ! 58: ! 59: if (nostdout && nostdout->value) ! 60: return; ! 61: ! 62: for (p = (unsigned char *)text; *p; p++) { ! 63: *p &= 0x7f; ! 64: if ((*p > 128 || *p < 32) && *p != 10 && *p != 13 && *p != 9) ! 65: printf("[%02x]", *p); ! 66: else ! 67: putc(*p, stdout); ! 68: } ! 69: } ! 70: ! 71: void Sys_Quit (void) ! 72: { ! 73: CL_Shutdown (); ! 74: Qcommon_Shutdown (); ! 75: fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY); ! 76: _exit(0); ! 77: } ! 78: ! 79: void Sys_Init(void) ! 80: { ! 81: #if id386 ! 82: // Sys_SetFPCW(); ! 83: #endif ! 84: } ! 85: ! 86: void Sys_Error (char *error, ...) ! 87: { ! 88: va_list argptr; ! 89: char string[1024]; ! 90: ! 91: // change stdin to non blocking ! 92: fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY); ! 93: ! 94: va_start (argptr,error); ! 95: vsprintf (string,error,argptr); ! 96: va_end (argptr); ! 97: fprintf(stderr, "Error: %s\n", string); ! 98: ! 99: CL_Shutdown (); ! 100: Qcommon_Shutdown (); ! 101: _exit (1); ! 102: ! 103: } ! 104: ! 105: void Sys_Warn (char *warning, ...) ! 106: { ! 107: va_list argptr; ! 108: char string[1024]; ! 109: ! 110: va_start (argptr,warning); ! 111: vsprintf (string,warning,argptr); ! 112: va_end (argptr); ! 113: fprintf(stderr, "Warning: %s", string); ! 114: } ! 115: ! 116: /* ! 117: ============ ! 118: Sys_FileTime ! 119: ! 120: returns -1 if not present ! 121: ============ ! 122: */ ! 123: int Sys_FileTime (char *path) ! 124: { ! 125: struct stat buf; ! 126: ! 127: if (stat (path,&buf) == -1) ! 128: return -1; ! 129: ! 130: return buf.st_mtime; ! 131: } ! 132: ! 133: void floating_point_exception_handler(int whatever) ! 134: { ! 135: // Sys_Warn("floating point exception\n"); ! 136: signal(SIGFPE, floating_point_exception_handler); ! 137: } ! 138: ! 139: char *Sys_ConsoleInput(void) ! 140: { ! 141: static char text[256]; ! 142: int len; ! 143: fd_set fdset; ! 144: struct timeval timeout; ! 145: ! 146: if (!dedicated || !dedicated->value) ! 147: return NULL; ! 148: ! 149: if (!stdin_active) ! 150: return NULL; ! 151: ! 152: FD_ZERO(&fdset); ! 153: FD_SET(0, &fdset); // stdin ! 154: timeout.tv_sec = 0; ! 155: timeout.tv_usec = 0; ! 156: if (select (1, &fdset, NULL, NULL, &timeout) == -1 || !FD_ISSET(0, &fdset)) ! 157: return NULL; ! 158: ! 159: len = read (0, text, sizeof(text)); ! 160: if (len == 0) { // eof! ! 161: stdin_active = false; ! 162: return NULL; ! 163: } ! 164: ! 165: if (len < 1) ! 166: return NULL; ! 167: text[len-1] = 0; // rip off the /n and terminate ! 168: ! 169: return text; ! 170: } ! 171: ! 172: /*****************************************************************************/ ! 173: ! 174: static void *game_library; ! 175: ! 176: /* ! 177: ================= ! 178: Sys_UnloadGame ! 179: ================= ! 180: */ ! 181: void Sys_UnloadGame (void) ! 182: { ! 183: if (game_library) ! 184: dlclose (game_library); ! 185: game_library = NULL; ! 186: } ! 187: ! 188: /* ! 189: ================= ! 190: Sys_GetGameAPI ! 191: ! 192: Loads the game dll ! 193: ================= ! 194: */ ! 195: void *Sys_GetGameAPI (void *parms) ! 196: { ! 197: #ifndef REF_HARD_LINKED ! 198: void *(*GetGameAPI) (void *); ! 199: ! 200: char name[MAX_OSPATH]; ! 201: char curpath[MAX_OSPATH]; ! 202: char *path; ! 203: #ifdef __sgi ! 204: const char *gamename = "gamemips.so"; ! 205: #else ! 206: #error Unknown arch ! 207: #endif ! 208: ! 209: setreuid(getuid(), getuid()); ! 210: setegid(getgid()); ! 211: ! 212: if (game_library) ! 213: Com_Error (ERR_FATAL, "Sys_GetGameAPI without Sys_UnloadingGame"); ! 214: ! 215: getcwd(curpath, sizeof(curpath)); ! 216: ! 217: Com_Printf("------- Loading %s -------", gamename); ! 218: ! 219: // now run through the search paths ! 220: path = NULL; ! 221: while (1) ! 222: { ! 223: path = FS_NextPath (path); ! 224: if (!path) ! 225: return NULL; // couldn't find one anywhere ! 226: sprintf (name, "%s/%s/%s", curpath, path, gamename); ! 227: Com_Printf ("Trying to load library (%s)\n",name); ! 228: game_library = dlopen (name, RTLD_NOW ); ! 229: if (game_library) ! 230: { ! 231: Com_DPrintf ("LoadLibrary (%s)\n",name); ! 232: break; ! 233: } ! 234: } ! 235: ! 236: GetGameAPI = (void *)dlsym (game_library, "GetGameAPI"); ! 237: if (!GetGameAPI) ! 238: { ! 239: Sys_UnloadGame (); ! 240: return NULL; ! 241: } ! 242: ! 243: return GetGameAPI (parms); ! 244: #else ! 245: return (void *)GetGameAPI (parms); ! 246: #endif ! 247: } ! 248: ! 249: /*****************************************************************************/ ! 250: ! 251: void Sys_AppActivate (void) ! 252: { ! 253: } ! 254: ! 255: void Sys_SendKeyEvents (void) ! 256: { ! 257: if (KBD_Update_fp) ! 258: KBD_Update_fp(); ! 259: ! 260: // grab frame time ! 261: sys_frame_time = Sys_Milliseconds(); ! 262: } ! 263: ! 264: /*****************************************************************************/ ! 265: ! 266: char *Sys_GetClipboardData(void) ! 267: { ! 268: return NULL; ! 269: } ! 270: ! 271: int main (int argc, char **argv) ! 272: { ! 273: int time, oldtime, newtime; ! 274: ! 275: // go back to real user for config loads ! 276: saved_euid = geteuid(); ! 277: seteuid(getuid()); ! 278: ! 279: Qcommon_Init(argc, argv); ! 280: ! 281: /* fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY); */ ! 282: ! 283: nostdout = Cvar_Get("nostdout", "0", 0); ! 284: if (!nostdout->value) { ! 285: /* fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY); */ ! 286: // printf ("Linux Quake -- Version %0.3f\n", LINUX_VERSION); ! 287: } ! 288: ! 289: oldtime = Sys_Milliseconds (); ! 290: while (1) ! 291: { ! 292: // find time spent rendering last frame ! 293: do { ! 294: newtime = Sys_Milliseconds (); ! 295: time = newtime - oldtime; ! 296: } while (time < 1); ! 297: Qcommon_Frame (time); ! 298: oldtime = newtime; ! 299: } ! 300: ! 301: } ! 302: ! 303: void Sys_CopyProtect(void) ! 304: { ! 305: FILE *mnt; ! 306: struct mntent *ent; ! 307: char path[MAX_OSPATH]; ! 308: struct stat st; ! 309: qboolean found_cd = false; ! 310: ! 311: static qboolean checked = false; ! 312: ! 313: if (checked) ! 314: return; ! 315: ! 316: Com_Printf("XXX - Sys_CopyProtect disabled\n"); ! 317: checked = true; ! 318: return; ! 319: ! 320: if ((mnt = setmntent("/etc/mtab", "r")) == NULL) ! 321: Com_Error(ERR_FATAL, "Can't read mount table to determine mounted cd location."); ! 322: ! 323: while ((ent = getmntent(mnt)) != NULL) { ! 324: if (strcmp(ent->mnt_type, "iso9660") == 0) { ! 325: // found a cd file system ! 326: found_cd = true; ! 327: sprintf(path, "%s/%s", ent->mnt_dir, "install/data/quake2.exe"); ! 328: if (stat(path, &st) == 0) { ! 329: // found it ! 330: checked = true; ! 331: endmntent(mnt); ! 332: return; ! 333: } ! 334: sprintf(path, "%s/%s", ent->mnt_dir, "Install/Data/quake2.exe"); ! 335: if (stat(path, &st) == 0) { ! 336: // found it ! 337: checked = true; ! 338: endmntent(mnt); ! 339: return; ! 340: } ! 341: sprintf(path, "%s/%s", ent->mnt_dir, "quake2.exe"); ! 342: if (stat(path, &st) == 0) { ! 343: // found it ! 344: checked = true; ! 345: endmntent(mnt); ! 346: return; ! 347: } ! 348: } ! 349: } ! 350: endmntent(mnt); ! 351: ! 352: if (found_cd) ! 353: Com_Error (ERR_FATAL, "Could not find a Quake2 CD in your CD drive."); ! 354: Com_Error (ERR_FATAL, "Unable to find a mounted iso9660 file system.\n" ! 355: "You must mount the Quake2 CD in a cdrom drive in order to play."); ! 356: } ! 357: ! 358: #if 0 ! 359: /* ! 360: ================ ! 361: Sys_MakeCodeWriteable ! 362: ================ ! 363: */ ! 364: void Sys_MakeCodeWriteable (unsigned long startaddr, unsigned long length) ! 365: { ! 366: ! 367: int r; ! 368: unsigned long addr; ! 369: int psize = getpagesize(); ! 370: ! 371: addr = (startaddr & ~(psize-1)) - psize; ! 372: ! 373: // fprintf(stderr, "writable code %lx(%lx)-%lx, length=%lx\n", startaddr, ! 374: // addr, startaddr+length, length); ! 375: ! 376: r = mprotect((char*)addr, length + startaddr - addr + psize, 7); ! 377: ! 378: if (r < 0) ! 379: Sys_Error("Protection change failed\n"); ! 380: ! 381: } ! 382: ! 383: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.