permconv

Simply convert between human-readable and numeric unix-permissions
Log | Files | Refs

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 }