Annotation of researchv9/X11/src/X.V11R1/server/os/v9/utils.c, revision 1.1

1.1     ! root        1: /***********************************************************
        !             2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
        !             3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
        !             4: 
        !             5:                         All Rights Reserved
        !             6: 
        !             7: Permission to use, copy, modify, and distribute this software and its 
        !             8: documentation for any purpose and without fee is hereby granted, 
        !             9: provided that the above copyright notice appear in all copies and that
        !            10: both that copyright notice and this permission notice appear in 
        !            11: supporting documentation, and that the names of Digital or MIT not be
        !            12: used in advertising or publicity pertaining to distribution of the
        !            13: software without specific, written prior permission.  
        !            14: 
        !            15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
        !            16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
        !            17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
        !            18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
        !            19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
        !            20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
        !            21: SOFTWARE.
        !            22: 
        !            23: ******************************************************************/
        !            24: /* $Header: utils.c,v 1.34 87/09/14 02:09:06 toddb Exp $ */
        !            25: #include <stdio.h>
        !            26: #include <sys/types.h>
        !            27: #include <sys/timeb.h>
        !            28: #include "misc.h"
        !            29: #include "X.h"
        !            30: #include "input.h"
        !            31: #include "opaque.h"
        !            32: #include "site.h"
        !            33: #include <strings.h>
        !            34: extern char *display;
        !            35: 
        !            36: extern long defaultScreenSaverTime;    /* for parsing command line */
        !            37: extern long defaultScreenSaverInterval;
        !            38: extern int defaultScreenSaverBlanking;
        !            39: 
        !            40: extern long ScreenSaverTime;           /* for forcing reset */
        !            41: 
        !            42: Bool clientsDoomed = FALSE;
        !            43: extern void KillServerResources();
        !            44: 
        !            45: /* Force connections to close on SIGHUP from init */
        !            46: 
        !            47: AutoResetServer ()
        !            48: {
        !            49:     clientsDoomed = TRUE;
        !            50:     /* force an immediate timeout (and exit) in WaitForSomething */
        !            51:     ScreenSaverTime = TimeSinceLastInputEvent();
        !            52: #ifdef GPROF
        !            53:     chdir ("/tmp");
        !            54:     exit (0);
        !            55: #endif
        !            56: }
        !            57: 
        !            58: /* Force connections to close and then exit on SIGTERM, SIGINT */
        !            59: 
        !            60: GiveUp()
        !            61: {
        !            62:     KillServerResources();
        !            63:     exit(0);
        !            64: }
        !            65: 
        !            66: 
        !            67: void
        !            68: ErrorF( f, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) /* limit of ten args */
        !            69:     char *     f;
        !            70:     char *s0, *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8, *s9;
        !            71: {
        !            72:     fprintf( stderr, f, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9);
        !            73: }
        !            74: 
        !            75: void
        !            76: AbortServer()
        !            77: {
        !            78:     abort();
        !            79: }
        !            80: 
        !            81: int
        !            82: Error(str)
        !            83:     char *str;
        !            84: {
        !            85:     perror(str);
        !            86: }
        !            87: 
        !            88: int
        !            89: Notice()
        !            90: {
        !            91: }
        !            92: 
        !            93: int
        !            94: GetTimeInMillis()
        !            95: {
        !            96:     struct timeb  tb;
        !            97: 
        !            98:     ftime(&tb);
        !            99:     return(tb.time * 1000) + tb.millitm;
        !           100: }
        !           101: 
        !           102: /*
        !           103:  * This function parses the command line. Handles device-independent fields
        !           104:  * only.  It is not allowed to modify argc or any of the strings pointed to
        !           105:  * by argv.
        !           106:  */
        !           107: ProcessCommandLine ( argc, argv )
        !           108: int    argc;
        !           109: char   *argv[];
        !           110: 
        !           111: {
        !           112:     int i;
        !           113: 
        !           114:     for ( i = 1; i < argc; i++ )
        !           115:     {
        !           116:        /* initialize display */
        !           117:        if(argv[i][0] ==  ':')  
        !           118:        {
        !           119:            display = argv[i];
        !           120:            display++;
        !           121:        }
        !           122:        else if ( strcmp( argv[i], "-a") == 0)
        !           123:        {
        !           124:            if(++i < argc)
        !           125:                defaultPointerControl.num = atoi(argv[i]);
        !           126:            else
        !           127:                UseMsg();
        !           128:        }
        !           129:        else if ( strcmp( argv[i], "c") == 0)
        !           130:        {
        !           131:            if(++i < argc)
        !           132:                defaultKeyboardControl.click = atoi(argv[i]);
        !           133:            else
        !           134:                UseMsg();
        !           135:        }
        !           136:        else if ( strcmp( argv[i], "-c") == 0)
        !           137:        {
        !           138:            defaultKeyboardControl.click = 0;
        !           139:        }
        !           140:        else if ( strcmp( argv[i], "-co") == 0)
        !           141:        {
        !           142:            if(++i < argc)
        !           143:                rgbPath = argv[i];
        !           144:            else
        !           145:                UseMsg();
        !           146:        }
        !           147:        else if ( strcmp( argv[i], "-f") == 0)
        !           148:        {
        !           149:            if(++i < argc)
        !           150:                defaultKeyboardControl.bell = atoi(argv[i]);
        !           151:            else
        !           152:                UseMsg();
        !           153:        }
        !           154:        else if ( strcmp( argv[i], "-fc") == 0)
        !           155:        {
        !           156:            if(++i < argc)
        !           157:                defaultCursorFont = argv[i];
        !           158:            else
        !           159:                UseMsg();
        !           160:        }
        !           161:        else if ( strcmp( argv[i], "-fn") == 0)
        !           162:        {
        !           163:            if(++i < argc)
        !           164:                defaultTextFont = argv[i];
        !           165:            else
        !           166:                UseMsg();
        !           167:        }
        !           168:        else if ( strcmp( argv[i], "-fp") == 0)
        !           169:        {
        !           170:            if(++i < argc)
        !           171:                defaultFontPath = argv[i];
        !           172:            else
        !           173:                UseMsg();
        !           174:        }
        !           175:        else if ( strcmp( argv[i], "-help") == 0)
        !           176:        {
        !           177:            UseMsg();
        !           178:            exit(0);
        !           179:        }
        !           180:        else if ( strcmp( argv[i], "-p") == 0)
        !           181:        {
        !           182:            if(++i < argc)
        !           183:                defaultScreenSaverInterval = atoi(argv[i]) * MILLI_PER_MIN;
        !           184:            else
        !           185:                UseMsg();
        !           186:        }
        !           187:        else if ( strcmp( argv[i], "r") == 0)
        !           188:            defaultKeyboardControl.autoRepeat = TRUE;
        !           189:        else if ( strcmp( argv[i], "-r") == 0)
        !           190:            defaultKeyboardControl.autoRepeat = FALSE;
        !           191:        else if ( strcmp( argv[i], "-s") == 0)
        !           192:        {
        !           193:            if(++i < argc)
        !           194:                defaultScreenSaverTime = atoi(argv[i]) * MILLI_PER_MIN;
        !           195:            else
        !           196:                UseMsg();
        !           197:        }
        !           198:        else if ( strcmp( argv[i], "-t") == 0)
        !           199:        {
        !           200:            if(++i < argc)
        !           201:                defaultPointerControl.threshold = atoi(argv[i]);
        !           202:            else
        !           203:                UseMsg();
        !           204:        }
        !           205:        else if ( strcmp( argv[i], "-to") == 0)
        !           206:        {
        !           207:            if(++i < argc)
        !           208:            {
        !           209:                if((TimeOutValue = atoi(argv[i])) < 0)
        !           210:                    TimeOutValue = DEFAULT_TIMEOUT;
        !           211:            }
        !           212:            else
        !           213:                UseMsg();
        !           214:        }
        !           215:        else if ( strcmp( argv[i], "v") == 0)
        !           216:            defaultScreenSaverBlanking = PreferBlanking;
        !           217:        else if ( strcmp( argv[i], "-v") == 0)
        !           218:            defaultScreenSaverBlanking = DontPreferBlanking;
        !           219:        else if ( strcmp( argv[i], "-x") == 0)
        !           220:        {
        !           221:            if(++i >= argc)
        !           222:                UseMsg();
        !           223:            /* For U**x, which doesn't support dynamic loading, there's nothing
        !           224:             * to do when we see a -x.  Either the extension is linked in or
        !           225:             * it isn't */
        !           226:        }
        !           227:     }
        !           228: }
        !           229: 
        !           230: UseMsg()
        !           231: {
        !           232:     ErrorF("use: X <display> [option] <tty>\n");
        !           233:     ErrorF("-a #                   mouse acceleration (pixels)\n");
        !           234:     ErrorF("-bp<:screen> color     BlackPixel for screen\n");
        !           235:     ErrorF("-c                     turns off key-click\n");
        !           236:     ErrorF("c #                    key-click volume (0-8)\n");
        !           237:     ErrorF("-co string             color database file\n");
        !           238:     ErrorF("-fc string             cursor font\n");
        !           239:     ErrorF("-fn string             default text font name\n");
        !           240:     ErrorF("-fp string             default text font path\n");
        !           241:     ErrorF("-p #                   screen-saver pattern duration (seconds)\n");
        !           242:     ErrorF("-r                     turns off auto-repeat\n");
        !           243:     ErrorF("r                      turns on auto-repeat \n");
        !           244:     ErrorF("-f #                   bell base (0-100)\n");
        !           245:     ErrorF("-x string              loads named extension at init time \n");
        !           246:     ErrorF("-help                  prints message with these options\n");
        !           247:     ErrorF("-s #                   screen-saver timeout (seconds)\n");
        !           248:     ErrorF("-t #                   mouse threshold (pixels)\n");
        !           249:     ErrorF("-to #                  connection time out\n");
        !           250:     ErrorF("v                      video blanking for screen-saver\n");
        !           251:     ErrorF("-v                     screen-saver without video blanking\n");
        !           252:     ErrorF("-wp<:screen> color     WhitePixel for screen\n");
        !           253:     ErrorF("There may be other device-dependent options as well\n");
        !           254: }
        !           255: /*
        !           256:  * malloc wrap-around, to take care of the "no memory" case, since
        !           257:  * it would be difficult in many places to "back out" on failure.
        !           258:  */
        !           259: #ifdef DEBUG
        !           260: #define FIRSTMAGIC 0x11aaaa11
        !           261: #define SECONDMAGIC 0x22aaaa22
        !           262: #define FREEDMAGIC  0x33aaaa33
        !           263: #endif
        !           264: 
        !           265: /* XALLOC -- X's internal memory allocator.  Why does it return unsigned
        !           266:  * int * instead of the more common char *?  Well, if you read K&R you'll
        !           267:  * see they say that alloc must return a pointer "suitable for conversion"
        !           268:  * to whatever type you really want.  In a full-blown generic allocator
        !           269:  * there's no way to solve the alignment problems without potentially
        !           270:  * wasting lots of space.  But we have a more limited problem. We know
        !           271:  * we're only ever returning pointers to structures which will have to
        !           272:  * be long word aligned.  So we are making a stronger guarantee.  It might
        !           273:  * have made sense to make Xalloc return char * to conform with people's
        !           274:  * expectations of malloc, but this makes lint happier.
        !           275:  */
        !           276: 
        !           277: unsigned long * 
        !           278: Xalloc (amount)
        !           279:     int amount;
        !           280: {
        !           281:     char               *malloc();
        !           282:     register pointer  ptr;
        !           283:        
        !           284:     if(amount == 0)
        !           285:        return( (unsigned long *)NULL);
        !           286: #ifdef DEBUG
        !           287:         /* aligned extra on long word boundary */
        !           288:     amount = (amount + 3) & ~3;  
        !           289:     if (ptr =  (pointer) malloc( ((unsigned) amount) + 12))
        !           290:     {
        !           291:         *(unsigned long *)ptr = FIRSTMAGIC;
        !           292:         *((unsigned long *)(ptr + 4)) = amount;
        !           293:         *((unsigned long *)(ptr + 8 + amount)) = SECONDMAGIC;
        !           294:        return (unsigned long *) (ptr + 8);
        !           295:     }
        !           296:     FatalError("Error in Xalloc\n");
        !           297:     /* NOTREACHED */
        !           298: #else
        !           299:     ptr =  (pointer) malloc( ((unsigned) amount));
        !           300:     return ((unsigned long *)ptr);
        !           301: #endif /* DEBUG */
        !           302:     /* NOTREACHED */
        !           303: }
        !           304: 
        !           305: /*****************
        !           306:  * Xrealloc
        !           307:  *     realloc wrap-around, to take care of the "no memory" case, since
        !           308:  *     it would be difficult in many places to "back out" on failure.
        !           309:  *****************/
        !           310: 
        !           311: extern unsigned long *minfree;           /* DEBUG */
        !           312: 
        !           313: unsigned long *
        !           314: Xrealloc (ptr, amount)
        !           315: register pointer ptr;
        !           316: int amount;
        !           317: {
        !           318:     char *malloc();
        !           319:     char *realloc();
        !           320:     char *foo;
        !           321: 
        !           322:     amount = (amount + 3) & ~3;  
        !           323:     if (ptr)
        !           324:     {
        !           325:         if (ptr < (pointer) minfree)
        !           326:         {
        !           327:            ErrorF("Xrealloc: trying to free static storage\n");
        !           328:            /* Force a core dump */
        !           329:            AbortServer();
        !           330:        }
        !           331: #ifdef DEBUG
        !           332:        if (!CheckNode(ptr - 8))
        !           333:            AbortServer();
        !           334:        ptr = (pointer) realloc ((ptr - 8), (unsigned) amount + 12);
        !           335: #else
        !           336:         ptr = (pointer) realloc (ptr, amount);
        !           337: #endif /* DEBUG */
        !           338:     }
        !           339:     else
        !           340:     {
        !           341: #ifdef DEBUG
        !           342:        ptr =  (pointer) malloc (((unsigned) amount) + 12);
        !           343: #else
        !           344:        ptr =  (pointer) malloc ((unsigned) amount);
        !           345: #endif 
        !           346:     }
        !           347: #ifdef DEBUG
        !           348:     if (ptr)
        !           349:     {
        !           350:         *(unsigned long *)ptr = FIRSTMAGIC;
        !           351:        *((unsigned long *)(ptr + 4)) = amount;
        !           352:        *((unsigned long *)(ptr + 8 + amount)) = SECONDMAGIC;
        !           353:        return ((unsigned long *) (ptr + 8));
        !           354:     }
        !           355:     FatalError ("Error in Xrealloc\n");
        !           356:     /*NOTREACHED*/
        !           357: #else
        !           358:         return((unsigned long *)ptr);
        !           359: #endif /* DEBUG */
        !           360: }
        !           361:                     
        !           362: /*****************
        !           363:  *  Xfree
        !           364:  *    calls free 
        !           365:  *****************/    
        !           366: 
        !           367: void
        !           368: Xfree(ptr)
        !           369:     register pointer ptr;
        !           370: {
        !           371:     if (ptr == (pointer) NULL)
        !           372:        return;
        !           373: #ifdef DEBUG
        !           374:     if (ptr < (pointer) minfree)
        !           375:        ErrorF("Xfree: trying to free static storage\n");
        !           376:     else if (CheckNode(ptr - 8))
        !           377:     {
        !           378:         *(unsigned long *)(ptr - 8) = FREEDMAGIC;
        !           379:        free(ptr - 8); 
        !           380:     }
        !           381: #else
        !           382:     if (ptr >= (pointer) minfree)
        !           383:         free(ptr); 
        !           384: #endif /* DEBUG */
        !           385: }
        !           386: 
        !           387: #ifdef DEBUG
        !           388: static Bool
        !           389: CheckNode(ptr)
        !           390:     pointer ptr;
        !           391: {
        !           392:     int    amount;
        !           393: 
        !           394:     amount = *((unsigned long *)(ptr + 4));
        !           395:     if (*((unsigned long *) ptr) == FREEDMAGIC)
        !           396:     {
        !           397:         ErrorF("Freeing something already freed!\n");
        !           398:        return FALSE;
        !           399:     }
        !           400:     if( *((unsigned long *) ptr) != FIRSTMAGIC ||
        !           401:         *((unsigned long *) (ptr + amount + 8)) != SECONDMAGIC)
        !           402:        FatalError("Heap bug!\n");
        !           403:     return TRUE;
        !           404: }
        !           405: #endif /* DEBUG */

unix.superglobalmegacorp.com

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