|
|
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: CL_Shutdown ();
95: Qcommon_Shutdown ();
96:
97: va_start (argptr,error);
98: vsprintf (string,error,argptr);
99: va_end (argptr);
100: fprintf(stderr, "Error: %s\n", string);
101:
102: _exit (1);
103:
104: }
105:
106: void Sys_Warn (char *warning, ...)
107: {
108: va_list argptr;
109: char string[1024];
110:
111: va_start (argptr,warning);
112: vsprintf (string,warning,argptr);
113: va_end (argptr);
114: fprintf(stderr, "Warning: %s", string);
115: }
116:
117: /*
118: ============
119: Sys_FileTime
120:
121: returns -1 if not present
122: ============
123: */
124: int Sys_FileTime (char *path)
125: {
126: struct stat buf;
127:
128: if (stat (path,&buf) == -1)
129: return -1;
130:
131: return buf.st_mtime;
132: }
133:
134: void floating_point_exception_handler(int whatever)
135: {
136: // Sys_Warn("floating point exception\n");
137: signal(SIGFPE, floating_point_exception_handler);
138: }
139:
140: char *Sys_ConsoleInput(void)
141: {
142: static char text[256];
143: int len;
144: fd_set fdset;
145: struct timeval timeout;
146:
147: if (!dedicated || !dedicated->value)
148: return NULL;
149:
150: if (!stdin_active)
151: return NULL;
152:
153: FD_ZERO(&fdset);
154: FD_SET(0, &fdset); // stdin
155: timeout.tv_sec = 0;
156: timeout.tv_usec = 0;
157: if (select (1, &fdset, NULL, NULL, &timeout) == -1 || !FD_ISSET(0, &fdset))
158: return NULL;
159:
160: len = read (0, text, sizeof(text));
161: if (len == 0) { // eof!
162: stdin_active = false;
163: return NULL;
164: }
165:
166: if (len < 1)
167: return NULL;
168: text[len-1] = 0; // rip off the /n and terminate
169:
170: return text;
171: }
172:
173: /*****************************************************************************/
174:
175: static void *game_library;
176:
177: /*
178: =================
179: Sys_UnloadGame
180: =================
181: */
182: void Sys_UnloadGame (void)
183: {
184: if (game_library)
185: dlclose (game_library);
186: game_library = NULL;
187: }
188:
189: /*
190: =================
191: Sys_GetGameAPI
192:
193: Loads the game dll
194: =================
195: */
196: void *Sys_GetGameAPI (void *parms)
197: {
198: void *(*GetGameAPI) (void *);
199:
200: char name[MAX_OSPATH];
201: char curpath[MAX_OSPATH];
202: char *path;
203: #ifdef __i386__
204: const char *gamename = "gamei386.so";
205: #elif defined __alpha__
206: const char *gamename = "gameaxp.so";
207: #else
208: #error Unknown arch
209: #endif
210:
211: setreuid(getuid(), getuid());
212: setegid(getgid());
213:
214: if (game_library)
215: Com_Error (ERR_FATAL, "Sys_GetGameAPI without Sys_UnloadingGame");
216:
217: getcwd(curpath, sizeof(curpath));
218:
219: Com_Printf("------- Loading %s -------", gamename);
220:
221: // now run through the search paths
222: path = NULL;
223: while (1)
224: {
225: path = FS_NextPath (path);
226: if (!path)
227: return NULL; // couldn't find one anywhere
228: sprintf (name, "%s/%s/%s", curpath, path, gamename);
229: game_library = dlopen (name, RTLD_NOW );
230: if (game_library)
231: {
232: Com_DPrintf ("LoadLibrary (%s)\n",name);
233: break;
234: }
235: }
236:
237: GetGameAPI = (void *)dlsym (game_library, "GetGameAPI");
238: if (!GetGameAPI)
239: {
240: Sys_UnloadGame ();
241: return NULL;
242: }
243:
244: return GetGameAPI (parms);
245: }
246:
247: /*****************************************************************************/
248:
249: void Sys_AppActivate (void)
250: {
251: }
252:
253: void Sys_SendKeyEvents (void)
254: {
255: #ifndef DEDICATED_ONLY
256: if (KBD_Update_fp)
257: KBD_Update_fp();
258: #endif
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: if ((mnt = setmntent("/etc/mtab", "r")) == NULL)
317: Com_Error(ERR_FATAL, "Can't read mount table to determine mounted cd location.");
318:
319: while ((ent = getmntent(mnt)) != NULL) {
320: if (strcmp(ent->mnt_type, "iso9660") == 0) {
321: // found a cd file system
322: found_cd = true;
323: sprintf(path, "%s/%s", ent->mnt_dir, "install/data/quake2.exe");
324: if (stat(path, &st) == 0) {
325: // found it
326: checked = true;
327: endmntent(mnt);
328: return;
329: }
330: sprintf(path, "%s/%s", ent->mnt_dir, "Install/Data/quake2.exe");
331: if (stat(path, &st) == 0) {
332: // found it
333: checked = true;
334: endmntent(mnt);
335: return;
336: }
337: sprintf(path, "%s/%s", ent->mnt_dir, "quake2.exe");
338: if (stat(path, &st) == 0) {
339: // found it
340: checked = true;
341: endmntent(mnt);
342: return;
343: }
344: }
345: }
346: endmntent(mnt);
347:
348: if (found_cd)
349: Com_Error (ERR_FATAL, "Could not find a Quake2 CD in your CD drive.");
350: Com_Error (ERR_FATAL, "Unable to find a mounted iso9660 file system.\n"
351: "You must mount the Quake2 CD in a cdrom drive in order to play.");
352: }
353:
354: #if 0
355: /*
356: ================
357: Sys_MakeCodeWriteable
358: ================
359: */
360: void Sys_MakeCodeWriteable (unsigned long startaddr, unsigned long length)
361: {
362:
363: int r;
364: unsigned long addr;
365: int psize = getpagesize();
366:
367: addr = (startaddr & ~(psize-1)) - psize;
368:
369: // fprintf(stderr, "writable code %lx(%lx)-%lx, length=%lx\n", startaddr,
370: // addr, startaddr+length, length);
371:
372: r = mprotect((char*)addr, length + startaddr - addr + psize, 7);
373:
374: if (r < 0)
375: Sys_Error("Protection change failed\n");
376:
377: }
378:
379: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.