xembed.c
1/*
2 * See LICENSE file for copyright and license details.
3 */
4
5#include <fcntl.h>
6#include <stdio.h>
7#include <stdlib.h>
8#include <unistd.h>
9
10int
11main(int argc, char *argv[])
12{
13 char *xembed;
14 int tty;
15 pid_t pgrp, tcpgrp;
16
17 if (argc < 3) {
18 fprintf(stderr, "usage: %s flag cmd ...\n", argv[0]);
19 return 2;
20 }
21
22 if (!(xembed = getenv("XEMBED")))
23 goto noembed;
24
25 if ((tty = open("/dev/tty", O_RDONLY)) < 0)
26 goto noembed;
27
28 pgrp = getpgrp();
29 tcpgrp = tcgetpgrp(tty);
30
31 close(tty);
32
33 if (pgrp == tcpgrp) { /* in foreground of tty */
34 argv[0] = argv[2];
35 argv[2] = xembed;
36 } else {
37noembed:
38 argv += 2;
39 }
40
41 execvp(argv[0], argv);
42
43 perror(argv[0]); /* failed to execute */
44 return 1;
45}