티스토리 뷰

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.cusage() 함수에 새로운 옵션 설명을 추가하였다.

 

 

 

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_errorsd의 멤버변수 opterr이다.

 

시험 기간이었던 탓에 진행상황이 더디지만, 다음 주부터 제대로 진행할 것이다.

728x90