permconv.c (1184B)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 void from_oct(int permission, char *result) { 6 sprintf(result, "%c%c%c%c%c%c%c%c%c", (permission & 0400) ? 'r' : '-', 7 (permission & 0200) ? 'w' : '-', (permission & 0100) ? 'x' : '-', 8 (permission & 0040) ? 'r' : '-', (permission & 0020) ? 'w' : '-', 9 (permission & 0010) ? 'x' : '-', (permission & 0004) ? 'r' : '-', 10 (permission & 0002) ? 'w' : '-', (permission & 0001) ? 'x' : '-'); 11 } 12 13 int to_oct(const char *permission) { 14 int result = 0; 15 for (int i = 0; i < 9; i++) { 16 if (permission[i] != '-') { 17 result |= 1 << (8 - i); 18 } 19 } 20 return result; 21 } 22 23 int main(int argc, char *argv[]) { 24 if (argc != 2) { 25 printf("Usage: %s <permission>\n", argv[0]); 26 return EXIT_FAILURE; 27 } 28 29 char *permission = argv[1]; 30 int numericPermission; 31 32 // Check if input is numeric or symbolic 33 if (permission[0] >= '0' && permission[0] <= '7') { 34 // Numeric input 35 numericPermission = strtol(permission, NULL, 8); 36 from_oct(numericPermission, permission); 37 printf("%s\n", permission); 38 } else { 39 // Symbolic input 40 numericPermission = to_oct(permission); 41 printf("%o\n", numericPermission); 42 } 43 44 return EXIT_SUCCESS; 45 }