1N/A/*
2N/A * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
1N/A */
1N/A
1N/A/* Solaris includes. */
1N/A#include <priv.h>
1N/A#include <ctype.h>
1N/A
1N/A/* Perl includes. */
1N/A#include "EXTERN.h"
1N/A#include "perl.h"
1N/A#include "XSUB.h"
1N/A
1N/A#define IVCONST(s, c) newCONSTSUB(s, #c, newSViv((int)c));
1N/A#define POFF (sizeof ("PRIV_") - 1)
1N/A
1N/A#define RETPRIVSET(set) \
1N/A ST(0) = sv_newmortal(); \
1N/A sv_setref_pv(ST(0), "Sun::Solaris::Privilege::PrivsetPtr", \
1N/A (void*)(set)); \
1N/A SvREADONLY_on(SvRV(ST(0)))
1N/A
1N/Atypedef int sysret;
1N/A
1N/Atypedef priv_set_t Sun__Solaris__Privilege__Privset;
1N/A
1N/Astatic priv_set_t *
1N/Adupset(const priv_set_t *s)
1N/A{
1N/A priv_set_t *new = priv_allocset();
1N/A if (new == NULL)
1N/A return (NULL);
1N/A
1N/A priv_copyset(s, new);
1N/A return (new);
1N/A}
1N/A
1N/A/*
1N/A * Automatically derive the #define constant from the constant value.
1N/A * This is the uppercase value of the constant with "PRIV_" prepended.
1N/A * The (name, value) pair computed in that way is stored twice:
1N/A * once as constant subroutine in the module's hash table.
1N/A * once as (key, value) in a hash table.
1N/A */
1N/A
1N/Astatic void
1N/APRIVconst(HV *sym, HV *var, const char *name)
1N/A{
1N/A char upname[128];
1N/A ssize_t len;
1N/A int i;
1N/A
1N/A len = snprintf(upname, sizeof (upname), "PRIV_%s", name);
1N/A if (len >= sizeof (upname))
1N/A return;
1N/A
1N/A for (i = POFF; i < len; i++)
1N/A upname[i] = toupper(upname[i]);
1N/A newCONSTSUB(sym, upname, newSVpv(name, len - POFF));
1N/A hv_store(var, upname, len, newSVpv(name, len - POFF), 0);
1N/A}
1N/A
1N/A/*
1N/A * The XS code exported to perl is below here. Note that the XS preprocessor
1N/A * has its own commenting syntax, so all comments from this point on are in
1N/A * that form.
1N/A *
1N/A * Inside perl, privilege sets are represented as expanded strings;
1N/A * privileges and privilege sets are only known by name.
1N/A */
1N/A
1N/AMODULE = Sun::Solaris::Privilege PACKAGE = Sun::Solaris::Privilege
1N/APROTOTYPES: ENABLE
1N/A
1N/A #
1N/A # Define any constants that need to be exported. By doing it this way we can
1N/A # avoid the overhead of using the DynaLoader package, and in addition constants
1N/A # defined using this mechanism are eligible for inlining by the perl
1N/A # interpreter at compile time.
1N/A #
1N/ABOOT:
1N/A{
1N/A HV *stash;
1N/A HV *privs;
1N/A HV *privsets;
1N/A const char *p;
1N/A int i;
1N/A
1N/A stash = gv_stashpv("Sun::Solaris::Privilege", TRUE);
1N/A
1N/A /*
1N/A * Global constants
1N/A */
1N/A IVCONST(stash, PRIV_STR_PORT);
1N/A IVCONST(stash, PRIV_STR_LIT);
1N/A IVCONST(stash, PRIV_STR_SHORT);
1N/A IVCONST(stash, PRIV_ALLSETS);
1N/A IVCONST(stash, PRIV_DEBUG);
1N/A IVCONST(stash, PRIV_AWARE);
2N/A IVCONST(stash, PRIV_AWARE_RESET);
2N/A IVCONST(stash, __PROC_PROTECT);
2N/A IVCONST(stash, NET_MAC_AWARE);
2N/A IVCONST(stash, NET_MAC_AWARE_INHERIT);
2N/A IVCONST(stash, PRIV_XPOLICY);
2N/A IVCONST(stash, PRIV_PFEXEC);
1N/A IVCONST(stash, PRIV_ON);
1N/A IVCONST(stash, PRIV_OFF);
1N/A IVCONST(stash, PRIV_SET);
1N/A
1N/A /*
1N/A * %PRIVILEGES hash and the privilege constants
1N/A */
1N/A privs = perl_get_hv("Sun::Solaris::Privilege::PRIVILEGES", TRUE);
1N/A for (i = 0; (p = priv_getbynum(i++)) != NULL; )
1N/A PRIVconst(stash, privs, p);
1N/A
1N/A /*
1N/A * %PRIVSETS hash and the privset constants
1N/A */
1N/A privsets = perl_get_hv("Sun::Solaris::Privilege::PRIVSETS", TRUE);
1N/A for (i = 0; (p = priv_getsetbynum(i++)) != NULL; )
1N/A PRIVconst(stash, privsets, p);
1N/A}
1N/A
1N/A
1N/ASun::Solaris::Privilege::Privset *
1N/Agetppriv(which)
1N/A const char *which;
1N/ACODE:
1N/A RETVAL = priv_allocset();
1N/A if (getppriv(which, RETVAL) != 0) {
1N/A priv_freeset(RETVAL);
1N/A XSRETURN_UNDEF;
1N/A } else {
1N/A RETPRIVSET(RETVAL);
1N/A }
1N/A
1N/Asysret
1N/Asetppriv(op, which, set)
1N/A int op;
1N/A const char *which;
1N/A Sun::Solaris::Privilege::Privset *set;
1N/A
1N/ASun::Solaris::Privilege::Privset *
1N/Apriv_emptyset()
1N/ACODE:
1N/A RETVAL = priv_allocset();
1N/A if (RETVAL == NULL) {
1N/A XSRETURN_UNDEF;
1N/A }
1N/A priv_emptyset(RETVAL);
1N/A RETPRIVSET(RETVAL);
1N/A
1N/ASun::Solaris::Privilege::Privset *
1N/Apriv_fillset()
1N/ACODE:
1N/A RETVAL = priv_allocset();
1N/A if (RETVAL == NULL) {
1N/A XSRETURN_UNDEF;
1N/A }
1N/A priv_fillset(RETVAL);
1N/A RETPRIVSET(RETVAL);
1N/A
1N/Aboolean_t
1N/Apriv_isemptyset(set)
1N/A Sun::Solaris::Privilege::Privset *set;
1N/A
1N/Aboolean_t
1N/Apriv_isfullset(set)
1N/A Sun::Solaris::Privilege::Privset *set;
1N/A
1N/Aboolean_t
1N/Apriv_isequalset(set1, set2)
1N/A Sun::Solaris::Privilege::Privset *set1;
1N/A Sun::Solaris::Privilege::Privset *set2;
1N/A
1N/Aboolean_t
1N/Apriv_issubset(set1, set2)
1N/A Sun::Solaris::Privilege::Privset *set1;
1N/A Sun::Solaris::Privilege::Privset *set2;
1N/A
1N/Aboolean_t
1N/Apriv_ismember(set, priv)
1N/A Sun::Solaris::Privilege::Privset *set;
1N/A const char *priv;
1N/A
1N/Aboolean_t
1N/Apriv_ineffect(priv)
1N/A const char *priv;
1N/A
1N/ASun::Solaris::Privilege::Privset *
1N/Apriv_intersect(set1, set2)
1N/A Sun::Solaris::Privilege::Privset *set1;
1N/A Sun::Solaris::Privilege::Privset *set2;
1N/ACODE:
1N/A RETVAL = dupset(set2);
1N/A if (RETVAL == NULL) {
1N/A XSRETURN_UNDEF;
1N/A }
1N/A priv_intersect(set1, RETVAL);
1N/A RETPRIVSET(RETVAL);
1N/A
1N/ASun::Solaris::Privilege::Privset *
1N/Apriv_union(set1, set2)
1N/A Sun::Solaris::Privilege::Privset *set1;
1N/A Sun::Solaris::Privilege::Privset *set2;
1N/ACODE:
1N/A RETVAL = dupset(set2);
1N/A if (RETVAL == NULL) {
1N/A XSRETURN_UNDEF;
1N/A }
1N/A priv_union(set1, RETVAL);
1N/A RETPRIVSET(RETVAL);
1N/A
1N/ASun::Solaris::Privilege::Privset *
1N/Apriv_inverse(set1)
1N/A Sun::Solaris::Privilege::Privset *set1;
1N/ACODE:
1N/A RETVAL = dupset(set1);
1N/A if (RETVAL == NULL) {
1N/A XSRETURN_UNDEF;
1N/A }
1N/A priv_inverse(RETVAL);
1N/A RETPRIVSET(RETVAL);
1N/A
1N/A
1N/Asysret
1N/Apriv_addset(set, priv)
1N/A Sun::Solaris::Privilege::Privset *set;
1N/A const char *priv;
1N/A
1N/ASun::Solaris::Privilege::Privset *
1N/Apriv_copyset(set1)
1N/A Sun::Solaris::Privilege::Privset *set1;
1N/ACODE:
1N/A RETVAL = dupset(set1);
1N/A if (RETVAL == NULL) {
1N/A XSRETURN_UNDEF;
1N/A }
1N/A RETPRIVSET(RETVAL);
1N/A
1N/A
1N/Asysret
1N/Apriv_delset(set, priv)
1N/A Sun::Solaris::Privilege::Privset *set;
1N/A const char *priv;
1N/A
1N/Aconst char *
1N/Apriv_getbynum(i)
1N/A int i;
1N/A
1N/Aconst char *
1N/Apriv_getsetbynum(i)
1N/A int i;
1N/A
1N/Achar *
1N/Apriv_set_to_str(s, c, f)
1N/A Sun::Solaris::Privilege::Privset *s;
1N/A char c;
1N/A int f;
1N/ACLEANUP:
1N/A free(RETVAL);
1N/A
1N/ASun::Solaris::Privilege::Privset *
1N/Apriv_str_to_set(buf, sep);
1N/A const char *buf;
1N/A const char *sep;
1N/ACODE:
1N/A RETVAL = priv_str_to_set(buf, sep, NULL);
1N/A if (RETVAL == NULL) {
1N/A XSRETURN_UNDEF;
1N/A }
1N/A RETPRIVSET(RETVAL);
1N/A
1N/Achar *
1N/Apriv_gettext(priv)
1N/A const char *priv
1N/ACLEANUP:
1N/A free(RETVAL);
1N/A
1N/Asysret
1N/Asetpflags(flag, val)
1N/A uint_t flag;
1N/A uint_t val;
1N/A
1N/Asysret
1N/Agetpflags(flag)
1N/A uint_t flag;
1N/A
1N/AMODULE = Sun::Solaris::Privilege PACKAGE = Sun::Solaris::Privilege::PrivsetPtr PREFIX = Privilege_
1N/A
1N/Avoid
1N/APrivilege_DESTROY(ps)
1N/A Sun::Solaris::Privilege::Privset *ps;
1N/ACODE:
1N/A priv_freeset(ps);
1N/A