Annotation of quake2/linux/q_shlinux.c, revision 1.1.1.1

1.1       root        1: #include <sys/types.h>
                      2: #include <errno.h>
                      3: #include <stdio.h>
                      4: #include <dirent.h>
                      5: #include <sys/stat.h>
                      6: #include <unistd.h>
                      7: #include <sys/mman.h>
                      8: #include <sys/time.h>
                      9: 
                     10: #include "../linux/glob.h"
                     11: 
                     12: #include "../qcommon/qcommon.h"
                     13: 
                     14: //===============================================================================
                     15: 
                     16: byte *membase;
                     17: int maxhunksize;
                     18: int curhunksize;
                     19: 
                     20: void *Hunk_Begin (int maxsize)
                     21: {
                     22:        // reserve a huge chunk of memory, but don't commit any yet
                     23:        maxhunksize = maxsize + sizeof(int);
                     24:        curhunksize = 0;
                     25:        membase = mmap(0, maxhunksize, PROT_READ|PROT_WRITE, 
                     26:                MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
                     27:        if (membase == NULL || membase == (byte *)-1)
                     28:                Sys_Error("unable to virtual allocate %d bytes", maxsize);
                     29: 
                     30:        *((int *)membase) = curhunksize;
                     31: 
                     32:        return membase + sizeof(int);
                     33: }
                     34: 
                     35: void *Hunk_Alloc (int size)
                     36: {
                     37:        byte *buf;
                     38: 
                     39:        // round to cacheline
                     40:        size = (size+31)&~31;
                     41:        if (curhunksize + size > maxhunksize)
                     42:                Sys_Error("Hunk_Alloc overflow");
                     43:        buf = membase + sizeof(int) + curhunksize;
                     44:        curhunksize += size;
                     45:        return buf;
                     46: }
                     47: 
                     48: int Hunk_End (void)
                     49: {
                     50:        byte *n;
                     51: 
                     52:        n = mremap(membase, maxhunksize, curhunksize + sizeof(int), 0);
                     53:        if (n != membase)
                     54:                Sys_Error("Hunk_End:  Could not remap virtual block (%d)", errno);
                     55:        *((int *)membase) = curhunksize + sizeof(int);
                     56:        
                     57:        return curhunksize;
                     58: }
                     59: 
                     60: void Hunk_Free (void *base)
                     61: {
                     62:        byte *m;
                     63: 
                     64:        if (base) {
                     65:                m = ((byte *)base) - sizeof(int);
                     66:                if (munmap(m, *((int *)m)))
                     67:                        Sys_Error("Hunk_Free: munmap failed (%d)", errno);
                     68:        }
                     69: }
                     70: 
                     71: //===============================================================================
                     72: 
                     73: 
                     74: /*
                     75: ================
                     76: Sys_Milliseconds
                     77: ================
                     78: */
                     79: int curtime;
                     80: int Sys_Milliseconds (void)
                     81: {
                     82:        struct timeval tp;
                     83:        struct timezone tzp;
                     84:        static int              secbase;
                     85: 
                     86:        gettimeofday(&tp, &tzp);
                     87:        
                     88:        if (!secbase)
                     89:        {
                     90:                secbase = tp.tv_sec;
                     91:                return tp.tv_usec/1000;
                     92:        }
                     93: 
                     94:        curtime = (tp.tv_sec - secbase)*1000 + tp.tv_usec/1000;
                     95:        
                     96:        return curtime;
                     97: }
                     98: 
                     99: void Sys_Mkdir (char *path)
                    100: {
                    101:     mkdir (path, 0777);
                    102: }
                    103: 
                    104: char *strlwr (char *s)
                    105: {
                    106:        while (*s) {
                    107:                *s = tolower(*s);
                    108:                s++;
                    109:        }
                    110: }
                    111: 
                    112: //============================================
                    113: 
                    114: static char    findbase[MAX_OSPATH];
                    115: static char    findpath[MAX_OSPATH];
                    116: static char    findpattern[MAX_OSPATH];
                    117: static DIR             *fdir;
                    118: 
                    119: static qboolean CompareAttributes(char *path, char *name,
                    120:        unsigned musthave, unsigned canthave )
                    121: {
                    122:        struct stat st;
                    123:        char fn[MAX_OSPATH];
                    124: 
                    125: // . and .. never match
                    126:        if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0)
                    127:                return false;
                    128: 
                    129:        sprintf(fn, "%s/%s", path, name);
                    130:        if (stat(fn, &st) == -1)
                    131:                return false; // shouldn't happen
                    132: 
                    133:        if ( ( st.st_mode & S_IFDIR ) && ( canthave & SFF_SUBDIR ) )
                    134:                return false;
                    135: 
                    136:        if ( ( musthave & SFF_SUBDIR ) && !( st.st_mode & S_IFDIR ) )
                    137:                return false;
                    138: 
                    139:        return true;
                    140: }
                    141: 
                    142: char *Sys_FindFirst (char *path, unsigned musthave, unsigned canhave)
                    143: {
                    144:        struct dirent *d;
                    145:        char *p;
                    146: 
                    147:        if (fdir)
                    148:                Sys_Error ("Sys_BeginFind without close");
                    149: 
                    150: //     COM_FilePath (path, findbase);
                    151:        strcpy(findbase, path);
                    152: 
                    153:        if ((p = strrchr(findbase, '/')) != NULL) {
                    154:                *p = 0;
                    155:                strcpy(findpattern, p + 1);
                    156:        } else
                    157:                strcpy(findpattern, "*");
                    158: 
                    159:        if (strcmp(findpattern, "*.*") == 0)
                    160:                strcpy(findpattern, "*");
                    161:        
                    162:        if ((fdir = opendir(findbase)) == NULL)
                    163:                return NULL;
                    164:        while ((d = readdir(fdir)) != NULL) {
                    165:                if (!*findpattern || glob_match(findpattern, d->d_name)) {
                    166: //                     if (*findpattern)
                    167: //                             printf("%s matched %s\n", findpattern, d->d_name);
                    168:                        if (CompareAttributes(findbase, d->d_name, musthave, canhave)) {
                    169:                                sprintf (findpath, "%s/%s", findbase, d->d_name);
                    170:                                return findpath;
                    171:                        }
                    172:                }
                    173:        }
                    174:        return NULL;
                    175: }
                    176: 
                    177: char *Sys_FindNext (unsigned musthave, unsigned canhave)
                    178: {
                    179:        struct dirent *d;
                    180: 
                    181:        if (fdir == NULL)
                    182:                return NULL;
                    183:        while ((d = readdir(fdir)) != NULL) {
                    184:                if (!*findpattern || glob_match(findpattern, d->d_name)) {
                    185: //                     if (*findpattern)
                    186: //                             printf("%s matched %s\n", findpattern, d->d_name);
                    187:                        if (CompareAttributes(findbase, d->d_name, musthave, canhave)) {
                    188:                                sprintf (findpath, "%s/%s", findbase, d->d_name);
                    189:                                return findpath;
                    190:                        }
                    191:                }
                    192:        }
                    193:        return NULL;
                    194: }
                    195: 
                    196: void Sys_FindClose (void)
                    197: {
                    198:        if (fdir != NULL)
                    199:                closedir(fdir);
                    200:        fdir = NULL;
                    201: }
                    202: 
                    203: 
                    204: //============================================
                    205: 

unix.superglobalmegacorp.com

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