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