permconv.c (1184B) download
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4
5void 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
13int 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
23int 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}