|  | #include <unistd.h> | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <string.h> | 
|  | #include <errno.h> | 
|  | #include <selinux/selinux.h> | 
|  | #include <selinux/android.h> | 
|  |  | 
|  | static const char *progname; | 
|  |  | 
|  | static void usage(void) | 
|  | { | 
|  | fprintf(stderr, "usage:  %s [-DFnrRv] pathname...\n", progname); | 
|  | exit(1); | 
|  | } | 
|  |  | 
|  | int restorecon_main(int argc, char **argv) | 
|  | { | 
|  | int ch, i, rc; | 
|  | unsigned int flags = 0; | 
|  |  | 
|  | progname = argv[0]; | 
|  |  | 
|  | do { | 
|  | ch = getopt(argc, argv, "DFnrRv"); | 
|  | if (ch == EOF) | 
|  | break; | 
|  | switch (ch) { | 
|  | case 'D': | 
|  | flags |= SELINUX_ANDROID_RESTORECON_DATADATA; | 
|  | break; | 
|  | case 'F': | 
|  | flags |= SELINUX_ANDROID_RESTORECON_FORCE; | 
|  | break; | 
|  | case 'n': | 
|  | flags |= SELINUX_ANDROID_RESTORECON_NOCHANGE; | 
|  | break; | 
|  | case 'r': | 
|  | case 'R': | 
|  | flags |= SELINUX_ANDROID_RESTORECON_RECURSE; | 
|  | break; | 
|  | case 'v': | 
|  | flags |= SELINUX_ANDROID_RESTORECON_VERBOSE; | 
|  | break; | 
|  | default: | 
|  | usage(); | 
|  | } | 
|  | } while (1); | 
|  |  | 
|  | argc -= optind; | 
|  | argv += optind; | 
|  | if (!argc) | 
|  | usage(); | 
|  |  | 
|  | for (i = 0; i < argc; i++) { | 
|  | rc = selinux_android_restorecon(argv[i], flags); | 
|  | if (rc < 0) | 
|  | fprintf(stderr, "Could not restorecon %s:  %s\n", argv[i], | 
|  | strerror(errno)); | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } |