188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#include <stdlib.h>
288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#include <stdio.h>
388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#include <string.h>
488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#include <unistd.h>
588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#include <private/android_filesystem_config.h>
788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#define DO_DEBUG 1
988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
1088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#define ERROR(fmt,args...) \
1188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	do { \
1288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project		fprintf(stderr, "%s:%d: ERROR: " fmt,  \
1388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project		        __FILE__, __LINE__, ##args);    \
1488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	} while (0)
1588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
1688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#if DO_DEBUG
1788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#define DEBUG(fmt,args...) \
1888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	do { fprintf(stderr, "DEBUG: " fmt, ##args); } while(0)
1988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#else
2088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#define DEBUG(x...)               do {} while(0)
2188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#endif
2288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
2388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectvoid
2488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectprint_help(void)
2588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project{
2688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	fprintf(stderr, "fs_get_stats: retrieve the target file stats "
2788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	        "for the specified file\n");
2874a81e6633276d92337749a5ee9d921207814dd4Thierry Strudel	fprintf(stderr, "usage: fs_get_stats cur_perms is_dir filename targetout\n");
2988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	fprintf(stderr, "\tcur_perms - The current permissions of "
3088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	        "the file\n");
3188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	fprintf(stderr, "\tis_dir    - Is filename is a dir, 1. Otherwise, 0.\n");
3288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	fprintf(stderr, "\tfilename  - The filename to lookup\n");
3374a81e6633276d92337749a5ee9d921207814dd4Thierry Strudel	fprintf(stderr, "\ttargetout - The target out path to query device specific FS configs\n");
3488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	fprintf(stderr, "\n");
3588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project}
3688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
3788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectint
3888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectmain(int argc, const char *argv[])
3988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project{
4088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	char *endptr;
4188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	char is_dir = 0;
4288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	unsigned perms = 0;
4388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	unsigned uid = (unsigned)-1;
4488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	unsigned gid = (unsigned)-1;
4588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
4674a81e6633276d92337749a5ee9d921207814dd4Thierry Strudel	if (argc < 5) {
4788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project		ERROR("Invalid arguments\n");
4888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project		print_help();
4988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project		exit(-1);
5088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	}
5188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
5288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	perms = (unsigned)strtoul(argv[1], &endptr, 0);
5388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	if (!endptr || (endptr == argv[1]) || (*endptr != '\0')) {
5488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project		ERROR("current permissions must be a number. Got '%s'.\n", argv[1]);
5588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project		exit(-1);
5688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	}
5788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
5888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	if (!strcmp(argv[2], "1"))
5988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project		is_dir = 1;
6088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
61fa798096fd30873277965144ad72b21e2e1f5a82Nick Kralevich	uint64_t capabilities;
6274a81e6633276d92337749a5ee9d921207814dd4Thierry Strudel	fs_config(argv[3], is_dir, argv[4], &uid, &gid, &perms, &capabilities);
6388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	fprintf(stdout, "%d %d 0%o\n", uid, gid, perms);
6488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
6588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project	return 0;
6688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project}
67