Artifact cf2624b7734a6c25e11915f9c241a6ba993f9176a0c37cc77b5a32dcbc01aef9:

  • File xi.c — part of check-in [d20f3304c3] at 2018-06-15 14:22:26 on branch trunk — Added licensing back; testing markdown readme (user: jmcclure size: 2520)

0000: 2f 2a 20 58 49 2e 43 0a 20 2a 20 43 6f 70 79 72  /* XI.C. * Copyr
0010: 69 67 68 74 20 28 63 29 20 32 30 31 37 2c 20 32  ight (c) 2017, 2
0020: 30 31 38 20 4a 65 73 73 65 20 4d 63 43 6c 75 72  018 Jesse McClur
0030: 65 20 3c 63 6f 64 65 40 6a 65 73 73 65 6d 63 63  e <code@jessemcc
0040: 6c 75 72 65 2e 6f 72 67 3e 0a 20 2a 0a 20 2a 20  lure.org>. *. * 
0050: 50 65 72 6d 69 73 73 69 6f 6e 20 74 6f 20 75 73  Permission to us
0060: 65 2c 20 63 6f 70 79 2c 20 6d 6f 64 69 66 79 2c  e, copy, modify,
0070: 20 61 6e 64 20 64 69 73 74 72 69 62 75 74 65 20   and distribute 
0080: 74 68 69 73 20 73 6f 66 74 77 61 72 65 20 66 6f  this software fo
0090: 72 20 61 6e 79 0a 20 2a 20 70 75 72 70 6f 73 65  r any. * purpose
00a0: 20 77 69 74 68 20 6f 72 20 77 69 74 68 6f 75 74   with or without
00b0: 20 66 65 65 20 69 73 20 68 65 72 65 62 79 20 67   fee is hereby g
00c0: 72 61 6e 74 65 64 2c 20 70 72 6f 76 69 64 65 64  ranted, provided
00d0: 20 74 68 61 74 20 74 68 65 20 61 62 6f 76 65 0a   that the above.
00e0: 20 2a 20 63 6f 70 79 72 69 67 68 74 20 6e 6f 74   * copyright not
00f0: 69 63 65 20 61 6e 64 20 74 68 69 73 20 70 65 72  ice and this per
0100: 6d 69 73 73 69 6f 6e 20 6e 6f 74 69 63 65 20 61  mission notice a
0110: 70 70 65 61 72 20 69 6e 20 61 6c 6c 20 63 6f 70  ppear in all cop
0120: 69 65 73 2e 0a 20 2a 0a 20 2a 20 54 48 45 20 53  ies.. *. * THE S
0130: 4f 46 54 57 41 52 45 20 49 53 20 50 52 4f 56 49  OFTWARE IS PROVI
0140: 44 45 44 20 22 41 53 20 49 53 22 20 41 4e 44 20  DED "AS IS" AND 
0150: 54 48 45 20 41 55 54 48 4f 52 20 44 49 53 43 4c  THE AUTHOR DISCL
0160: 41 49 4d 53 20 41 4c 4c 20 57 41 52 52 41 4e 54  AIMS ALL WARRANT
0170: 49 45 53 0a 20 2a 20 57 49 54 48 20 52 45 47 41  IES. * WITH REGA
0180: 52 44 20 54 4f 20 54 48 49 53 20 53 4f 46 54 57  RD TO THIS SOFTW
0190: 41 52 45 20 49 4e 43 4c 55 44 49 4e 47 20 41 4c  ARE INCLUDING AL
01a0: 4c 20 49 4d 50 4c 49 45 44 20 57 41 52 52 41 4e  L IMPLIED WARRAN
01b0: 54 49 45 53 20 4f 46 0a 20 2a 20 4d 45 52 43 48  TIES OF. * MERCH
01c0: 41 4e 54 41 42 49 4c 49 54 59 20 41 4e 44 20 46  ANTABILITY AND F
01d0: 49 54 4e 45 53 53 2e 20 49 4e 20 4e 4f 20 45 56  ITNESS. IN NO EV
01e0: 45 4e 54 20 53 48 41 4c 4c 20 54 48 45 20 41 55  ENT SHALL THE AU
01f0: 54 48 4f 52 20 42 45 20 4c 49 41 42 4c 45 20 46  THOR BE LIABLE F
0200: 4f 52 0a 20 2a 20 41 4e 59 20 53 50 45 43 49 41  OR. * ANY SPECIA
0210: 4c 2c 20 44 49 52 45 43 54 2c 20 49 4e 44 49 52  L, DIRECT, INDIR
0220: 45 43 54 2c 20 4f 52 20 43 4f 4e 53 45 51 55 45  ECT, OR CONSEQUE
0230: 4e 54 49 41 4c 20 44 41 4d 41 47 45 53 20 4f 52  NTIAL DAMAGES OR
0240: 20 41 4e 59 20 44 41 4d 41 47 45 53 0a 20 2a 20   ANY DAMAGES. * 
0250: 57 48 41 54 53 4f 45 56 45 52 20 52 45 53 55 4c  WHATSOEVER RESUL
0260: 54 49 4e 47 20 46 52 4f 4d 20 4c 4f 53 53 20 4f  TING FROM LOSS O
0270: 46 20 55 53 45 2c 20 44 41 54 41 20 4f 52 20 50  F USE, DATA OR P
0280: 52 4f 46 49 54 53 2c 20 57 48 45 54 48 45 52 20  ROFITS, WHETHER 
0290: 49 4e 20 41 4e 0a 20 2a 20 41 43 54 49 4f 4e 20  IN AN. * ACTION 
02a0: 4f 46 20 43 4f 4e 54 52 41 43 54 2c 20 4e 45 47  OF CONTRACT, NEG
02b0: 4c 49 47 45 4e 43 45 20 4f 52 20 4f 54 48 45 52  LIGENCE OR OTHER
02c0: 20 54 4f 52 54 49 4f 55 53 20 41 43 54 49 4f 4e   TORTIOUS ACTION
02d0: 2c 20 41 52 49 53 49 4e 47 20 4f 55 54 20 4f 46  , ARISING OUT OF
02e0: 0a 20 2a 20 4f 52 20 49 4e 20 43 4f 4e 4e 45 43  . * OR IN CONNEC
02f0: 54 49 4f 4e 20 57 49 54 48 20 54 48 45 20 55 53  TION WITH THE US
0300: 45 20 4f 52 20 50 45 52 46 4f 52 4d 41 4e 43 45  E OR PERFORMANCE
0310: 20 4f 46 20 54 48 49 53 20 53 4f 46 54 57 41 52   OF THIS SOFTWAR
0320: 45 2e 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65  E.. */..#include
0330: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0340: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0350: 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e  include <signal.
0360: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69  h>.#include <uni
0370: 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  std.h>.#include 
0380: 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 69  <sys/ioctl.h>.#i
0390: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 77 61 69 74  nclude <sys/wait
03a0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6c 69  .h>.#include <li
03b0: 6e 75 78 2f 6c 69 6d 69 74 73 2e 68 3e 0a 23 69  nux/limits.h>.#i
03c0: 6e 63 6c 75 64 65 20 3c 6c 69 6e 75 78 2f 76 74  nclude <linux/vt
03d0: 2e 68 3e 0a 0a 73 74 61 74 69 63 20 76 6f 6c 61  .h>..static vola
03e0: 74 69 6c 65 20 69 6e 74 20 78 72 75 6e 6e 69 6e  tile int xrunnin
03f0: 67 20 3d 20 30 3b 0a 0a 76 6f 69 64 20 68 61 6e  g = 0;..void han
0400: 64 6c 65 72 28 69 6e 74 20 73 69 67 29 20 7b 0a  dler(int sig) {.
0410: 09 69 66 20 28 73 69 67 20 3d 3d 20 53 49 47 55  .if (sig == SIGU
0420: 53 52 31 29 20 78 72 75 6e 6e 69 6e 67 20 3d 20  SR1) xrunning = 
0430: 31 3b 0a 09 69 66 20 28 73 69 67 20 3d 3d 20 53  1;..if (sig == S
0440: 49 47 43 48 4c 44 20 7c 7c 20 73 69 67 20 3d 3d  IGCHLD || sig ==
0450: 20 53 49 47 54 45 52 4d 29 20 78 72 75 6e 6e 69   SIGTERM) xrunni
0460: 6e 67 20 3d 20 30 3b 0a 7d 0a 0a 69 6e 74 20 73  ng = 0;.}..int s
0470: 65 72 76 65 72 28 63 6f 6e 73 74 20 63 68 61 72  erver(const char
0480: 20 2a 64 70 79 2c 20 63 6f 6e 73 74 20 63 68 61   *dpy, const cha
0490: 72 20 2a 74 74 79 2c 20 63 6f 6e 73 74 20 63 68  r *tty, const ch
04a0: 61 72 20 2a 78 61 75 74 68 29 20 7b 0a 09 63 6f  ar *xauth) {..co
04b0: 6e 73 74 20 63 68 61 72 20 2a 78 6f 72 67 20 3d  nst char *xorg =
04c0: 20 22 2f 75 73 72 2f 6c 69 62 2f 58 6f 72 67 22   "/usr/lib/Xorg"
04d0: 3b 0a 09 69 6e 74 20 70 69 64 3b 0a 09 69 66 20  ;..int pid;..if 
04e0: 28 28 70 69 64 3d 66 6f 72 6b 28 29 29 20 3c 20  ((pid=fork()) < 
04f0: 30 29 20 65 78 69 74 28 31 29 3b 0a 09 65 6c 73  0) exit(1);..els
0500: 65 20 69 66 20 28 70 69 64 20 3e 20 30 29 20 72  e if (pid > 0) r
0510: 65 74 75 72 6e 20 70 69 64 3b 0a 09 73 69 67 6e  eturn pid;..sign
0520: 61 6c 28 53 49 47 54 54 49 4e 2c 20 53 49 47 5f  al(SIGTTIN, SIG_
0530: 49 47 4e 29 3b 0a 09 73 69 67 6e 61 6c 28 53 49  IGN);..signal(SI
0540: 47 54 54 4f 55 2c 20 53 49 47 5f 49 47 4e 29 3b  GTTOU, SIG_IGN);
0550: 0a 09 73 69 67 6e 61 6c 28 53 49 47 55 53 52 31  ..signal(SIGUSR1
0560: 2c 20 53 49 47 5f 49 47 4e 29 3b 0a 09 65 78 65  , SIG_IGN);..exe
0570: 63 6c 28 78 6f 72 67 2c 20 78 6f 72 67 2c 20 64  cl(xorg, xorg, d
0580: 70 79 2c 20 74 74 79 2c 20 22 2d 6b 65 65 70 74  py, tty, "-keept
0590: 74 79 22 2c 20 22 2d 6e 6f 6c 69 73 74 65 6e 22  ty", "-nolisten"
05a0: 2c 20 22 74 63 70 22 2c 20 22 2d 71 75 69 65 74  , "tcp", "-quiet
05b0: 22 2c 20 22 2d 61 75 74 68 22 2c 20 78 61 75 74  ", "-auth", xaut
05c0: 68 2c 20 4e 55 4c 4c 29 3b 0a 09 5f 65 78 69 74  h, NULL);.._exit
05d0: 28 32 29 3b 0a 7d 0a 0a 69 6e 74 20 63 6c 69 65  (2);.}..int clie
05e0: 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  nt(const char *d
05f0: 70 79 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  py, const char *
0600: 77 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  wm, const char *
0610: 78 61 75 74 68 29 20 7b 0a 09 69 6e 74 20 70 69  xauth) {..int pi
0620: 64 3b 0a 09 69 66 20 28 28 70 69 64 3d 66 6f 72  d;..if ((pid=for
0630: 6b 28 29 29 20 3c 20 30 29 20 65 78 69 74 28 33  k()) < 0) exit(3
0640: 29 3b 0a 09 65 6c 73 65 20 69 66 20 28 70 69 64  );..else if (pid
0650: 20 3e 20 30 29 20 72 65 74 75 72 6e 20 70 69 64   > 0) return pid
0660: 3b 0a 09 73 65 74 65 6e 76 28 22 58 41 55 54 48  ;..setenv("XAUTH
0670: 4f 52 49 54 59 22 2c 20 78 61 75 74 68 2c 20 31  ORITY", xauth, 1
0680: 29 3b 0a 09 73 65 74 65 6e 76 28 22 44 49 53 50  );..setenv("DISP
0690: 4c 41 59 22 2c 20 64 70 79 2c 20 31 29 3b 0a 09  LAY", dpy, 1);..
06a0: 65 78 65 63 6c 70 28 77 6d 2c 20 77 6d 2c 20 4e  execlp(wm, wm, N
06b0: 55 4c 4c 29 3b 0a 09 5f 65 78 69 74 28 34 29 3b  ULL);.._exit(4);
06c0: 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74  .}..int main(int
06d0: 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
06e0: 72 20 2a 2a 61 72 67 76 29 20 7b 0a 09 73 74 72  r **argv) {..str
06f0: 75 63 74 20 76 74 5f 73 74 61 74 20 76 74 73 74  uct vt_stat vtst
0700: 61 74 3b 0a 09 69 66 20 28 69 6f 63 74 6c 28 30  at;..if (ioctl(0
0710: 2c 20 56 54 5f 47 45 54 53 54 41 54 45 2c 20 26  , VT_GETSTATE, &
0720: 76 74 73 74 61 74 29 29 20 7b 0a 09 09 70 65 72  vtstat)) {...per
0730: 72 6f 72 28 22 67 65 74 5f 76 74 22 29 3b 0a 09  ror("get_vt");..
0740: 09 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 09 63  .return 1;..}..c
0750: 68 61 72 20 64 70 79 5b 5d 20 3d 20 7b 20 27 3a  har dpy[] = { ':
0760: 27 2c 20 27 30 27 20 2b 20 76 74 73 74 61 74 2e  ', '0' + vtstat.
0770: 76 5f 61 63 74 69 76 65 2c 20 30 20 7d 3b 0a 09  v_active, 0 };..
0780: 63 68 61 72 20 74 74 79 5b 5d 20 3d 20 7b 20 27  char tty[] = { '
0790: 76 27 2c 20 27 74 27 2c 20 27 30 27 20 2b 20 76  v', 't', '0' + v
07a0: 74 73 74 61 74 2e 76 5f 61 63 74 69 76 65 2c 20  tstat.v_active, 
07b0: 30 20 7d 3b 0a 09 63 68 61 72 20 78 61 75 74 68  0 };..char xauth
07c0: 5b 50 41 54 48 5f 4d 41 58 5d 3b 0a 09 73 6e 70  [PATH_MAX];..snp
07d0: 72 69 6e 74 66 28 78 61 75 74 68 2c 20 50 41 54  rintf(xauth, PAT
07e0: 48 5f 4d 41 58 2c 20 22 25 73 2f 25 73 22 2c 20  H_MAX, "%s/%s", 
07f0: 67 65 74 65 6e 76 28 22 48 4f 4d 45 22 29 2c 20  getenv("HOME"), 
0800: 22 2e 58 61 75 74 68 6f 72 69 74 79 22 29 3b 0a  ".Xauthority");.
0810: 0a 09 73 74 72 75 63 74 20 73 69 67 61 63 74 69  ..struct sigacti
0820: 6f 6e 20 73 61 3b 0a 09 73 61 2e 73 61 5f 68 61  on sa;..sa.sa_ha
0830: 6e 64 6c 65 72 20 3d 20 68 61 6e 64 6c 65 72 3b  ndler = handler;
0840: 0a 09 73 69 67 65 6d 70 74 79 73 65 74 28 26 73  ..sigemptyset(&s
0850: 61 2e 73 61 5f 6d 61 73 6b 29 3b 0a 09 73 61 2e  a.sa_mask);..sa.
0860: 73 61 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 73  sa_flags = 0;..s
0870: 69 67 61 63 74 69 6f 6e 28 53 49 47 55 53 52 31  igaction(SIGUSR1
0880: 2c 20 26 73 61 2c 20 4e 55 4c 4c 29 3b 0a 09 73  , &sa, NULL);..s
0890: 69 67 61 63 74 69 6f 6e 28 53 49 47 43 48 4c 44  igaction(SIGCHLD
08a0: 2c 20 26 73 61 2c 20 4e 55 4c 4c 29 3b 0a 09 73  , &sa, NULL);..s
08b0: 69 67 61 63 74 69 6f 6e 28 53 49 47 54 45 52 4d  igaction(SIGTERM
08c0: 2c 20 26 73 61 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  , &sa, NULL);...
08d0: 69 6e 74 20 78 70 69 64 20 3d 20 73 65 72 76 65  int xpid = serve
08e0: 72 28 64 70 79 2c 20 74 74 79 2c 20 78 61 75 74  r(dpy, tty, xaut
08f0: 68 29 3b 0a 09 77 68 69 6c 65 20 28 21 78 72 75  h);..while (!xru
0900: 6e 6e 69 6e 67 29 20 70 61 75 73 65 28 29 3b 0a  nning) pause();.
0910: 09 69 6e 74 20 63 70 69 64 20 3d 20 63 6c 69 65  .int cpid = clie
0920: 6e 74 28 64 70 79 2c 20 28 61 72 67 63 20 3e 20  nt(dpy, (argc > 
0930: 31 20 3f 20 61 72 67 76 5b 31 5d 20 3a 20 22 78  1 ? argv[1] : "x
0940: 74 65 72 6d 22 20 29 2c 20 78 61 75 74 68 29 3b  term" ), xauth);
0950: 0a 09 77 68 69 6c 65 20 28 78 72 75 6e 6e 69 6e  ..while (xrunnin
0960: 67 29 20 70 61 75 73 65 28 29 3b 0a 0a 09 6b 69  g) pause();...ki
0970: 6c 6c 28 63 70 69 64 2c 20 53 49 47 54 45 52 4d  ll(cpid, SIGTERM
0980: 29 3b 0a 09 77 61 69 74 70 69 64 28 63 70 69 64  );..waitpid(cpid
0990: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09 6b 69 6c  , NULL, 0);..kil
09a0: 6c 28 78 70 69 64 2c 20 53 49 47 54 45 52 4d 29  l(xpid, SIGTERM)
09b0: 3b 0a 09 77 61 69 74 70 69 64 28 78 70 69 64 2c  ;..waitpid(xpid,
09c0: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09 72 65 74 75   NULL, 0);..retu
09d0: 72 6e 20 30 3b 0a 7d 0a                          rn 0;.}.