int ttyslot() { register struct ttyent *ttyp; register int slot; register char *p; int cnt; size_t buflen = __sysconf (_SC_TTY_NAME_MAX) + 1; char *name; if (buflen == 0) /* This should be enough if no fixed value is given. */ buflen = 32; name = __alloca (buflen); setttyent(); for (cnt = 0; cnt < 3; ++cnt) if (__ttyname_r (cnt, name, buflen) == 0) { if ((p = rindex(name, '/'))) ++p; else p = name; for (slot = 1; (ttyp = getttyent()); ++slot) if (!strcmp(ttyp->ty_name, p)) { endttyent(); return(slot); } break; } endttyent(); return(0); }
int ttyslot() { register struct ttyent *ttyp; register int slot; register char *p; int cnt; char *name; setttyent(); for (cnt = 0; cnt < 3; ++cnt) if ((name = ttyname(cnt))) { if ((p = strrchr(name, '/'))) ++p; else p = name; for (slot = 1; (ttyp = getttyent()); ++slot) if (!strcmp(ttyp->ty_name, p)) { endttyent(); return(slot); } break; } endttyent(); return(0); }
/* This is a slightly modification of code in OpenBSD's login.c */ static int utmp_write_direct(struct logininfo *li, struct utmp *ut) { return 1; #if 0 struct utmp old_ut; register int fd; int tty; /* FIXME: (ATL) ttyslot() needs local implementation */ #if defined(HAVE_GETTTYENT) register struct ttyent *ty; tty=0; setttyent(); while ((struct ttyent *)0 != (ty = getttyent())) { tty++; if (!strncmp(ty->ty_name, ut->ut_line, sizeof(ut->ut_line))) break; } endttyent(); if((struct ttyent *)0 == ty) { dropbear_log(LOG_WARNING, "utmp_write_entry: tty not found"); return(1); } #else /* FIXME */ tty = ttyslot(); /* seems only to work for /dev/ttyp? style names */ #endif /* HAVE_GETTTYENT */ if (tty > 0 && (fd = open(UTMP_FILE, O_RDWR|O_CREAT, 0644)) >= 0) { (void)lseek(fd, (off_t)(tty * sizeof(struct utmp)), SEEK_SET); /* * Prevent luser from zero'ing out ut_host. * If the new ut_line is empty but the old one is not * and ut_line and ut_name match, preserve the old ut_line. */ if (atomicio(read, fd, &old_ut, sizeof(old_ut)) == sizeof(old_ut) && (ut->ut_host[0] == '\0') && (old_ut.ut_host[0] != '\0') && (strncmp(old_ut.ut_line, ut->ut_line, sizeof(ut->ut_line)) == 0) && (strncmp(old_ut.ut_name, ut->ut_name, sizeof(ut->ut_name)) == 0)) { (void)memcpy(ut->ut_host, old_ut.ut_host, sizeof(ut->ut_host)); } (void)lseek(fd, (off_t)(tty * sizeof(struct utmp)), SEEK_SET); if (atomicio(write, fd, ut, sizeof(*ut)) != sizeof(*ut)) dropbear_log(LOG_WARNING, "utmp_write_direct: error writing %s: %s", UTMP_FILE, strerror(errno)); (void)close(fd); return 1; } else { return 0; } #endif }
gboolean ck_get_max_num_consoles (guint *num) { int max_consoles; int res; gboolean ret; struct ttyent *t; ret = FALSE; max_consoles = 0; res = setttyent (); if (res == 0) { goto done; } while ((t = getttyent ()) != NULL) { if (t->ty_status & TTY_ON && strncmp (t->ty_name, "ttyE", 4) == 0) max_consoles++; } ret = TRUE; endttyent (); done: if (num != NULL) { *num = max_consoles; } return ret; }
struct ttyent * getttynam(const char *tty) { struct ttyent *t; if (strncmp(tty, "/dev/", 5) == 0) tty += 5; setttyent(); while ( (t = getttyent()) ) if (!strcmp(tty, t->ty_name)) break; endttyent(); return (t); }
int ttyslot(void) { struct ttyent *ttyp; int slot = 0, ispty = 0; char *p; int cnt; char *name; #ifndef __minix struct ptmget ptm; #endif setttyent(); for (cnt = 0; cnt < 3; ++cnt) { #ifndef __minix if (ioctl(cnt, TIOCPTSNAME, &ptm) != -1) { ispty = 1; name = ptm.sn; } else if ((name = ttyname(cnt)) != NULL) { #else if ((name = ttyname(cnt)) != NULL) { #endif ispty = 0; } else continue; if ((p = strstr(name, "/pts/")) != NULL) ++p; else if ((p = strrchr(name, '/')) != NULL) ++p; else p = name; for (slot = 1; (ttyp = getttyent()) != NULL; ++slot) if (!strcmp(ttyp->ty_name, p)) { endttyent(); return slot; } break; } endttyent(); if (ispty) { struct stat st; if (fstat(cnt, &st) == -1) return 0; return slot + (int)minor(st.st_rdev) + 1; } return 0; }
struct ttyent *getttyent(void) /* Read one entry from the ttytab file. */ { /* Open the file if not yet open. */ if (ttfd < 0 && setttyent() < 0) return nil; /* Look for a line with something on it. */ for (;;) { if (!getline()) return nil; /* EOF or corrupt. */ if ((entry.ty_name= scan_white(0)) == nil) continue; entry.ty_type= scan_white(0); entry.ty_getty= scan_quoted(); entry.ty_init= scan_quoted(); return &entry; } }
/* * Ttyflags sets the device-specific tty flags, based on the contents * of /etc/ttys. It can either set all of the ttys' flags, or set * the flags of the ttys specified on the command line. */ int main(int argc, char *argv[]) { int aflag, ch, rval; aflag = nflag = vflag = 0; while ((ch = getopt(argc, argv, "anv")) != -1) switch (ch) { case 'a': aflag = 1; break; case 'n': /* undocumented */ nflag = 1; break; case 'v': vflag = 1; break; case '?': default: usage(); } argc -= optind; argv += optind; if (aflag && argc != 0) usage(); rval = 0; if (setttyent() == 0) err(1, "setttyent"); if (aflag) rval = change_all(); else rval = change_ttys(argv); if (endttyent() == 0) warn("endttyent"); exit(rval); }
void login(struct utmp *ut) { struct ttyent *ty; int fd; int tty; setttyent(); for (tty = 1; (ty = getttyent()) != NULL; ++tty) if (strcmp(ty->ty_name, ut->ut_line) == 0) break; endttyent(); if (tty > 0 && (fd = open(_PATH_UTMP, O_WRONLY|O_CREAT, 0644)) >= 0) { (void)lseek(fd, (off_t)(tty * sizeof(struct utmp)), L_SET); (void)write(fd, ut, sizeof(struct utmp)); (void)close(fd); } if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) >= 0) { (void)write(fd, ut, sizeof(struct utmp)); (void)close(fd); } }
gboolean ck_get_max_num_consoles (guint *num) { int max_consoles; int res; gboolean ret; struct ttyent *t; ret = FALSE; max_consoles = 0; res = setttyent (); if (res == 0) { goto done; } while ((t = getttyent ()) != NULL) { if (t->ty_status & TTY_ON && strncmp (t->ty_name, "ttyC", 4) == 0) max_consoles++; } /* Increment one more so that all consoles are properly counted * this is arguable a bug in vt_add_watches(). */ max_consoles++; ret = TRUE; endttyent (); done: if (num != NULL) { *num = max_consoles; } return ret; }
int ttyslot() { struct ttyent *ttyp; int slot; int cnt; char *name; setttyent(); for (cnt = 0; cnt < 3; ++cnt) if ( (name = ttyname(cnt)) ) { if (strncmp(name, _PATH_DEV, sizeof _PATH_DEV - 1) != 0) break; name += sizeof _PATH_DEV - 1; for (slot = 1; (ttyp = getttyent()); ++slot) if (!strcmp(ttyp->ty_name, name)) { endttyent(); return(slot); } break; } endttyent(); return(0); }
struct ttyent * 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 (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); lbsize += MALLOCCHUNK; if ((p = realloc(line, lbsize)) == NULL) { endttyent(); return (NULL); } line = p; if (!fgets(&line[i], lbsize - i, tf)) return (NULL); } while (isspace((unsigned char)*p)) ++p; if (*p && *p != '#') break; } #define scmp(e) !strncmp(p, e, sizeof(e) - 1) && isspace((unsigned char)p[sizeof(e) - 1]) #define vcmp(e) !strncmp(p, e, sizeof(e) - 1) && p[sizeof(e) - 1] == '=' zapchar = 0; tty.ty_name = p; tty.ty_status = 0; tty.ty_window = NULL; tty.ty_group = _TTYS_NOGROUP; p = skip(p); if (!*(tty.ty_getty = p)) tty.ty_getty = tty.ty_type = NULL; else { p = skip(p); if (!*(tty.ty_type = p)) tty.ty_type = NULL; else { /* compatibility kludge: handle network/dialup specially */ if (scmp(_TTYS_DIALUP)) tty.ty_status |= TTY_DIALUP; else if (scmp(_TTYS_NETWORK)) tty.ty_status |= TTY_NETWORK; p = skip(p); } } for (; *p; p = skip(p)) { if (scmp(_TTYS_OFF)) tty.ty_status &= ~TTY_ON; else if (scmp(_TTYS_ON)) tty.ty_status |= TTY_ON; else if (scmp(_TTYS_SECURE)) tty.ty_status |= TTY_SECURE; else if (scmp(_TTYS_INSECURE)) tty.ty_status &= ~TTY_SECURE; else if (scmp(_TTYS_DIALUP)) tty.ty_status |= TTY_DIALUP; else if (scmp(_TTYS_NETWORK)) tty.ty_status |= TTY_NETWORK; else if (vcmp(_TTYS_WINDOW)) tty.ty_window = value(p); else if (vcmp(_TTYS_GROUP)) tty.ty_group = value(p); else break; } if (zapchar == '#' || *p == '#') while ((c = *++p) == ' ' || c == '\t') ; tty.ty_comment = p; if (*p == 0) tty.ty_comment = 0; if ( (p = index(p, '\n')) ) *p = '\0'; return (&tty); }
/* * Write a utmp entry direct to the file * This is a slightly modification of code in OpenBSD's login.c */ static int utmp_write_direct(struct logininfo *li, struct utmp *ut) { struct utmp old_ut; register int fd; int tty; /* FIXME: (ATL) ttyslot() needs local implementation */ #if defined(HAVE_GETTTYENT) struct ttyent *ty; tty=0; setttyent(); while (NULL != (ty = getttyent())) { tty++; if (!strncmp(ty->ty_name, ut->ut_line, sizeof(ut->ut_line))) break; } endttyent(); if (NULL == ty) { logit("%s: tty not found", __func__); return (0); } #else /* FIXME */ tty = ttyslot(); /* seems only to work for /dev/ttyp? style names */ #endif /* HAVE_GETTTYENT */ if (tty > 0 && (fd = open(UTMP_FILE, O_RDWR|O_CREAT, 0644)) >= 0) { off_t pos, ret; pos = (off_t)tty * sizeof(struct utmp); if ((ret = lseek(fd, pos, SEEK_SET)) == -1) { logit("%s: lseek: %s", __func__, strerror(errno)); return (0); } if (ret != pos) { logit("%s: Couldn't seek to tty %d slot in %s", __func__, tty, UTMP_FILE); return (0); } /* * Prevent luser from zero'ing out ut_host. * If the new ut_line is empty but the old one is not * and ut_line and ut_name match, preserve the old ut_line. */ if (atomicio(read, fd, &old_ut, sizeof(old_ut)) == sizeof(old_ut) && (ut->ut_host[0] == '\0') && (old_ut.ut_host[0] != '\0') && (strncmp(old_ut.ut_line, ut->ut_line, sizeof(ut->ut_line)) == 0) && (strncmp(old_ut.ut_name, ut->ut_name, sizeof(ut->ut_name)) == 0)) memcpy(ut->ut_host, old_ut.ut_host, sizeof(ut->ut_host)); if ((ret = lseek(fd, pos, SEEK_SET)) == -1) { logit("%s: lseek: %s", __func__, strerror(errno)); return (0); } if (ret != pos) { logit("%s: Couldn't seek to tty %d slot in %s", __func__, tty, UTMP_FILE); return (0); } if (atomicio(vwrite, fd, ut, sizeof(*ut)) != sizeof(*ut)) { logit("%s: error writing %s: %s", __func__, UTMP_FILE, strerror(errno)); } close(fd); return (1); } else { return (0); } }