瀏覽代碼

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 8 年之前
父節點
當前提交
fcff2d2237
共有 2 個文件被更改,包括 5 次插入1 次删除
  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;