C/Linux

[C] chmod a+rX [path] 구현하기

김호록님 2023. 1. 3. 19:36

chmod a+rX [path]의 기능

  • 모든 읽기 권한을 활성화 한다.
  • 디렉토리에는 모든 실행 권한을 활성화 한다.
  • 이미 실행 권한이 있는 파일에 대해 모든 실행 권한을 활성화 한다.

요구사항

  • chmod a+rX와 동일하게 동작하는 프로그램을 stat()과 chmod()를 이용하여 구현하라.
  • path에는 여러 파일의 이름이 연속으로 입력될 수 있다.
  • 처리할 파일의 이름을 커맨드 라인으로부터 입력받을 수 있어야 한다.
  • 입력 파일의 이름이 변경되어도 처리할 수 있어야 한다.

실행결과 예시

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(int argc, char **argv) {
  int return_stat;
  char *file_name;
  struct stat file_info;

  for (int i = 0; i < argc; i++) {
    //모든 읽기 권한 활성화
    mode_t file_mode;
    file_name = argv[i];
    if ((return_stat = stat(file_name, &file_info)) == -1) {
      perror("Error : ");
      exit(0);
    }
    file_mode = file_info.st_mode;

    //만약 이미 실행 권한이 있다면, 실행 권한 활성화 + 읽기 권한 활성화
    if (file_mode & S_IXUSR || file_mode & S_IXGRP || file_mode & S_IXOTH) {
      if(chmod(argv[i], S_IRUSR | S_IRGRP | S_IROTH | S_IXUSR | S_IXGRP | S_IXOTH) < 0) {
        perror("chmod execute error :");
        exit(0);
        }
      }
    //나머지 경우 읽기 권한만 활성화
    else if (chmod(argv[i], S_IRUSR | S_IRGRP | S_IROTH) < 0) {
      perror("chmod read error :");
      exit(0);
    }
    //디렉토리이면 모든 실행 권한 활성화 + 읽기 권한 활성화
    if (S_ISDIR(file_mode)) {
      if (chmod(argv[i], S_IRUSR | S_IRGRP | S_IROTH | S_IXUSR | S_IXGRP | S_IXOTH) < 0) {
        perror("chmod dir error :");
        exit(0);
      }
    }
  }
}

코드가 깔끔하진 않은 것 같아서 아쉬움이 남는다.. 추후 수정해보록 하겠다.