소스 검색

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;