add a CVS snapshot, to thoroughly test on the Debian side
[alioth/jupp.git] / selinux.c
1 /* $MirOS: contrib/code/jupp/selinux.c,v 1.7 2014/06/26 18:15:17 tg Exp $ */
2
3 #include "config.h"
4 #if defined(HAVE_SELINUX_HDR) && defined(HAVE_SELINUX_FUN)
5 #define WITH_SELINUX
6 #else
7 #undef WITH_SELINUX
8 #endif
9
10 /*
11  * Example code to show how to copy the security context from one file to
12  * another.
13  */
14 #ifdef WITH_SELINUX
15 #include <selinux/selinux.h>
16 static int selinux_enabled = -1;
17 #include <err.h>
18 #include <errno.h>
19 #include <string.h>
20 #endif
21
22 int
23 copy_security_context(const char *from_file, const char *to_file)
24 {
25         int status = 0;
26 #ifdef WITH_SELINUX
27         security_context_t from_context;
28         security_context_t to_context;
29
30         if (selinux_enabled == -1)
31                 selinux_enabled = (is_selinux_enabled() > 0);
32
33         if (!selinux_enabled)
34                 return 0;
35
36         if (getfilecon(from_file, &from_context) < 0) {
37                 /*
38                  * If the filesystem doesn't support extended
39                  * attributes, the original had no special security
40                  * context and the target cannot have one either.
41                  */
42                 if (errno == EOPNOTSUPP)
43                         return 0;
44
45                 warn("Could not get security context for %s",
46                       from_file);
47                 return 1;
48         }
49
50         if (getfilecon(to_file, &to_context) < 0) {
51 #ifdef _
52                 MSG_PUTS(_("\nCould not get security context for "));
53                 msg_outtrans(to_file);
54                 msg_putchar('\n');
55 #else
56                 warn("Could not get security context for %s",
57                     to_file);
58 #endif
59                 freecon(from_context);
60                 return 1;
61         }
62
63         if (strcmp(from_context, to_context) != 0) {
64                 if (setfilecon(to_file, from_context) < 0) {
65                         warn(
66                               "Could not set security context for %s",
67                               to_file);
68                         status = 1;
69                 }
70         }
71
72         freecon(to_context);
73         freecon(from_context);
74 #endif
75         return status;
76 }
77
78 int
79 match_default_security_context(const char *from_file)
80 {
81 #ifdef WITH_SELINUX
82         security_context_t scontext;
83
84         if (selinux_enabled == -1)
85                 selinux_enabled = (is_selinux_enabled() > 0);
86
87         if (!selinux_enabled)
88                 return 0;
89
90         if (getfilecon(from_file, &scontext) < 0) {
91                 /*
92                  * If the filesystem doesn't support extended
93                  * attributes, the original had no special security
94                  * context and the target cannot have one either.
95                  */
96                 if (errno == EOPNOTSUPP)
97                         return 0;
98
99                 warn("Could not get security context for %s",
100                       from_file);
101                 return 1;
102         }
103
104         if (setfscreatecon(scontext) < 0) {
105                 warn(
106                       "Could not set default security context for %s",
107                       from_file);
108                 freecon(scontext);
109                 return 1;
110         }
111         freecon(scontext);
112 #endif
113         return 0;
114 }
115
116
117 int
118 reset_default_security_context(void)
119 {
120 #ifdef WITH_SELINUX
121         if (selinux_enabled == -1)
122                 selinux_enabled = (is_selinux_enabled() > 0);
123
124         if (!selinux_enabled)
125                 return 0;
126
127         if (setfscreatecon(0) < 0) {
128                 warn("Could not reset default security context");
129                 return 1;
130         }
131 #endif
132         return 0;
133 }
134
135
136 int
137 output_security_context(char *from_file)
138 {
139 #ifdef WITH_SELINUX
140         security_context_t scontext;
141
142         if (selinux_enabled == -1)
143                 selinux_enabled = (is_selinux_enabled() > 0);
144         if (!selinux_enabled)
145                 return 0;
146
147         if (getfilecon(from_file, &scontext) < 0) {
148                 /*
149                  * If the filesystem doesn't support extended
150                  * attributes, the original had no special security
151                  * context and the target cannot have one either.
152                  */
153                 if (errno == EOPNOTSUPP)
154                         return 0;
155
156                 warn("Could not get security context for %s",
157                       from_file);
158                 return 1;
159         }
160
161         fprintf(stderr, "%s Security Context %s", from_file, scontext);
162         freecon(scontext);
163 #endif
164         return 0;
165 }