Everything in Linux is a file and Linux being a multi user operating system, all the files needs to be protected between shared access of different users. Linux File Permissions is the once such thing which decides who can read the file, who can write to file and who can execute the file. This C program just checks which are the permissions available for the file or binary available on the system.
One way to check the file permissions is using “access” system call.
int access(const char *pathname, int mode);
This system call requires a test mode to be passed, R_OK, W_OK, and X_OK test whether the file exists and grants read, write, and execute permissions, respectively.
$ vim check_file_permissions.c
#include <stdio.h> // for printf
#include <stdlib.h> // for malloc
#include <string.h> // for strcpy
#include <unistd.h> // for access
int main(int argc, char **argv) {
int result;
//allocate memory of 512 bytes
char *filename = (char *)malloc(512);
if (argc < 2) {
strcpy(filename, "/usr/bin/adb");
} else {
strcpy(filename, argv[1]);
}
result = access (filename, R_OK); // R_OK for readable
if ( result == 0 ) {
printf("%s is readable\n",filename);
} else {
printf("%s is not readable\n",filename);
}
result = access (filename, W_OK); // W_OK for writeable
if ( result == 0 ) {
printf("%s is Writeable\n",filename);
} else {
printf("%s is not Writeable\n",filename);
}
result = access (filename, X_OK); // X_OK for executable
if ( result == 0 ) {
printf("%s is executable\n",filename);
} else {
printf("%s is not executable\n",filename);
}
//free allocated memory
free(filename);
return 0;
}
$ gcc -o check_file_permissions check_file_permissions.c
$ ./check_file_permissions check_file_permissions.c
check_file_permissions.c is readable
check_file_permissions.c is Writeable
check_file_permissions.c is not executable
Now, lets check the file permissions of a binary file adb which is already installed as part of android utilities.
$ ./check_file_permissions
/usr/bin/adb is readable
/usr/bin/adb is not Writeable
/usr/bin/adb is executable
char *filename = (char *)malloc(512);
Why 512? If you are going to use a fixed size, just create a fixed size array otherwise using malloc is pointless.
The most memory efficient way is to use strlen to get length of the filename, add ONE for the terminating NULL character, then use malloc with size of char multiplied by length + 1.