2
0
Эх сурвалжийг харах

+ Very aggressive vcsa detection

git-svn-id: trunk@2349 -
daniel 19 жил өмнө
parent
commit
44ee4f6a39
1 өөрчлөгдсөн 39 нэмэгдсэн , 8 устгасан
  1. 39 8
      utils/grab_vcsa.pp

+ 39 - 8
utils/grab_vcsa.pp

@@ -1,5 +1,7 @@
 program grab_vcsa;
 
+{$I-}
+
 {
     This file is part of the Free Pascal run time library.
     Copyright (c) 2005 by Daniël Mantione
@@ -59,26 +61,55 @@ const   result_success=0;
         result_not_owner_error=5;
 
 var thistty:string;
-    vcs,vcsa:string;
+    tty,vcs,vcsa:string;
     ttystat:stat;
+    s:string[15];
+    c:char;
+    pid,parent,dummy:integer;
+    device:longint;
+    f:text;
+    found_vcsa:boolean;
 
 begin
   exitcode:=result_not_on_console;
   thistty:=ttyname(stdinputhandle);
   if isatty(stdinputhandle)=1 then
     begin
-      { running on a tty, find out whether locally or remotely }
-      if (length(thistty)>=9) and
-         (copy(thistty,1,8)='/dev/tty') and
-         (thistty[9] in ['0'..'9']) then
+      pid:=fpgetpid;
+      repeat
+        str(pid,s);
+        assign(f,'/proc/'+s+'/stat');
+        reset(f);
+        if ioresult<>0 then
+          break;
+        read(f,dummy);
+        read(f,c);
+        repeat
+          read(f,c);
+        until c=' ';
+        repeat
+          read(f,c);
+        until c=' ';
+        read(f,pid);
+        read(f,dummy);
+        read(f,dummy);
+        read(f,device);
+        close(f);
+        if device=0 then
+          break; {Not attached to a terminal, i.e. an xterm.}
+        found_vcsa:=device and $ffffff00=$00000400; {/dev/tty*}
+      until found_vcsa;
+      if found_vcsa then
         begin
           {We are running on the Linux console}
-          if fpstat(thistty,ttystat)<>0 then
+          str(device and $000000ff,s);
+          tty:='/dev/tty'+s;
+          if fpstat(tty,ttystat)<>0 then
             halt(result_stat_error);
           if ttystat.uid<>fpgetuid then
             halt(result_not_owner_error);
-          vcs:='/dev/vcs'+copy(thistty,9,255);
-          vcsa:='/dev/vcsa'+copy(thistty,9,255);
+          vcs:='/dev/vcs'+s;
+          vcsa:='/dev/vcsa'+s;
           
           {Change owner and group to that of /dev/tty??.}
           if fpchown(vcs,ttystat.uid,ttystat.gid)<>0 then