Annotation of quake2/solaris/sys_solaris.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.