source: MondoRescue/branches/3.3/mindi-busybox/libbb/getpty.c@ 3906

Last change on this file since 3906 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

  • Property svn:eol-style set to native
File size: 1.4 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*
3 * Mini getpty implementation for busybox
4 * Bjorn Wesen, Axis Communications AB (bjornw@axis.com)
5 *
6 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
7 */
8
9#include "libbb.h"
10
11#define DEBUG 0
12
13int FAST_FUNC xgetpty(char *line)
14{
15 int p;
16
17#if ENABLE_FEATURE_DEVPTS
18 p = open("/dev/ptmx", O_RDWR);
19 if (p >= 0) {
20 grantpt(p); /* chmod+chown corresponding slave pty */
21 unlockpt(p); /* (what does this do?) */
22# ifndef HAVE_PTSNAME_R
23 {
24 const char *name;
25 name = ptsname(p); /* find out the name of slave pty */
26 if (!name) {
27 bb_perror_msg_and_die("ptsname error (is /dev/pts mounted?)");
28 }
29 safe_strncpy(line, name, GETPTY_BUFSIZE);
30 }
31# else
32 /* find out the name of slave pty */
33 if (ptsname_r(p, line, GETPTY_BUFSIZE-1) != 0) {
34 bb_perror_msg_and_die("ptsname error (is /dev/pts mounted?)");
35 }
36 line[GETPTY_BUFSIZE-1] = '\0';
37# endif
38 return p;
39 }
40#else
41 struct stat stb;
42 int i;
43 int j;
44
45 strcpy(line, "/dev/ptyXX");
46
47 for (i = 0; i < 16; i++) {
48 line[8] = "pqrstuvwxyzabcde"[i];
49 line[9] = '0';
50 if (stat(line, &stb) < 0) {
51 continue;
52 }
53 for (j = 0; j < 16; j++) {
54 line[9] = j < 10 ? j + '0' : j - 10 + 'a';
55 if (DEBUG)
56 fprintf(stderr, "Trying to open device: %s\n", line);
57 p = open(line, O_RDWR | O_NOCTTY);
58 if (p >= 0) {
59 line[5] = 't';
60 return p;
61 }
62 }
63 }
64#endif /* FEATURE_DEVPTS */
65 bb_error_msg_and_die("can't find free pty");
66}
Note: See TracBrowser for help on using the repository browser.