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