티스토리 뷰
1. --help로 -b와 --except-files 출력
A. --help 출력 함수에 옵션 설명 추가
void usage (int status)
{
if (status != EXIT_SUCCESS)
emit_try_help ();
else
{
printf (_("Usage: %s [OPTION]... [FILE]...\n"), program_name);
fputs (_("\
Remove (unlink) the FILE(s).\n\
\n\
-f, --force ignore nonexistent files and arguments, never prompt\n\
-i prompt before every removal\n\
"), stdout);
...
fputs (_("\
-r, -R, --recursive remove directories and their contents recursively\n\
-d, --dir remove empty directories\n\
-v, --verbose explain what is being done\n\
"), stdout);
// mine
fputs (_("\
-b, --except-files ask for files to be excluded recursively and remove all files except them\n\
"), stdout);
...
usage()는 --help 명령어가 입력되면 각 옵션에 관한 설명이 출력되는 함수이다. 따라서 /home/kmi0817/coreutils/src/rm --help 입력 시 본 프로젝트에서 개발하는 짧은 옵션 -b와 긴 옵션 --except-files에 관한 설명이 출력되도록 /coreutils/src/rm.c의 usage() 함수에 새로운 옵션 설명을 추가하였다.
B. make 및 테스트
수정한 소스 파일 내용을 반영하고자 make로 컴파일을 진행하였다. 위 캡쳐 화면과 같이, 별다른 문제없이 컴파일이 완료되었다.
이후 /home/kmi0817/coreutils/src/rm --help를 입력하자 정상적으로 -b와 --except-files 옵션 설명이 출력되었다.
2. 진행상황 GitHub에 업로드
https://github.com/YejinHwang-D/rm-execpt-files/commit/7325c11683bf6145b41828159789048ce32ae8b2
주소는 rm.c 파일의 변경사항이 추적된 페이지를 보여준다.
3. 부적절한 옵션 -b 원인 파악
위 사진처럼 지난주 보고서의 [2-D make 및 테스트]에서는 /home/kmi0817/coreutils/src/rm -b test2.c 입력 시 -b가 부적절한(invalid) 옵션이라고 출력된다고 마무리되었다. 이를 해결하기 위해 아래와 같이 작업을 진행하였다.
while ((c = getopt_long (argc, argv, "dfirvIR", long_opts, NULL)) != -1)
위 while문은 터미널 창에서 입력된 옵션을 처리하는 rm.c 파일의 main() 함수에 존재한다. -b가 부적절한 옵션이라고 인식되는 원인은 getopt_long() 함수 처리 과정에서 문제가 발생했기 때문이라고 판단하였다.
char c = *d->__nextchar++;
const char *temp = strchr (optstring, c);
/* Increment 'optind' when we start to process its last character. */
if (*d->__nextchar == '\0')
++d->optind;
if (temp == NULL || c == ':' || c == ';') {
if (print_errors)
fprintf (stderr, _("%s: invalid option -- '%c'\n"), argv[0], c);
d->optopt = c;
return '?';
}
따라서 /coreutils/lib/option.c 파일에서 invalid option에 관해 찾아보았다. 그 결과 부적절한 옵션이라고 출력하는 위 코드를 찾았다.
int _getopt_internal_r (int argc, char **argv, const char *optstring,
const struct option *longopts, int *longind,
int long_only, struct _getopt_data *d, int posixly_correct)
{
int print_errors = d->opterr;
if문은 _getopt_internal_r() 함수 중 일부이다. 함수 헤더에서 알 수 있듯 d는 _getopt_data 구조체의 인스턴스이고, print_errors는 d의 멤버변수 opterr이다.
시험 기간이었던 탓에 진행상황이 더디지만, 다음 주부터 제대로 진행할 것이다.
'개발 > 오픈소스기여' 카테고리의 다른 글
[오픈소스기여] 중간보고서: rm 명령어 옵션, 디렉터리 삭제 시 삭제에서 제외할 파일 (0) | 2022.05.13 |
---|---|
[오픈소스기여] 4월 27일 - 5월 4일 활동 보고서 (0) | 2022.05.13 |
[오픈소스기여] 4월 13일 - 4월 19일 활동 보고서 (0) | 2022.05.13 |
[오픈소스기여] 4월 6일 - 4월 12일 활동 보고서 (0) | 2022.04.18 |
[오픈소스] GNU rm 명령어에 새로운 옵션 추가하기 (0) | 2022.04.18 |