| #include <stdlib.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include <unistd.h> |
| |
| #include <private/android_filesystem_config.h> |
| #include <private/fs_config.h> |
| |
| #define DO_DEBUG 1 |
| |
| #define ERROR(fmt,args...) \ |
| do { \ |
| fprintf(stderr, "%s:%d: ERROR: " fmt, \ |
| __FILE__, __LINE__, ##args); \ |
| } while (0) |
| |
| #if DO_DEBUG |
| #define DEBUG(fmt,args...) \ |
| do { fprintf(stderr, "DEBUG: " fmt, ##args); } while(0) |
| #else |
| #define DEBUG(x...) do {} while(0) |
| #endif |
| |
| void |
| print_help(void) |
| { |
| fprintf(stderr, "fs_get_stats: retrieve the target file stats " |
| "for the specified file\n"); |
| fprintf(stderr, "usage: fs_get_stats cur_perms is_dir filename targetout\n"); |
| fprintf(stderr, "\tcur_perms - The current permissions of " |
| "the file\n"); |
| fprintf(stderr, "\tis_dir - Is filename is a dir, 1. Otherwise, 0.\n"); |
| fprintf(stderr, "\tfilename - The filename to lookup\n"); |
| fprintf(stderr, "\ttargetout - The target out path to query device specific FS configs\n"); |
| fprintf(stderr, "\n"); |
| } |
| |
| int |
| main(int argc, const char *argv[]) |
| { |
| char *endptr; |
| char is_dir = 0; |
| unsigned perms = 0; |
| unsigned uid = (unsigned)-1; |
| unsigned gid = (unsigned)-1; |
| |
| if (argc < 5) { |
| ERROR("Invalid arguments\n"); |
| print_help(); |
| exit(-1); |
| } |
| |
| perms = (unsigned)strtoul(argv[1], &endptr, 0); |
| if (!endptr || (endptr == argv[1]) || (*endptr != '\0')) { |
| ERROR("current permissions must be a number. Got '%s'.\n", argv[1]); |
| exit(-1); |
| } |
| |
| if (!strcmp(argv[2], "1")) |
| is_dir = 1; |
| |
| uint64_t capabilities; |
| fs_config(argv[3], is_dir, argv[4], &uid, &gid, &perms, &capabilities); |
| fprintf(stdout, "%d %d 0%o\n", uid, gid, perms); |
| |
| return 0; |
| } |