32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
-
+
|
* Also places the canonical host name into `realhost'. It must be
* freed by the caller.
*/
static char *pty_init(char *host, int port, char **realhost, int nodelay)
{
int slavefd;
char name[FILENAME_MAX];
pid_t pid;
pid_t pid, pgrp;
pty_master_fd = open("/dev/ptmx", O_RDWR);
if (pty_master_fd < 0) {
perror("/dev/ptmx: open");
exit(1);
}
|
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
|
perror("unlockpt");
exit(1);
}
name[FILENAME_MAX-1] = '\0';
strncpy(name, ptsname(pty_master_fd), FILENAME_MAX-1);
slavefd = open(name, O_RDWR);
if (slavefd < 0) {
perror("slave pty: open");
exit(1);
}
/*
* Fork and execute the command.
*/
pid = fork();
if (pid < 0) {
perror("fork");
exit(1);
}
if (pid == 0) {
int i;
/*
* We are the child.
*/
slavefd = open(name, O_RDWR);
if (slavefd < 0) {
perror("slave pty: open");
exit(1);
}
close(pty_master_fd);
close(0);
close(1);
close(2);
fcntl(slavefd, F_SETFD, 0); /* don't close on exec */
dup2(slavefd, 0);
dup2(slavefd, 1);
dup2(slavefd, 2);
setsid();
ioctl(slavefd, TIOCSCTTY, 1);
pgrp = getpid();
tcsetpgrp(slavefd, pgrp);
setpgrp();
close(open(name, O_WRONLY, 0));
tcsetpgrp(slavefd, getpgrp());
setpgrp();
/* Close everything _else_, for tidiness. */
for (i = 3; i < 1024; i++)
close(i);
{
char term_env_var[10 + sizeof(cfg.termtype)];
sprintf(term_env_var, "TERM=%s", cfg.termtype);
putenv(term_env_var);
|