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