1#include <unistd.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <errno.h>
5#include <selinux/selinux.h>
6#include <selinux/android.h>
7
8static const char *progname;
9
10static void usage(void)
11{
12    fprintf(stderr, "usage:  %s [-DFnrRv] pathname...\n", progname);
13    exit(1);
14}
15
16int restorecon_main(int argc, char **argv)
17{
18    int ch, i, rc;
19    unsigned int flags = 0;
20
21    progname = argv[0];
22
23    do {
24        ch = getopt(argc, argv, "DFnrRv");
25        if (ch == EOF)
26            break;
27        switch (ch) {
28        case 'D':
29            flags |= SELINUX_ANDROID_RESTORECON_DATADATA;
30            break;
31        case 'F':
32            flags |= SELINUX_ANDROID_RESTORECON_FORCE;
33            break;
34        case 'n':
35            flags |= SELINUX_ANDROID_RESTORECON_NOCHANGE;
36            break;
37        case 'r':
38        case 'R':
39            flags |= SELINUX_ANDROID_RESTORECON_RECURSE;
40            break;
41        case 'v':
42            flags |= SELINUX_ANDROID_RESTORECON_VERBOSE;
43            break;
44        default:
45            usage();
46        }
47    } while (1);
48
49    argc -= optind;
50    argv += optind;
51    if (!argc)
52        usage();
53
54    for (i = 0; i < argc; i++) {
55        rc = selinux_android_restorecon(argv[i], flags);
56        if (rc < 0)
57            fprintf(stderr, "Could not restorecon %s:  %s\n", argv[i],
58                    strerror(errno));
59    }
60
61    return 0;
62}
63