1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- {
- 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) or (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;
|