Procházet zdrojové kódy

Convert paths to fullpath when enumerating in linux aos.
Required for the active cells toolchain in order to be able to pass full path names to the TCL shell.
Behavior of WinA2 and LinuxA2 in this respect is now consistent.

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7067 8c9fc860-2736-0410-a75d-ab315db34111

felixf před 8 roky
rodič
revize
fcff2d2237
2 změnil soubory, kde provedl 5 přidání a 1 odebrání
  1. 2 0
      source/Generic.Linux.I386.Unix.Mod
  2. 3 1
      source/Unix.UnixFiles.Mod

+ 2 - 0
source/Generic.Linux.I386.Unix.Mod

@@ -486,6 +486,7 @@ VAR
 	utime-		: PROCEDURE {C} ( name: ADDRESS;  tb: ADDRESS ): LONGINT;
 	access-		: PROCEDURE {C} ( name: ADDRESS;  mode: SET ): LONGINT;
 	select-		: PROCEDURE {C} ( width: LONGINT; rd, wr, ex: ADDRESS;  VAR timeout: Timeval ): LONGINT;
+	realpath-	: PROCEDURE {C} (file_name: ADDRESS; resolved_name: ADDRESS): ADDRESS;
 
 	chdir-			: PROCEDURE {C} ( name: ADDRESS ): LONGINT;
 	mkdir-		: PROCEDURE {C} ( name: ADDRESS;  mode: SET ): LONGINT;
@@ -1176,6 +1177,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		Dlsym( libc, "open",		ADDRESSOF( open ) );
 		Dlsym( libc, "close",	ADDRESSOF( close ) );
 		Dlsym( libc, "lseek",	ADDRESSOF( lseek ) );
+		Dlsym( libc, "realpath",	ADDRESSOF( realpath ) );
 		Dlsym( libc, "fsync",	ADDRESSOF( fsync ) );
 		Dlsym( libc, "ioctl",	ADDRESSOF( ioctl ) );
 		Dlsym( libc, "unlink",	ADDRESSOF( unlink ) );

+ 3 - 1
source/Unix.UnixFiles.Mod

@@ -418,7 +418,7 @@ TYPE
 				VAR 
 					path, filemask: Filename;
 					isPath: BOOLEAN;
-					i, j: INTEGER;  dirName, fileName, fullName: Filename;
+					i, j: INTEGER;  dirName, fileName, fullName, xName: Filename;
 					checkSet: NameSet;  ent: Unix.Dirent; 
 					
 					PROCEDURE GetEntryName;
@@ -454,6 +454,8 @@ TYPE
 											r := Unix.access( ADDRESSOF( fullName ), Unix.W_OK ); 
 											IF r < 0 THEN  flags := {Files.ReadOnly}  END
 										END;
+										r := Unix.realpath(ADDRESSOF(fullName), ADDRESSOF(xName));
+										IF (r # 0) THEN COPY(xName, fullName) END;
 										enum.PutEntry( fullName, flags, time, date, stat.size );
 									END
 								END;