admin post

vsftpd는 로그파일을 기록할 때 한글 파일명을 물음표로 바꿔서 기록하는 특징(?)이 있습니다. 그래서 소스파일에서 해당 부분을 수정해서 컴파일하는 경우가 있는데, 우분투 7.10에서 apt로 소스파일을 받아서 컴파일하다보면 다음과 같은 컴파일 에러가 날 수 있습니다.(이 글은 vsftpd 2.0.5 기준으로 작성되었습니다)

sysdeputil.c:162: error: expected declaration specifiers or ‘...’ before ‘capset’
sysdeputil.c:162: error: expected declaration specifiers or ‘...’ before ‘header’
sysdeputil.c:162: error: expected declaration specifiers or ‘...’ before ‘data’

원인은 커널 2.6.18 버전부터 <linux/unistd.h>에서 syscall 매크로가 없어져서라고 합니다. 참고: http://www.bitshrine.org/gpp/vsftpd-2.0.5-syscall2.patch

위의 참고 내용에 따라 sysdeputil.c 파일을 수정합니다.

#include <linux/unistd.h>
부분을
#include <unistd.h>
로 바꿉니다.

_syscall2(int, capset, cap_user_header_t, header, const cap_user_data_t, data);
를 지우고 그 자리에
#define capset(head,data) syscall(__NR_capset,head,data)
를 넣습니다.

바꿔야 되거나 삭제할 부분은 sysdeputil.c파일 내에서 한 번씩 밖에 나오지 않습니다. 참고 내용을 보시면 수정할 부분의 위치를 좀 더 자세하게 알 수 있습니다.

ps. 참고한 파일을 다운받아서 patch 유틸리티로 손쉽게 수정할 내용을 적용할 수 있을 것 같은데, 잘 안 되네요. .patch 파일 형식을 좀 더 알아봐야겠습니다.

AND