lstat에서 일반파일을 디렉토리로 취급합니다.
글쓴이: shutup / 작성시간: 토, 2014/08/16 - 9:10오후
아래 코드패드 링크에 첨부된 코드는 이해를 돕기위해 첨부했습니다.
문제가 되는 부분은 lrank_nodeCheck함수에 있는 106라인 lstat입니다.
http://codepad.org/m25p0MBh
보니, 자꾸 link나 regular 파일들을 directory로 잘못 인식하는것 같습니다.
우분투 14.03과 Cygwin에서 테스트해봤는데 둘이 똑같습니다.
gdb로 들여다보니 lstat이 실행된 뒤 st_mode가 일반 파일임에도 디렉토리의 값을 가집니다.
선행 코드에서 문제가 있는것 같은데, 감을 못잡겠네요.
lstat대신 stat함수를 써도 결과는 똑같고, 저는 링크의 원본의 내용을 보고싶지는 않습니다. 그래서 stat함수는 쓰지 않으려 합니다.
이 프로그램의 목적이 루트 아래의 모든 파일의 사이즈를 재서 파일로 출력해주는거라서요.
보니 https://kldp.org/node/60668 이 질문에서도 이 문제를 언급한것 같은데, 그분은 해결하셨을런지 모르겠네요.
어디서 문제가 되서 lstat에 잘못 전달된건지 알려주세요.
Forums:
stat() 이건 lstat() 이건, return
stat() 이건 lstat() 이건, return 값을 체크하세요.
작성자입니다
모바일이라 익명으로 글씁니다
리턴값이라.. 글쎄요.일단은 하는게 낫겠네요
invalid file path
그냥 d_name 쓰지 마시고 fullname + d_name 쓰셔야 할 듯..
작성자입니다.
아뇨 그런 문제는 아니에요.무엇보다 fullname은 현재 노드가 디렉토리에 해당될때만 만들어지기 때문에, 일반파일인데 fullname이 만들어지는것부터가 문제가 있죠.
음 ..
위에 두 분 말씀 좀 더 깊이 생각해 보시는게 좋을것 같군요.
struct dirent 의 d_name 에는 basename 만 들어가 있습니다.
lstat 에 entry->d_name 만 던지면 CWD 에서 d_name 을 찾을 거고 없으면 에러가 나겠죠.
lstat 이 에러를 리턴했다면 st_mode 에 무슨 값이 있던지 아무런 의미가 없습니다.
아마도 아무런 값을 세팅하지 않고 리턴할 테니.. 이전에 썼던 값들이 고스란히 남아 있을겁니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
댓글 달기