* @(#)getttyent.c 8.1 (Berkeley) 6/4/93
*/
+#include <sys/cdefs.h>
+
#include <ttyent.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
+#include <dirent.h>
+#include <paths.h>
static char zapchar;
static FILE *tf;
+static int maxpts = -1;
+static int curpts = 0;
static size_t lbsize;
static char *line;
+#define PTS "pts/"
#define MALLOCCHUNK 100
static char *skip (char *);
getttyent(void)
{
static struct ttyent tty;
+ static char devpts_name[] = "pts/9999999999";
char *p;
int c;
size_t i;
if (!tf && !setttyent())
return (NULL);
for (;;) {
- if (!fgets(p = line, lbsize, tf))
+ if (!fgets(p = line, lbsize, tf)) {
+ if (curpts <= maxpts) {
+ sprintf(devpts_name, "pts/%d", curpts++);
+ tty.ty_name = devpts_name;
+ tty.ty_getty = NULL;
+ 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') && !feof(tf)) {
i = strlen(p);
int
setttyent(void)
{
+ DIR *devpts_dir;
+ struct dirent *dp;
+ int unit;
if (line == NULL) {
if ((line = malloc(MALLOCCHUNK)) == NULL)
return (0);
lbsize = MALLOCCHUNK;
}
+ devpts_dir = opendir(_PATH_DEV PTS);
+ if (devpts_dir) {
+ maxpts = -1;
+ while ((dp = readdir(devpts_dir))) {
+ if (strcmp(dp->d_name, ".") == 0 ||
+ strcmp(dp->d_name, "..") == 0)
+ continue;
+
+ unit = (int)strtol(dp->d_name, NULL, 10);
+
+ if (unit > maxpts) {
+ maxpts = unit;
+ curpts = 0;
+ }
+ }
+ closedir(devpts_dir);
+ }
if (tf) {
rewind(tf);
return (1);
{
int rval;
+ maxpts = -1;
/*
* NB: Don't free `line' because getttynam()
* may still be referencing it