xref: /aosp_15_r20/external/toybox/toys/other/chcon.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker /* chcon.c - Change file security context
2*cf5a6c84SAndroid Build Coastguard Worker  *
3*cf5a6c84SAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
4*cf5a6c84SAndroid Build Coastguard Worker 
5*cf5a6c84SAndroid Build Coastguard Worker USE_CHCON(NEWTOY(chcon, "<2hvR", TOYFLAG_USR|TOYFLAG_BIN))
6*cf5a6c84SAndroid Build Coastguard Worker 
7*cf5a6c84SAndroid Build Coastguard Worker config CHCON
8*cf5a6c84SAndroid Build Coastguard Worker   bool "chcon"
9*cf5a6c84SAndroid Build Coastguard Worker   depends on TOYBOX_SELINUX
10*cf5a6c84SAndroid Build Coastguard Worker   default y
11*cf5a6c84SAndroid Build Coastguard Worker   help
12*cf5a6c84SAndroid Build Coastguard Worker     usage: chcon [-hRv] CONTEXT FILE...
13*cf5a6c84SAndroid Build Coastguard Worker 
14*cf5a6c84SAndroid Build Coastguard Worker     Change the SELinux security context of listed file[s].
15*cf5a6c84SAndroid Build Coastguard Worker 
16*cf5a6c84SAndroid Build Coastguard Worker     -h	Change symlinks instead of what they point to
17*cf5a6c84SAndroid Build Coastguard Worker     -R	Recurse into subdirectories
18*cf5a6c84SAndroid Build Coastguard Worker     -v	Verbose
19*cf5a6c84SAndroid Build Coastguard Worker */
20*cf5a6c84SAndroid Build Coastguard Worker 
21*cf5a6c84SAndroid Build Coastguard Worker #define FOR_chcon
22*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
23*cf5a6c84SAndroid Build Coastguard Worker 
do_chcon(struct dirtree * try)24*cf5a6c84SAndroid Build Coastguard Worker static int do_chcon(struct dirtree *try)
25*cf5a6c84SAndroid Build Coastguard Worker {
26*cf5a6c84SAndroid Build Coastguard Worker   char *path, *con = *toys.optargs;
27*cf5a6c84SAndroid Build Coastguard Worker 
28*cf5a6c84SAndroid Build Coastguard Worker   if (!dirtree_notdotdot(try)) return 0;
29*cf5a6c84SAndroid Build Coastguard Worker 
30*cf5a6c84SAndroid Build Coastguard Worker   path = dirtree_path(try, 0);
31*cf5a6c84SAndroid Build Coastguard Worker   if (FLAG(v)) printf("chcon '%s' to %s\n", path, con);
32*cf5a6c84SAndroid Build Coastguard Worker   if (-1 == (FLAG(h) ? lsetfilecon : setfilecon)(path, con))
33*cf5a6c84SAndroid Build Coastguard Worker     perror_msg("'%s' to %s", path, con);
34*cf5a6c84SAndroid Build Coastguard Worker   free(path);
35*cf5a6c84SAndroid Build Coastguard Worker 
36*cf5a6c84SAndroid Build Coastguard Worker   return FLAG(R)*DIRTREE_RECURSE;
37*cf5a6c84SAndroid Build Coastguard Worker }
38*cf5a6c84SAndroid Build Coastguard Worker 
chcon_main(void)39*cf5a6c84SAndroid Build Coastguard Worker void chcon_main(void)
40*cf5a6c84SAndroid Build Coastguard Worker {
41*cf5a6c84SAndroid Build Coastguard Worker   char **file;
42*cf5a6c84SAndroid Build Coastguard Worker 
43*cf5a6c84SAndroid Build Coastguard Worker   for (file = toys.optargs+1; *file; file++) dirtree_read(*file, do_chcon);
44*cf5a6c84SAndroid Build Coastguard Worker }
45