unix/permconv

permconv.c in master
Repositories | Summary | Log | Files

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}