diff options
author | cognet <cognet@FreeBSD.org> | 2006-01-26 01:34:26 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2006-01-26 01:34:26 +0000 |
commit | ee802bd791d055b682a9f1f90cfed85261d92f29 (patch) | |
tree | de773faed1dff71907b6ab023b8abdf8f9e1728c /lib | |
parent | fcd65bac7620398862fc46639d5c85655daceaf6 (diff) | |
download | FreeBSD-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.c | 39 |
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 |