그래서 BC++ IDE의 Help를 활용하기로 했다.
Borland C++ IDE help |
_chmod()의 도움말 화면
_chmod의 help |
두번째 인자 func가 0이면 get, 1이면 set 기능을 하게 된다.
_chmod의 help (계속) |
세번째 인자인 DOS file-attribute는 다음과 같다.
file attribute |
DOS.H |
추가했던 디버그 메시지 |
즉, 변수의 이름은 UNIX 파일 시스템의 권한(permission)을 의미하는 듯이 보이지만, MS-DOS 파일 시스템에서는 권한이라는 것이 없기에 파일의 속성만을 나타내고 있는 것이다.
다시 한번 에러가 발생한 부분의 code를 살펴보자.
FILEIO.C |
하지만 이 소스만 보아도 문제의 소지가 있음을 알 수 있는 것이, 0666, 0777은 UNIX 파일 시스템에서만 유효한 권한(permission)이기 때문이다.
DOS의 파일 속성(읽기,쓰기,숨김,시스템,디렉토리)과 UNIX의 권한(소유자,그룹,관리자의 읽기,쓰기,실행 권리)를 서로 같은 것으로 간주해서 다루고 있다는 것이다.
그러면 정말로 이렇게 온동하여 처리한 것이 문제가 되는 것일까?
앞서 디버그 메시지에서는 perm이 0x20이었음을 확인했다.
8진수인 0777은 0x1FF, AND 연산을 한다해도 여전히 0x20이 되므로 결과적으로는 문제가 되지 않을 것으로 보인다.
그러면 뭘까?
mch_open()을 다시 확인해 보자.
mch_open()은 open()로 연결되어 있다.
mch_open() 매크로 |
open()의 help |
open()의 help (계속) |
mode의 help |
실제 값은 어떨까?
sys/stat.h의 mode |
open()은 기존의 UNIX 파일 시스템과의 호환성을 염두에 두고 MS-DOS에 포팅이 되었다고 한다면 _chmod()는 MS-DOS의 파일시스템에서만 사용할 수 있게 독자적으로 만들어진 것으로 보인다.
그렇다면, mch_open()의 세번째 인자의 값을 바꾸어주면 문제가 없을까?
하지만 정말 이 부분이 문제였다면, Windows에서 DOSBox를 구동하여 vim을 사용했을 때에도 동일한 문제가 발생해야 한다.
암튼 일단은 세번째 인자를 고쳐서 해 보기로 하자.
vim의 소스들을 살펴보니 대부분 세번째 인자로 0을 사용하고 있으며, 위의 stat.h에서도 일반적인 파일은 0을 사용한다고 되어 있기에 무조건 0을 사용하도록 수정해 보았다.
FILEIO.C |
make |
save |
댓글 없음:
댓글 쓰기