#include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <private/android_filesystem_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; }