فهرست منبع

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;