]> git.cworth.org Git - tar/blob - gnu/priv-set.c
e9f8fb24f3993b484c11a682c2356be917167012
[tar] / gnu / priv-set.c
1 /* -*- buffer-read-only: t -*- vi: set ro: */
2 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
3 /* Query, remove, or restore a Solaris privilege.
4
5    Copyright (C) 2009, 2010 Free Software Foundation, Inc.
6
7    This program is free software: you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
20    Written by David Bartley.  */
21
22 #include <config.h>
23 #include "priv-set.h"
24
25 #if HAVE_GETPPRIV
26
27 # include <errno.h>
28 # include <stdbool.h>
29 # include <priv.h>
30
31 /* Holds a (cached) copy of the effective set.  */
32 static priv_set_t *eff_set;
33
34 /* Holds a set of privileges that we have removed.  */
35 static priv_set_t *rem_set;
36
37 static bool initialized;
38
39 static int
40 priv_set_initialize (void)
41 {
42   if (! initialized)
43     {
44       eff_set = priv_allocset ();
45       if (!eff_set)
46         {
47           return -1;
48         }
49       rem_set = priv_allocset ();
50       if (!rem_set)
51         {
52           priv_freeset (eff_set);
53           return -1;
54         }
55       if (getppriv (PRIV_EFFECTIVE, eff_set) != 0)
56         {
57           priv_freeset (eff_set);
58           priv_freeset (rem_set);
59           return -1;
60         }
61       priv_emptyset (rem_set);
62       initialized = true;
63     }
64
65   return 0;
66 }
67
68
69 /* Check if priv is in the effective set.
70    Returns 1 if priv is a member and 0 if not.
71    Returns -1 on error with errno set appropriately.  */
72 int
73 priv_set_ismember (const char *priv)
74 {
75   if (! initialized && priv_set_initialize () != 0)
76     return -1;
77
78   return priv_ismember (eff_set, priv);
79 }
80
81
82 /* Try to remove priv from the effective set.
83    Returns 0 if priv was removed from or was not present in the effective set.
84    Returns -1 on error with errno set appropriately.  */
85 int
86 priv_set_remove (const char *priv)
87 {
88   if (! initialized && priv_set_initialize () != 0)
89     return -1;
90
91   if (priv_ismember (eff_set, priv))
92     {
93       /* priv_addset/priv_delset can only fail if priv is invalid, which is
94          checked above by the priv_ismember call.  */
95       priv_delset (eff_set, priv);
96       if (setppriv (PRIV_SET, PRIV_EFFECTIVE, eff_set) != 0)
97         {
98           priv_addset (eff_set, priv);
99           return -1;
100         }
101       priv_addset (rem_set, priv);
102     }
103   else
104     {
105       errno = EINVAL;
106       return -1;
107     }
108
109   return 0;
110 }
111
112
113 /* Try to restore priv to the effective set.
114    Returns 0 if priv was re-added to the effective set (after being prviously
115    removed by a call to priv_set_remove) or if priv was already in the
116    effective set.
117    Returns -1 on error with errno set appropriately.  */
118 int
119 priv_set_restore (const char *priv)
120 {
121   if (! initialized && priv_set_initialize () != 0)
122     return -1;
123
124   if (priv_ismember (rem_set, priv))
125     {
126       /* priv_addset/priv_delset can only fail if priv is invalid, which is
127          checked above by the priv_ismember call.  */
128       priv_addset (eff_set, priv);
129       if (setppriv (PRIV_SET, PRIV_EFFECTIVE, eff_set) != 0)
130         {
131           priv_delset (eff_set, priv);
132           return -1;
133         }
134       priv_delset (rem_set, priv);
135     }
136   else
137     {
138       errno = EINVAL;
139       return -1;
140     }
141
142   return 0;
143 }
144
145 #endif