am 45f3ed05: am 105f6b66: Merge "restorecon_recursive("/sys") speed boot time"

* commit '45f3ed05c98d4e9cfc7b70a8c5f3af510afea8ee':
  restorecon_recursive("/sys") speed boot time
This commit is contained in:
Nick Kralevich 2014-01-14 00:30:26 +00:00 committed by Android Git Automerger
commit d896c19512

View file

@ -524,31 +524,50 @@ int make_dir(const char *path, mode_t mode)
return rc; return rc;
} }
int restorecon(const char *pathname) static int restorecon_sb(const char *pathname, const struct stat *sb)
{ {
char *secontext = NULL; char *secontext = NULL;
struct stat sb; char *oldsecontext = NULL;
int i; int i;
if (selabel_lookup(sehandle, &secontext, pathname, sb->st_mode) < 0)
return -errno;
if (lgetfilecon(pathname, &oldsecontext) < 0) {
freecon(secontext);
return -errno;
}
if (strcmp(oldsecontext, secontext) != 0) {
if (lsetfilecon(pathname, secontext) < 0) {
freecon(oldsecontext);
freecon(secontext);
return -errno;
}
}
freecon(oldsecontext);
freecon(secontext);
return 0;
}
int restorecon(const char *pathname)
{
struct stat sb;
if (is_selinux_enabled() <= 0 || !sehandle) if (is_selinux_enabled() <= 0 || !sehandle)
return 0; return 0;
if (lstat(pathname, &sb) < 0) if (lstat(pathname, &sb) < 0)
return -errno; return -errno;
if (selabel_lookup(sehandle, &secontext, pathname, sb.st_mode) < 0)
return -errno; return restorecon_sb(pathname, &sb);
if (lsetfilecon(pathname, secontext) < 0) {
freecon(secontext);
return -errno;
}
freecon(secontext);
return 0;
} }
static int nftw_restorecon(const char* filename, const struct stat* statptr, static int nftw_restorecon(const char* filename, const struct stat* statptr,
int fileflags, struct FTW* pftw) int fileflags __attribute__((unused)),
struct FTW* pftw __attribute__((unused)))
{ {
restorecon(filename); restorecon_sb(filename, statptr);
return 0; return 0;
} }
@ -556,5 +575,9 @@ int restorecon_recursive(const char* pathname)
{ {
int fd_limit = 20; int fd_limit = 20;
int flags = FTW_DEPTH | FTW_MOUNT | FTW_PHYS; int flags = FTW_DEPTH | FTW_MOUNT | FTW_PHYS;
if (is_selinux_enabled() <= 0 || !sehandle)
return 0;
return nftw(pathname, nftw_restorecon, fd_limit, flags); return nftw(pathname, nftw_restorecon, fd_limit, flags);
} }