|
|
researchv10 Norman
#include <sys/param.h>
#include <sys/user.h>
#include <sys/proc.h>
#include <sys/pioctl.h>
#include <sys/stat.h>
#include <utmp.h>
#define UADDR (0x80000000-(UPAGES*NBPG))
/*
* figure out the name of the tty
* on which i originally logged in
* by guess and by hack
*/
main()
{
char *tty;
char *mytty();
if ((tty = mytty()) == 0) {
printf("no login tty\n");
exit(1);
}
printf("%s\n", tty);
exit(0);
}
static char *
procname(pid)
int pid;
{
static char buf[20];
sprint(buf, "/proc/%d", pid);
return (buf);
}
#define MAXME 20
struct ttyi {
ino_t ino;
char name[14]; /* 8 + "/dev/" + \0 */
};
char *
mytty()
{
static struct ttyi mt[MAXME];
register int i;
register int e;
int pid;
int fd;
struct proc p;
struct user u;
char *myname;
char *getlogin();
if ((myname = getlogin()) == NULL)
return (NULL);
if ((e = mtinit(myname, mt)) == 0)
return (NULL);
for (pid = getpid();; close(fd), pid = p.p_ppid) {
if ((fd = open(procname(pid), 0)) < 0)
break;
if (ioctl(fd, PIOCGETPR, &p) < 0)
break;
if (p.p_ppid == pid)
break;
lseek(fd, UADDR, 0);
if (read(fd, (char *)&u, sizeof(u)) != sizeof(u))
break;
if (strncmp(u.u_logname, myname, sizeof(u.u_logname)) != 0)
break;
for (i = 0; i < e; i++)
if (mt[i].ino == u.u_ttyino) {
close(fd);
return (mt[i].name);
}
}
if (fd >= 0)
close(fd);
return (NULL);
}
static
mtinit(myname, mt)
char *myname;
register struct ttyi *mt;
{
struct utmp ut[20];
int fd;
register struct utmp *u, *e;
register int i;
register int n;
struct stat st;
if ((myname = getlogin()) == NULL)
return (0);
if ((fd = open("/etc/utmp", 0)) < 0)
return (0);
i = 0;
while ((n = read(fd, (char *)ut, sizeof(ut))) > 0) {
e = (struct utmp *)((char *)ut + n);
for (u = ut; u < e; u++) {
if (u->ut_name[0] == 0)
continue;
if (strncmp(u->ut_name, myname, sizeof(u->ut_name)) != 0)
continue;
sprintf(mt[i].name, "/dev/%.8s", u->ut_line);
if (stat(mt[i].name, &st) < 0)
continue;
mt[i].ino = st.st_ino;
if (++i >= MAXME) {
close(fd);
return (i);
}
}
}
close(fd);
return (i);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.