|
|
1.1 root 1: /*
2: * $Source: /orpheus/u1/X11/clients/xterm/RCS/misc.c,v $
3: * $Header: misc.c,v 1.29 87/09/10 18:09:03 swick Exp $
4: */
5:
6:
7: #include <X11/copyright.h>
8:
9: /*
10: * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
11: *
12: * All Rights Reserved
13: *
14: * Permission to use, copy, modify, and distribute this software and its
15: * documentation for any purpose and without fee is hereby granted,
16: * provided that the above copyright notice appear in all copies and that
17: * both that copyright notice and this permission notice appear in
18: * supporting documentation, and that the name of Digital Equipment
19: * Corporation not be used in advertising or publicity pertaining to
20: * distribution of the software without specific, written prior permission.
21: *
22: *
23: * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
24: * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
25: * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
26: * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
27: * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
28: * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
29: * SOFTWARE.
30: */
31:
32: #include <stdio.h>
33: #include <setjmp.h>
34: #include <signal.h>
35: #include <ctype.h>
36: #include <pwd.h>
37: #include <strings.h>
38: #include <sys/time.h>
39: #include <sys/file.h>
40: #include <X11/Xlib.h>
41: #include <X11/Xutil.h>
42: #include <X11/Xatom.h>
43: #include <X11/Xtlib.h>
44: #include "ptyx.h"
45: #include "data.h"
46: #include "error.h"
47: #include <X11/cursorfont.h>
48: #include "gray.ic"
49: #include "hilite.ic"
50: #include "wait.ic"
51: #include "waitmask.ic"
52:
53: extern char *malloc();
54: extern char *mktemp();
55: extern void exit();
56: extern void perror();
57: extern void abort();
58:
59: #ifndef lint
60: static char rcs_id[] = "$Header: misc.c,v 1.29 87/09/10 18:09:03 swick Exp $";
61: #endif lint
62:
63: xevents()
64: {
65: XEvent event;
66: register TScreen *screen = &term.screen;
67: XtEventReturnCode returnCode;
68:
69: if(screen->scroll_amt)
70: FlushScroll(screen);
71: XPending (screen->display);
72: do {
73: if (waitingForTrackInfo)
74: return;
75: XNextEvent (screen->display, &event);
76: returnCode = XtDispatchEvent(&event);
77: switch (returnCode) {
78: case XteventHandled :
79: break;
80: case XteventNotHandled :
81: /* |||
82: fprintf(stderr, "Event %d not handled for window %d (subwindow %d)\n",
83: (int)event.type, (int)event.window, (int)event.subwindow);
84: */
85: break;
86: case XteventNoHandler :
87: /* |||
88: fprintf(stderr, "Event %d no entry for window %d (subwindow %d)\n",
89: (int)event.type, (int)event.window, (int)event.subwindow);
90: */
91: break;
92: }
93: } while (QLength(screen->display) > 0);
94: }
95:
96: /*ARGSUSED*/
97: XtEventReturnCode EventDoNothing(event, eventdata)
98: XEvent *event;
99: caddr_t eventdata;
100: {
101: return (XteventHandled);
102: }
103:
104: /*ARGSUSED*/
105: XtEventReturnCode HandleKeyPressed(event, eventdata)
106: XEvent *event;
107: caddr_t eventdata;
108: {
109: Input (&term.keyboard, &term.screen, (XKeyPressedEvent *)event);
110: return (XteventHandled);
111: }
112: /*ARGSUSED*/
113: XtEventReturnCode HandleEnterWindow(event, eventdata)
114: register XEnterWindowEvent *event;
115: caddr_t eventdata;
116: {
117: register TScreen *screen = &term.screen;
118:
119: if (((event->detail) != NotifyInferior)
120: && event->mode == NotifyNormal
121: && event->focus) {
122: #ifdef DEBUG
123: if(debug)
124: fprintf(stderr, "EnterWindow %s\n", window ==
125: VWindow(screen) ? "VT" : "Tek");
126: #endif DEBUG
127: selectwindow(screen, INWINDOW);
128: }
129: return (XteventHandled);
130: }
131:
132: /*ARGSUSED*/
133: XtEventReturnCode HandleLeaveWindow(event, eventdata)
134: register XEnterWindowEvent *event;
135: caddr_t eventdata;
136: {
137: register TScreen *screen = &term.screen;
138:
139: if (((event->detail) != NotifyInferior)
140: && event->mode == NotifyNormal
141: && event->focus) {
142: #ifdef DEBUG
143: if(debug)
144: fprintf(stderr, "LeaveWindow %s\n", window ==
145: VWindow(screen) ? "VT" : "Tek");
146: #endif DEBUG
147: unselectwindow(screen, INWINDOW);
148: }
149: return (XteventHandled);
150: }
151:
152:
153: /*ARGSUSED*/
154: XtEventReturnCode HandleFocusChange(event, eventdata)
155: register XFocusChangeEvent *event;
156: caddr_t eventdata;
157: {
158: register TScreen *screen = &term.screen;
159:
160: if(event->type == FocusIn)
161: selectwindow(screen, FOCUS);
162: else
163: unselectwindow(screen, FOCUS);
164: return (XteventHandled);
165: }
166:
167:
168:
169: selectwindow(screen, flag)
170: register TScreen *screen;
171: register int flag;
172: {
173: if(screen->TekEmu) {
174: TekSelect();
175: if(!Ttoggled)
176: TCursorToggle(TOGGLE);
177: if(screen->cellsused) {
178: screen->colorcells[2].pixel =
179: screen->Tcursorcolor;
180: XStoreColor(screen->display,
181: DefaultColormap(screen->display,
182: DefaultScreen(screen->display)),
183: &screen->colorcells[2]);
184: }
185: screen->select |= flag;
186: if(!Ttoggled)
187: TCursorToggle(TOGGLE);
188: return;
189: } else {
190: VTSelect();
191: if(screen->cursor_state &&
192: (screen->cursor_col != screen->cur_col ||
193: screen->cursor_row != screen->cur_row))
194: HideCursor();
195: screen->select |= flag;
196: if(screen->cursor_state)
197: ShowCursor();
198: return;
199: }
200: }
201:
202: unselectwindow(screen, flag)
203: register TScreen *screen;
204: register int flag;
205: {
206: register int i;
207:
208: screen->select &= ~flag;
209: if(!(screen->select)) {
210: if(screen->TekEmu) {
211: TekUnselect();
212: if(!Ttoggled)
213: TCursorToggle(TOGGLE);
214: if(screen->cellsused) {
215: i = (term.flags & REVERSE_VIDEO) == 0;
216: screen->colorcells[i].pixel =
217: screen->Tcursorcolor;
218: XStoreColor(screen->display,
219: DefaultColormap(screen->display,
220: DefaultScreen(screen->display)),
221: &screen->colorcells[i]);
222: }
223: if(!Ttoggled)
224: TCursorToggle(TOGGLE);
225: } else {
226: VTUnselect();
227: if(screen->cursor_state &&
228: (screen->cursor_col != screen->cur_col ||
229: screen->cursor_row != screen->cur_row))
230: HideCursor();
231: if(screen->cursor_state)
232: ShowCursor();
233: }
234: }
235: }
236:
237: reselectwindow(screen)
238: register TScreen *screen;
239: {
240: Window root, win;
241: int rootx, rooty, x, y;
242: unsigned int mask;
243:
244: if(XQueryPointer(
245: screen->display,
246: DefaultRootWindow(screen->display),
247: &root, &win,
248: &rootx, &rooty,
249: &x, &y,
250: &mask)) {
251: if(win && (win == VWindow(screen) || win == TWindow(screen)))
252: selectwindow(screen, INWINDOW);
253: else unselectwindow(screen, INWINDOW);
254: }
255: }
256:
257: Pixmap Make_tile(width, height, bits, foreground, background, depth)
258: unsigned int width, height, depth;
259: Pixel foreground, background;
260: char *bits;
261: {
262: register GC gc;
263: register Pixmap pix;
264: register TScreen *screen = &term.screen;
265: XGCValues gcVals;
266: XImage tileimage;
267: GC XtGetGC();
268:
269: pix = (Pixmap)XCreatePixmap(screen->display,
270: DefaultRootWindow(screen->display), width, height, depth);
271: gcVals.foreground = foreground;
272: gcVals.background = background;
273: gc = XCreateGC(screen->display, (Drawable) pix,
274: GCForeground+GCBackground, &gcVals);
275: tileimage.height = height;
276: tileimage.width = width;
277: tileimage.xoffset = 0;
278: tileimage.format = XYBitmap;
279: tileimage.data = bits;
280: tileimage.byte_order = LSBFirst;
281: tileimage.bitmap_unit = 8;
282: tileimage.bitmap_bit_order = LSBFirst;
283: tileimage.bitmap_pad = 8;
284: tileimage.bytes_per_line = (width+7)>>3;
285: tileimage.depth = 1;
286: XPutImage(screen->display, pix, gc, &tileimage, 0, 0, 0, 0, width, height);
287: /* done with gc */
288: return(pix);
289: }
290:
291:
292: Pixmap make_gray(fg, bg, depth)
293: Pixel fg, bg;
294: {
295: return(Make_tile(gray_width, gray_height, gray_bits, fg, bg, depth));
296: }
297:
298: /* ARGSUSED */
299: Cursor make_tcross(fg, bg)
300: Pixel fg, bg;
301: {
302: register TScreen *screen = &term.screen;
303: Cursor c;
304:
305: c = XCreateFontCursor(screen->display, XC_tcross);
306: /*
307: XRecolorCursor(screen->display, c, PixelToColor(fg), PixelToColor(bg));
308: */
309: return(c);
310: }
311:
312: /* ARGSUSED */
313: Cursor make_xterm(fg, bg)
314: unsigned long fg, bg;
315: {
316: register TScreen *screen = &term.screen;
317: Cursor c;
318:
319: c = XCreateFontCursor(screen->display, XC_xterm);
320: /*
321: XRecolorCursor(screen->display, c, PixelToColor(fg), PixelToColor(bg));
322: */
323: return(c);
324: }
325:
326: static XColor foreground = { 0L, 65535, 65535, 65535 };
327: static XColor background = { 0L, 0, 0, 0 };
328:
329: Cursor make_wait(fg, bg)
330: Pixel fg, bg;
331: {
332: register TScreen *screen = &term.screen;
333: Pixmap source, mask;
334:
335: source = Make_tile(wait_width, wait_height, wait_bits, fg, bg, 1);
336: mask = Make_tile(waitmask_width, waitmask_height, waitmask_bits,
337: fg, bg, 1);
338: /*
339: return(XCreatePixmapCursor(screen->display, source, mask, PixelToColor(fg),
340: PixelToColor(bg), wait_x_hot, wait_y_hot));
341: */
342: return(XCreatePixmapCursor(screen->display, source, mask,
343: &foreground, &background, wait_x_hot, wait_y_hot));
344: }
345:
346: /* ARGSUSED */
347: Cursor make_arrow(fg, bg)
348: unsigned long fg, bg;
349:
350: {
351: register TScreen *screen = &term.screen;
352: Cursor c;
353:
354: c = XCreateFontCursor(screen->display, XC_left_ptr);
355: /*
356: XRecolorCursor(screen->display, c, PixelToColor(fg), PixelToColor(bg));
357: */
358: return(c);
359: }
360:
361: char *uniquesuffix(name)
362: char *name;
363: {
364: register int *np, *fp, i;
365: register Window *cp;
366: register int temp, j, k, exact, *number;
367: char *wname;
368: Window *children, parent, root;
369: unsigned int nchildren;
370: static char *suffix, sufbuf[10];
371: TScreen *screen = &term.screen;
372: char *malloc();
373:
374: if(suffix)
375: return(suffix);
376: suffix = sufbuf;
377: if(!XQueryTree(
378: screen->display,
379: DefaultRootWindow(screen->display),
380: &root, &parent,
381: &children, &nchildren) ||
382: nchildren < 1 || (number = (int *)malloc((unsigned)nchildren * sizeof(int)))
383: == NULL)
384: return(suffix);
385: exact = FALSE;
386: i = strlen(name);
387: for(np = number, cp = children, j = nchildren ; j > 0 ; cp++, j--) {
388: if(!XFetchName(screen->display, *cp, &wname) || wname == NULL)
389: continue;
390: if(strncmp(name, wname, i) == 0) {
391: if(wname[i] == 0 || XStrCmp(&wname[i], " (Tek)") == 0)
392: exact = TRUE;
393: else if(strncmp(&wname[i], " #", 2) == 0)
394: *np++ = atoi(&wname[i + 2]);
395: }
396: free(wname);
397: }
398: free((char *)children);
399: if(exact) {
400: if(np <= number)
401: strcpy(suffix, " #2");
402: else {
403: exact = np - number;
404: np = number;
405: /* shell sort */
406: for(i = exact / 2 ; i > 0 ; i /= 2)
407: for(k = i ; k < exact ; k++)
408: for(j = k - i ; j >= 0 &&
409: np[j] > np[j + i] ; j -= i) {
410: temp = np[j];
411: np[j] = np[j + i];
412: np[j + i] = temp;
413: }
414: /* make numbers unique */
415: for(fp = np + 1, i = exact - 1 ; i > 0 ; fp++, i--)
416: if(*fp != *np)
417: *++np = *fp;
418: /* find least unique number */
419: for(i = 2, fp = number ; fp <= np ; fp++) {
420: if(i < *fp)
421: break;
422: if(i == *fp)
423: i++;
424: }
425: sprintf(suffix, " #%d", i);
426: }
427: }
428: free((char *)number);
429: return(suffix);
430: }
431:
432: Bell()
433: {
434: extern Terminal term;
435: register TScreen *screen = &term.screen;
436: register Pixel xorPixel = screen->foreground ^ screen->background;
437: XGCValues gcval;
438: GC visualGC;
439:
440: if(screen->visualbell) {
441: gcval.function = GXxor;
442: gcval.foreground = xorPixel;
443: visualGC = XtGetGC(screen->display, (XContext)NULL,
444: DefaultRootWindow(screen->display),
445: GCFunction+GCForeground, &gcval);
446: if(screen->TekEmu) {
447: XFillRectangle(
448: screen->display,
449: TWindow(screen),
450: visualGC,
451: 0, 0,
452: (unsigned) TFullWidth(screen),
453: (unsigned) TFullHeight(screen));
454: XFlush(screen->display);
455: XFillRectangle(
456: screen->display,
457: TWindow(screen),
458: visualGC,
459: 0, 0,
460: (unsigned) TFullWidth(screen),
461: (unsigned) TFullHeight(screen));
462: } else {
463: XFillRectangle(
464: screen->display,
465: VWindow(screen),
466: visualGC,
467: 0, 0,
468: (unsigned) FullWidth(screen),
469: (unsigned) FullHeight(screen));
470: XFlush(screen->display);
471: XFillRectangle(
472: screen->display,
473: VWindow(screen),
474: visualGC,
475: 0, 0,
476: (unsigned) FullWidth(screen),
477: (unsigned) FullHeight(screen));
478: }
479: } else
480: XBell(screen->display, 0);
481: }
482:
483: Redraw()
484: {
485: extern Terminal term;
486: register TScreen *screen = &term.screen;
487: XExposeEvent event;
488:
489: event.type = Expose;
490: event.display = screen->display;
491: event.x = 0;
492: event.y = 0;
493: event.width = DisplayWidth(
494: screen->display, DefaultScreen(screen->display));
495: event.height =DisplayHeight(
496: screen->display, DefaultScreen(screen->display));
497: event.count = 0;
498:
499: if(VWindow(screen)) {
500: extern XtEventReturnCode VTExpose();
501:
502: event.window = VWindow(screen);
503: (void) VTExpose(&event, (caddr_t)NULL);
504: if(screen->scrollbar) {
505: RedrawScrollBar(screen->scrollWindow);
506: }
507: }
508: if(TWindow(screen) && screen->Tshow) {
509: event.window = TWindow(screen);
510: TekExpose(&event);
511: }
512: }
513:
514: SyncUnmap(win, mask)
515: register Window win;
516: register long int mask;
517: {
518: XEvent ev;
519: register XEvent *rep = &ev;
520: register TScreen *screen = &term.screen;
521:
522: do { /* ignore events through unmap */
523: XWindowEvent(screen->display, win, mask, rep);
524: } while(rep->type != UnmapNotify);
525: }
526:
527: StartLog(screen)
528: register TScreen *screen;
529: {
530: register char *cp;
531: register int i;
532: static char *log_default;
533: char *malloc(), *rindex();
534: extern logpipe();
535:
536: if(screen->logging || (screen->inhibit & I_LOG))
537: return;
538: if(screen->logfile == NULL || *screen->logfile == 0) {
539: if(screen->logfile)
540: free(screen->logfile);
541: if(log_default == NULL)
542: mktemp(log_default = log_def_name);
543: if((screen->logfile = malloc((unsigned)strlen(log_default) + 1)) == NULL)
544: return;
545: strcpy(screen->logfile, log_default);
546: }
547: if(*screen->logfile == '|') { /* exec command */
548: int p[2];
549: static char *shell;
550:
551: if(pipe(p) < 0 || (i = fork()) < 0)
552: return;
553: if(i == 0) { /* child */
554: close(p[1]);
555: dup2(p[0], 0);
556: close(p[0]);
557: dup2(fileno(stderr), 1);
558: dup2(fileno(stderr), 2);
559: close(fileno(stderr));
560: fileno(stderr) = 2;
561: close(screen->display->fd);
562: close(screen->respond);
563: if(!shell) {
564: register struct passwd *pw;
565: char *getenv(), *malloc();
566: struct passwd *getpwuid();
567:
568: if(((cp = getenv("SHELL")) == NULL || *cp == 0)
569: && ((pw = getpwuid(screen->uid)) == NULL ||
570: *(cp = pw->pw_shell) == 0) ||
571: (shell = malloc((unsigned) strlen(cp) + 1)) == NULL)
572: shell = "/bin/sh";
573: else
574: strcpy(shell, cp);
575: }
576: signal(SIGHUP, SIG_DFL);
577: signal(SIGCHLD, SIG_DFL);
578: setgid(screen->gid);
579: setuid(screen->uid);
580: execl(shell, shell, "-c", &screen->logfile[1], 0);
581: fprintf(stderr, "%s: Can't exec `%s'\n", xterm_name,
582: &screen->logfile[1]);
583: exit(ERROR_LOGEXEC);
584: }
585: close(p[0]);
586: screen->logfd = p[1];
587: signal(SIGPIPE, logpipe);
588: } else {
589: if(access(screen->logfile, F_OK) == 0) {
590: if(access(screen->logfile, W_OK) < 0)
591: return;
592: } else if(cp = rindex(screen->logfile, '/')) {
593: *cp = 0;
594: i = access(screen->logfile, W_OK);
595: *cp = '/';
596: if(i < 0)
597: return;
598: } else if(access(".", W_OK) < 0)
599: return;
600: if((screen->logfd = open(screen->logfile, O_WRONLY | O_APPEND |
601: O_CREAT, 0644)) < 0)
602: return;
603: chown(screen->logfile, screen->uid, screen->gid);
604:
605: }
606: screen->logstart = screen->TekEmu ? Tbptr : bptr;
607: screen->logging = TRUE;
608: }
609:
610: CloseLog(screen)
611: register TScreen *screen;
612: {
613: if(!screen->logging || (screen->inhibit & I_LOG))
614: return;
615: FlushLog(screen);
616: close(screen->logfd);
617: screen->logging = FALSE;
618: }
619:
620: FlushLog(screen)
621: register TScreen *screen;
622: {
623: register char *cp;
624: register int i;
625:
626: cp = screen->TekEmu ? Tbptr : bptr;
627: if((i = cp - screen->logstart) > 0)
628: write(screen->logfd, screen->logstart, i);
629: screen->logstart = screen->TekEmu ? Tbuffer : buffer;
630: }
631:
632: logpipe()
633: {
634: register TScreen *screen = &term.screen;
635:
636: if(screen->logging)
637: CloseLog(screen);
638: }
639:
640:
641: do_osc(func)
642: int (*func)();
643: {
644: register TScreen *screen = &term.screen;
645: register int mode, c;
646: register char *cp;
647: char buf[512];
648: extern char *malloc();
649:
650: mode = 0;
651: while(isdigit(c = (*func)()))
652: mode = 10 * mode + (c - '0');
653: cp = buf;
654: while(isprint(c = (*func)()))
655: *cp++ = c;
656: *cp = 0;
657: switch(mode) {
658: case 0: /* new icon name and title*/
659: Changename(buf);
660: Changetitle(buf);
661: break;
662:
663: case 1: /* new icon name only */
664: Changename(buf);
665: break;
666:
667: case 2: /* new title only */
668: Changetitle(buf);
669: break;
670:
671:
672: case 46: /* new log file */
673: if((cp = malloc((unsigned)strlen(buf) + 1)) == NULL)
674: break;
675: strcpy(cp, buf);
676: if(screen->logfile)
677: free(screen->logfile);
678: screen->logfile = cp;
679: break;
680: }
681: }
682:
683: Changename(name)
684: register char *name;
685: {
686: register TScreen *screen = &term.screen;
687:
688: free(screen->iconname);
689: if((screen->iconname =
690: malloc((unsigned)(screen->iconnamelen = strlen(name)) + 1)) == NULL)
691: Error(ERROR_CNMALLOC1);
692: strcpy(screen->iconname, name);
693: if(screen->fullVwin.window) {
694: XChangeProperty(
695: screen->display,
696: VWindow(screen),
697: XA_WM_ICON_NAME, XA_STRING,
698: 8, PropModeReplace,
699: (unsigned char *)name, screen->iconnamelen);
700: }
701: if(screen->fullTwin.window) {
702: free(screen->Ticonname);
703: if((screen->Ticonname = malloc((unsigned)(screen->Ticonnamelen =
704: screen->iconnamelen + 6) + 1)) == NULL)
705: Error(ERROR_CNMALLOC2);
706: strcpy(screen->Ticonname, name);
707: strcat(screen->Ticonname, " (Tek)");
708: XChangeProperty(
709: screen->display,
710: VWindow(screen),
711: XA_WM_ICON_NAME, XA_STRING, 8, PropModeReplace,
712: (unsigned char *)screen->Ticonname, screen->Ticonnamelen);
713: }
714: }
715:
716: Changetitle(name)
717: register char *name;
718: {
719: register TScreen *screen = &term.screen;
720:
721: free(screen->titlename);
722: if((screen->titlename =
723: malloc((unsigned)(screen->titlenamelen = strlen(name)) + 1)) == NULL)
724: Error(ERROR_CNMALLOC1);
725: strcpy(screen->titlename, name);
726: if(screen->fullVwin.window) {
727: XStoreName(screen->display, VWindow(screen), name);
728: }
729: if(screen->fullTwin.window) {
730: free(screen->Ttitlename);
731: if((screen->Ttitlename = malloc((unsigned)(screen->Ttitlenamelen =
732: screen->titlenamelen + 6) + 1)) == NULL)
733: Error(ERROR_CNMALLOC2);
734: strcpy(screen->Ttitlename, name);
735: strcat(screen->Ttitlename, " (Tek)");
736: XStoreName(screen->display, TWindow(screen), screen->Ttitlename);
737: }
738: }
739:
740: #ifndef DEBUG
741: /* ARGSUSED */
742: #endif
743: Panic(s, a)
744: char *s;
745: int a;
746: {
747: #ifdef DEBUG
748: if(debug) {
749: fprintf(stderr, "%s: PANIC! ", xterm_name);
750: fprintf(stderr, s, a);
751: fputs("\r\n", stderr);
752: fflush(stderr);
753: }
754: #endif DEBUG
755: }
756:
757: SysError (i)
758: int i;
759: {
760: fprintf (stderr, "%s: Error %d, errno %d:\n", xterm_name, i, errno);
761: perror ("");
762: Cleanup(i);
763: }
764:
765: Error (i)
766: int i;
767: {
768: fprintf (stderr, "%s: Error %d\n", xterm_name, i);
769: Cleanup(i);
770: }
771:
772: /*
773: * cleanup by sending SIGHUP to client processes
774: */
775: Cleanup (code)
776: int code;
777: {
778: #ifdef notdef
779: extern Terminal term;
780: register TScreen *screen;
781:
782: screen = &term.screen;
783: if (screen->pid > 1)
784: killpg(getpgrp(screen->pid), SIGHUP);
785: #endif
786: Exit (code);
787: }
788:
789: /*
790: * sets the value of var to be arg in the Unix 4.2 BSD environment env.
791: * Var should end with '=' (bindings are of the form "var=value").
792: * This procedure assumes the memory for the first level of environ
793: * was allocated using calloc, with enough extra room at the end so not
794: * to have to do a realloc().
795: */
796: Setenv (var, value)
797: register char *var, *value;
798: {
799: extern char **environ;
800: register int index = 0;
801: register int len = strlen(var);
802:
803: while (environ [index] != NULL) {
804: if (strncmp (environ [index], var, len) == 0) {
805: /* found it */
806: environ[index] = (char *)malloc ((unsigned)len + strlen (value) + 1);
807: strcpy (environ [index], var);
808: strcat (environ [index], value);
809: return;
810: }
811: index ++;
812: }
813:
814: #ifdef DEBUG
815: if (debug) fputs ("expanding env\n", stderr);
816: #endif DEBUG
817:
818: environ [index] = (char *) malloc ((unsigned)len + strlen (value) + 1);
819: (void) strcpy (environ [index], var);
820: strcat (environ [index], value);
821: environ [++index] = NULL;
822: }
823:
824: /*
825: * returns a pointer to the first occurrence of s2 in s1,
826: * or NULL if there are none.
827: */
828: char *strindex (s1, s2)
829: register char *s1, *s2;
830: {
831: register char *s3;
832: char *index();
833:
834: while ((s3=index(s1, *s2)) != NULL) {
835: if (strncmp(s3, s2, strlen(s2)) == 0)
836: return (s3);
837: s1 = ++s3;
838: }
839: return (NULL);
840: }
841:
842: /*ARGSUSED*/
843: xerror(d, ev)
844: Display *d;
845: register XErrorEvent *ev;
846: {
847: char buffer[BUFSIZ];
848: XGetErrorText(d, ev->error_code, buffer, BUFSIZ);
849: fprintf(stderr, "%s: %s\n", xterm_name, buffer);
850: fprintf(stderr, "Request code %d, minor code %d, serial #%ld, resource id %ld\n",
851: ev->request_code, ev->minor_code, ev->serial, (long)ev->resourceid);
852: _cleanup();
853: abort();
854: /* Exit(ERROR_XERROR); */
855: }
856:
857: /*ARGSUSED*/
858: xioerror(d)
859: Display *d;
860: {
861: perror(xterm_name);
862: Exit(ERROR_XIOERROR);
863: }
864:
865: XStrCmp(s1, s2)
866: char *s1, *s2;
867: {
868: if (s1 && s2) return(strcmp(s1, s2));
869: if (s1 && *s1) return(1);
870: if (s2 && *s2) return(-1);
871: return(0);
872: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.