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);
}
}
}
}
코드가 깔끔하진 않은 것 같아서 아쉬움이 남는다.. 추후 수정해보록 하겠다.
'C > Linux' 카테고리의 다른 글
[C] 2개의 파이프를 사용한 양방향 통신 프로그램 구현하기 (0) | 2023.01.03 |
---|---|
[C] alarm 시그널을 받으면 1초 간격으로 메시지 출력하는 프로그램 구현하기 (0) | 2023.01.03 |
[C] ctrl + c 로 종료되지 않는 프로그램 구현하기 (0) | 2023.01.03 |
[C] execve()를 사용하여 execlp() 구현하기 (0) | 2023.01.03 |
[C] copy_file() 구현하기 (0) | 2023.01.03 |