#include #include #include #include #include #include #include static void help_message(void) { printf( "chwrite [-h|--help]\n" "chwrite +|+w|-|-w FILE...\n" "\n" "Change write permissions for file(s)\n" ); } int main(int argc, char *argv[]) { int i = 0, f = 0, result = 0; struct stat fs = { 0, }; char operation; if (argc <= 1) { help_message(); return 0; } for (i = 1; i < argc; ++i) { if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) { help_message(); return 0; } } if (!strcmp(argv[1], "+") || !strcmp(argv[1], "+w")) { operation = '+'; } else if (!strcmp(argv[1], "-") || !strcmp(argv[1], "-w")) { operation = '-'; } else { printf("Invalid argument '%s'!\n", argv[1]); help_message(); return 1; } if (argc == 2) { printf("Not enough arguments!\n"); help_message(); return 2; } for (i = 2; i < argc; ++i) { f = open(argv[i], 0); if (f == -1) return errno; result = fstat(f, &fs); if (result == -1) return errno; if (operation == '+') fs.st_mode |= S_IWUSR; else fs.st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH); result = fchmod(f, fs.st_mode); if (result == -1) return errno; } return result; }