summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorcognet <cognet@FreeBSD.org>2006-01-26 01:34:26 +0000
committercognet <cognet@FreeBSD.org>2006-01-26 01:34:26 +0000
commitee802bd791d055b682a9f1f90cfed85261d92f29 (patch)
treede773faed1dff71907b6ab023b8abdf8f9e1728c /lib
parentfcd65bac7620398862fc46639d5c85655daceaf6 (diff)
downloadFreeBSD-src-ee802bd791d055b682a9f1f90cfed85261d92f29.zip
FreeBSD-src-ee802bd791d055b682a9f1f90cfed85261d92f29.tar.gz
Make getttyent() report what the pts ptys as well.
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/gen/getttyent.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/lib/libc/gen/getttyent.c b/lib/libc/gen/getttyent.c
index 5578f04..db90bf2 100644
--- a/lib/libc/gen/getttyent.c
+++ b/lib/libc/gen/getttyent.c
@@ -42,12 +42,18 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
+#include <dirent.h>
+#include <paths.h>
static char zapchar;
static FILE *tf;
+static int maxpts = 0;
+static int curpts = 0;
+static int pts_valid = 0;
static size_t lbsize;
static char *line;
+#define PTS "pts/"
#define MALLOCCHUNK 100
static char *skip(char *);
@@ -73,6 +79,7 @@ struct ttyent *
getttyent()
{
static struct ttyent tty;
+ static char devpts_name[] = "pts/4294967295";
char *p;
int c;
size_t i;
@@ -80,8 +87,19 @@ getttyent()
if (!tf && !setttyent())
return (NULL);
for (;;) {
- if (!fgets(p = line, lbsize, tf))
+ if (!fgets(p = line, lbsize, tf)) {
+ if (pts_valid == 1 && curpts <= maxpts) {
+ sprintf(devpts_name, "pts/%d", curpts++);
+ tty.ty_name = devpts_name;
+ tty.ty_getty = tty.ty_type = NULL;
+ tty.ty_status = TTY_NETWORK;
+ tty.ty_window = NULL;
+ tty.ty_comment = NULL;
+ tty.ty_group = _TTYS_NOGROUP;
+ return (&tty);
+ }
return (NULL);
+ }
/* extend buffer if line was too big, and retry */
while (!index(p, '\n')) {
i = strlen(p);
@@ -209,12 +227,30 @@ value(p)
int
setttyent()
{
+ DIR *devpts_dir;
if (line == NULL) {
if ((line = malloc(MALLOCCHUNK)) == NULL)
return (0);
lbsize = MALLOCCHUNK;
}
+ devpts_dir = opendir(_PATH_DEV PTS);
+ if (devpts_dir) {
+ struct dirent *dp;
+
+ while ((dp = readdir(devpts_dir))) {
+ if (strcmp(dp->d_name, ".") != 0 &&
+ strcmp(dp->d_name, "..") != 0) {
+ if (atoi(dp->d_name) > maxpts) {
+ maxpts = atoi(dp->d_name);
+ pts_valid = 1;
+ curpts = 0;
+ }
+ }
+ }
+ closedir(devpts_dir);
+ }
+ printf("it is %d %d\n", maxpts, curpts);
if (tf) {
rewind(tf);
return (1);
@@ -228,6 +264,7 @@ endttyent()
{
int rval;
+ pts_valid = 0;
/*
* NB: Don't free `line' because getttynam()
* may still be referencing it
OpenPOWER on IntegriCloud