xref: /csrg-svn/lib/libc/gen/ttyname.c (revision 6715)
1*6715Smckusick /* @(#)ttyname.c	4.3 (Berkeley) 05/07/82 */
21994Swnj /*
31994Swnj  * ttyname(f): return "/dev/ttyXX" which the the name of the
41994Swnj  * tty belonging to file f.
51994Swnj  *  NULL if it is not a tty
61994Swnj  */
71994Swnj 
81994Swnj #define	NULL	0
96371Smckusick #include <sys/param.h>
10*6715Smckusick #include <sys/dir.h>
111994Swnj #include <sys/stat.h>
121994Swnj 
131994Swnj static	char	dev[]	= "/dev/";
141994Swnj char	*strcpy();
151994Swnj char	*strcat();
161994Swnj 
171994Swnj char *
181994Swnj ttyname(f)
191994Swnj {
201994Swnj 	struct stat fsb;
211994Swnj 	struct stat tsb;
226371Smckusick 	register struct direct *db;
236371Smckusick 	register DIR *df;
241994Swnj 	static char rbuf[32];
251994Swnj 
261994Swnj 	if (isatty(f)==0)
271994Swnj 		return(NULL);
281994Swnj 	if (fstat(f, &fsb) < 0)
291994Swnj 		return(NULL);
301994Swnj 	if ((fsb.st_mode&S_IFMT) != S_IFCHR)
311994Swnj 		return(NULL);
326371Smckusick 	if ((df = opendir(dev)) == NULL)
331994Swnj 		return(NULL);
346371Smckusick 	while ((db = readdir(df)) != NULL) {
356371Smckusick 		if (db->d_ino != fsb.st_ino)
361994Swnj 			continue;
371994Swnj 		strcpy(rbuf, dev);
386371Smckusick 		strcat(rbuf, db->d_name);
391994Swnj 		if (stat(rbuf, &tsb) < 0)
401994Swnj 			continue;
416371Smckusick 		if (tsb.st_dev == fsb.st_dev && tsb.st_ino == fsb.st_ino) {
426371Smckusick 			closedir(df);
431994Swnj 			return(rbuf);
441994Swnj 		}
451994Swnj 	}
466371Smckusick 	closedir(df);
471994Swnj 	return(NULL);
481994Swnj }
49