|
@@ -0,0 +1,97 @@
|
|
|
+{
|
|
|
+ $Id$
|
|
|
+ This file is part of the Free Pascal run time library.
|
|
|
+ Copyright (c) 1999-2000 by Peter Vreman
|
|
|
+ member of the Free Pascal development team.
|
|
|
+
|
|
|
+ See the file COPYING.FPC, included in this distribution,
|
|
|
+ for details about the copyright.
|
|
|
+
|
|
|
+ A generic implementation of ttyname functionality.
|
|
|
+
|
|
|
+ This program is distributed in the hope that it will be useful,
|
|
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
+
|
|
|
+ **********************************************************************}
|
|
|
+
|
|
|
+function TTYName(Handle:cint):string;
|
|
|
+{
|
|
|
+ Return the name of the current tty described by handle f.
|
|
|
+ returns empty string in case of an error.
|
|
|
+}
|
|
|
+var
|
|
|
+ mydev : dev_t;
|
|
|
+ myino : ino_t;
|
|
|
+ st : stat;
|
|
|
+
|
|
|
+ function mysearch(n:string): boolean;
|
|
|
+ {searches recursively for the device in the directory given by n,
|
|
|
+ returns true if found and sets the name of the device in ttyname}
|
|
|
+ var dirstream : pdir;
|
|
|
+ d : pdirent;
|
|
|
+ name : string;
|
|
|
+ st : stat;
|
|
|
+ begin
|
|
|
+ dirstream:=fpopendir(n);
|
|
|
+ if (dirstream=nil) then
|
|
|
+ exit(false);
|
|
|
+ d:=fpReaddir(dirstream^);
|
|
|
+ while (d<>nil) do
|
|
|
+ begin
|
|
|
+ name:=n+'/'+strpas(@(d^.d_name));
|
|
|
+ // fpstat(name,st);
|
|
|
+ if fpstat(name,st)=0 then
|
|
|
+ begin
|
|
|
+ if (fpS_ISDIR(st.st_mode)) and { if it is a directory }
|
|
|
+ (strpas(@(d^.d_name))<>'.') and { but not ., .. and fd subdirs }
|
|
|
+ (strpas(@(d^.d_name))<>'..') and
|
|
|
+ (strpas(@(d^.d_name))<>'') and
|
|
|
+ (strpas(@(d^.d_name))<>'fd') then
|
|
|
+ begin {we found a directory, search inside it}
|
|
|
+ if mysearch(name) then
|
|
|
+ begin {the device is here}
|
|
|
+ fpclosedir(dirstream^); {then don't continue searching}
|
|
|
+ mysearch:=true;
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+ end
|
|
|
+ else if (ino_t(d^.d_fileno)=myino) and (st.st_dev=mydev) then
|
|
|
+ begin
|
|
|
+ fpclosedir(dirstream^);
|
|
|
+ ttyname:=name;
|
|
|
+ mysearch:=true;
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ d:=fpReaddir(dirstream^);
|
|
|
+ end;
|
|
|
+ fpclosedir(dirstream^);
|
|
|
+ mysearch:=false;
|
|
|
+ end;
|
|
|
+
|
|
|
+begin
|
|
|
+ TTYName:='';
|
|
|
+ if (fpfstat(handle,st)=-1) and (isatty (handle)<>-1) then
|
|
|
+ exit;
|
|
|
+ mydev:=st.st_dev;
|
|
|
+ myino:=st.st_ino;
|
|
|
+ mysearch('/dev');
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+function TTYName(var F:Text):string;
|
|
|
+{
|
|
|
+ Idem as previous, only now for text variables;
|
|
|
+}
|
|
|
+begin
|
|
|
+ TTYName:=TTYName(textrec(f).handle);
|
|
|
+end;
|
|
|
+
|
|
|
+{
|
|
|
+ $Log$
|
|
|
+ Revision 1.1 2003-11-19 17:13:00 marco
|
|
|
+ * new termio units
|
|
|
+
|
|
|
+
|
|
|
+}
|