2 * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
5 /* Solaris includes. */
14 #define IVCONST(s, c) newCONSTSUB(s, #c, newSViv((int)c));
15 #define POFF (sizeof ("PRIV_") - 1)
17 #define RETPRIVSET(set) \
18 ST(0) = sv_newmortal(); \
19 sv_setref_pv(ST(0), "Sun::Solaris::Privilege::PrivsetPtr", \
21 SvREADONLY_on(SvRV(ST(0)))
25 typedef priv_set_t Sun__Solaris__Privilege__Privset;
28 dupset(const priv_set_t *s)
30 priv_set_t *new = priv_allocset();
39 * Automatically derive the #define constant from the constant value.
40 * This is the uppercase value of the constant with "PRIV_" prepended.
41 * The (name, value) pair computed in that way is stored twice:
42 * once as constant subroutine in the module's hash table.
43 * once as (key, value) in a hash table.
47 PRIVconst(HV *sym, HV *var, const char *name)
53 len = snprintf(upname, sizeof (upname), "PRIV_%s", name);
54 if (len >= sizeof (upname))
57 for (i = POFF; i < len; i++)
58 upname[i] = toupper(upname[i]);
59 newCONSTSUB(sym, upname, newSVpv(name, len - POFF));
60 hv_store(var, upname, len, newSVpv(name, len - POFF), 0);
64 * The XS code exported to perl is below here. Note that the XS preprocessor
65 * has its own commenting syntax, so all comments from this point on are in
68 * Inside perl, privilege sets are represented as expanded strings;
69 * privileges and privilege sets are only known by name.
72 MODULE = Sun::Solaris::Privilege PACKAGE = Sun::Solaris::Privilege
76 # Define any constants that need to be exported. By doing it this way we can
77 # avoid the overhead of using the DynaLoader package, and in addition constants
78 # defined using this mechanism are eligible for inlining by the perl
79 # interpreter at compile time.
89 stash = gv_stashpv("Sun::Solaris::Privilege", TRUE);
94 IVCONST(stash, PRIV_STR_PORT);
95 IVCONST(stash, PRIV_STR_LIT);
96 IVCONST(stash, PRIV_STR_SHORT);
97 IVCONST(stash, PRIV_ALLSETS);
98 IVCONST(stash, PRIV_DEBUG);
99 IVCONST(stash, PRIV_AWARE);
100 IVCONST(stash, PRIV_ON);
101 IVCONST(stash, PRIV_OFF);
102 IVCONST(stash, PRIV_SET);
105 * %PRIVILEGES hash and the privilege constants
107 privs = perl_get_hv("Sun::Solaris::Privilege::PRIVILEGES", TRUE);
108 for (i = 0; (p = priv_getbynum(i++)) != NULL; )
109 PRIVconst(stash, privs, p);
112 * %PRIVSETS hash and the privset constants
114 privsets = perl_get_hv("Sun::Solaris::Privilege::PRIVSETS", TRUE);
115 for (i = 0; (p = priv_getsetbynum(i++)) != NULL; )
116 PRIVconst(stash, privsets, p);
120 Sun::Solaris::Privilege::Privset *
124 RETVAL = priv_allocset();
125 if (getppriv(which, RETVAL) != 0) {
126 priv_freeset(RETVAL);
133 setppriv(op, which, set)
136 Sun::Solaris::Privilege::Privset *set;
138 Sun::Solaris::Privilege::Privset *
141 RETVAL = priv_allocset();
142 if (RETVAL == NULL) {
145 priv_emptyset(RETVAL);
148 Sun::Solaris::Privilege::Privset *
151 RETVAL = priv_allocset();
152 if (RETVAL == NULL) {
155 priv_fillset(RETVAL);
160 Sun::Solaris::Privilege::Privset *set;
164 Sun::Solaris::Privilege::Privset *set;
167 priv_isequalset(set1, set2)
168 Sun::Solaris::Privilege::Privset *set1;
169 Sun::Solaris::Privilege::Privset *set2;
172 priv_issubset(set1, set2)
173 Sun::Solaris::Privilege::Privset *set1;
174 Sun::Solaris::Privilege::Privset *set2;
177 priv_ismember(set, priv)
178 Sun::Solaris::Privilege::Privset *set;
185 Sun::Solaris::Privilege::Privset *
186 priv_intersect(set1, set2)
187 Sun::Solaris::Privilege::Privset *set1;
188 Sun::Solaris::Privilege::Privset *set2;
190 RETVAL = dupset(set2);
191 if (RETVAL == NULL) {
194 priv_intersect(set1, RETVAL);
197 Sun::Solaris::Privilege::Privset *
198 priv_union(set1, set2)
199 Sun::Solaris::Privilege::Privset *set1;
200 Sun::Solaris::Privilege::Privset *set2;
202 RETVAL = dupset(set2);
203 if (RETVAL == NULL) {
206 priv_union(set1, RETVAL);
209 Sun::Solaris::Privilege::Privset *
211 Sun::Solaris::Privilege::Privset *set1;
213 RETVAL = dupset(set1);
214 if (RETVAL == NULL) {
217 priv_inverse(RETVAL);
222 priv_addset(set, priv)
223 Sun::Solaris::Privilege::Privset *set;
226 Sun::Solaris::Privilege::Privset *
228 Sun::Solaris::Privilege::Privset *set1;
230 RETVAL = dupset(set1);
231 if (RETVAL == NULL) {
238 priv_delset(set, priv)
239 Sun::Solaris::Privilege::Privset *set;
251 priv_set_to_str(s, c, f)
252 Sun::Solaris::Privilege::Privset *s;
258 Sun::Solaris::Privilege::Privset *
259 priv_str_to_set(buf, sep);
263 RETVAL = priv_str_to_set(buf, sep, NULL);
264 if (RETVAL == NULL) {
284 MODULE = Sun::Solaris::Privilege PACKAGE = Sun::Solaris::Privilege::PrivsetPtr PREFIX = Privilege_
287 Privilege_DESTROY(ps)
288 Sun::Solaris::Privilege::Privset *ps;