Skip to content

Commit c6c4503

Browse files
Marc TeitelbaumMarc Teitelbaum
Marc Teitelbaum
authored and
Marc Teitelbaum
committed
new interface
SCCS-vsn: lib/libutil/pty.c 1.2 SCCS-vsn: lib/libc/gen/daemon.c 5.2
1 parent c786f8a commit c6c4503

File tree

2 files changed

+72
-16
lines changed

2 files changed

+72
-16
lines changed

‎usr/src/lib/libc/gen/daemon.c

+16-10
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,32 @@
66
*/
77

88
#if defined(LIBC_SCCS) && !defined(lint)
9-
static char sccsid[] = "@(#)daemon.c 5.1 (Berkeley) %G%";
9+
static char sccsid[] = "@(#)daemon.c 5.2 (Berkeley) %G%";
1010
#endif /* LIBC_SCCS and not lint */
1111

1212
#include <sys/file.h>
1313

14-
daemon()
14+
daemon(nochdir, noclose)
15+
int nochdir, noclose;
1516
{
1617
int cpid;
1718

1819
if ((cpid = fork()) == -1)
1920
return (-1);
2021
if (cpid)
2122
exit(0);
22-
2323
(void) setsid();
24-
(void) chdir("/");
25-
(void) close(0);
26-
(void) close(1);
27-
(void) close(2);
28-
(void) open("/", O_RDONLY, 0);
29-
(void) dup2(0, 1);
30-
(void) dup2(0, 2);
24+
if (!nochdir)
25+
(void) chdir("/");
26+
if (!noclose) {
27+
int devnull = open("/dev/null", O_RDWR, 0);
28+
29+
if (devnull != -1) {
30+
(void) dup2(devnull, 0);
31+
(void) dup2(devnull, 1);
32+
(void) dup2(devnull, 2);
33+
if (devnull > 2)
34+
(void) close(devnull);
35+
}
36+
}
3137
}

‎usr/src/lib/libutil/pty.c

+56-6
Original file line numberDiff line numberDiff line change
@@ -6,41 +6,91 @@
66
*/
77

88
#if defined(LIBC_SCCS) && !defined(lint)
9-
static char sccsid[] = "@(#)pty.c 1.1 (Berkeley) %G%";
9+
static char sccsid[] = "@(#)pty.c 1.2 (Berkeley) %G%";
1010
#endif /* LIBC_SCCS and not lint */
1111

1212
#include <sys/file.h>
13+
#include <sys/ioctl.h>
14+
#include <termios.h>
15+
#include <grp.h>
1316
#include <errno.h>
1417

15-
openpty(amaster, aslave, name, flag)
18+
openpty(amaster, aslave, name, termp, winp)
1619
int *amaster, *aslave;
1720
char *name;
18-
int flag;
21+
struct termios *termp;
22+
struct winsize *winp;
1923
{
2024
register char *line = "/dev/ptyXX", *cp1, *cp2;
21-
register master, slave;
25+
register master, slave, ruid, ttygid;
26+
struct group *gr;
2227
extern errno;
2328

29+
if ((gr = getgrnam("tty")) != NULL)
30+
ttygid = gr->gr_gid;
31+
else
32+
ttygid = -1;
33+
ruid = getuid();
34+
2435
for (cp1 = "pqrs"; *cp1; cp1++) {
2536
line[8] = *cp1;
2637
for (cp2 = "0123456789abcdef"; *cp2; cp2++) {
2738
line[9] = *cp2;
2839
if ((master = open(line, O_RDWR, 0)) == -1) {
2940
if (errno != EIO)
30-
return (-1);
41+
return (-1); /* out of ptys */
3142
} else {
3243
line[5] = 't';
44+
(void) chown(line, ruid, ttygid);
45+
(void) chmod(line, 0620);
46+
(void) revoke(line);
3347
if ((slave = open(line, O_RDWR, 0)) != -1) {
3448
*amaster = master;
3549
*aslave = slave;
3650
if (name)
3751
strcpy(name, line);
52+
if (termp)
53+
(void) tcsetattr(slave,
54+
TCSAFLUSH, &termp);
55+
if (winp)
56+
(void) ioctl(slave, TIOCSWINSZ,
57+
(char *)&winp);
3858
return (0);
3959
}
40-
close(master);
60+
(void) close(master);
4161
line[5] = 'p';
4262
}
4363
}
4464
}
65+
errno = ENOENT; /* out of ptys */
4566
return (-1);
4667
}
68+
69+
forkpty(amaster, name, termp, winp)
70+
int *amaster;
71+
char *name;
72+
struct termios *termp;
73+
struct winsize *winp;
74+
{
75+
int master, slave, pid;
76+
77+
if (openpty(&master, &slave, name, termp, winp) == -1)
78+
return (-1);
79+
switch (pid = fork()) {
80+
case -1:
81+
return (-1);
82+
case 0:
83+
/*
84+
* child
85+
*/
86+
(void) close(master);
87+
login_tty(slave);
88+
return (0);
89+
}
90+
/*
91+
* parent
92+
*/
93+
*amaster = master;
94+
(void) close(slave);
95+
return (pid);
96+
}

0 commit comments

Comments
 (0)