From af09c34069091b030dca6cadbf0dae8004c92bbd Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Thu, 26 Jan 2006 01:34:26 +0000 Subject: [PATCH] Make getttyent() report what the pts ptys as well. --- lib/libc/gen/getttyent.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/lib/libc/gen/getttyent.c b/lib/libc/gen/getttyent.c index 5578f04704f2..db90bf284738 100644 --- a/lib/libc/gen/getttyent.c +++ b/lib/libc/gen/getttyent.c @@ -42,12 +42,18 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include 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