|
|
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.