#include #include #include #include #include static void usage (void); mode_t calculate_permission (char *arg_str) { const char perms[4] = "rwx"; if (strlen (arg_str) != 3) { usage (); exit (EXIT_FAILURE); } mode_t permission = 0; for (size_t j = 0; j < 3; j++) { int perm = 1 << (2 - j); if (arg_str[j] == perms[j]) { permission |= perm; } else if (arg_str[j] != '-') { usage (); exit (EXIT_FAILURE); } } return permission; } int main (int argc, char **argv) { if (argc != 5) { usage (); return EXIT_FAILURE; } mode_t user = calculate_permission (argv[1]); mode_t group = calculate_permission (argv[2]); mode_t other = calculate_permission (argv[3]); mode_t permissions = (user << 6) | (group << 3) | other; if (chmod (argv[4], permissions) == -1) { perror ("Failed to chmod"); return EXIT_FAILURE; } return EXIT_SUCCESS; } static void usage (void) { printf ("chmod, changes permissions on a file\n"); printf ("usage: chmod USR GRP OTH FILE\n\n"); printf ("USR, GRP, and OTH must be of the rwx format,\n"); printf ("with - indicating a permission is not allwed.\n"); }