Ucred.xs revision c227543f6890bd6f2054360ec1820bfef8132431
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Ucred.xs contains XS wrappers for the process privilege maniplulation
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * functions.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/* Solaris includes. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <ucred.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <priv.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/* Perl includes. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include "EXTERN.h"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include "perl.h"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include "XSUB.h"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fostertypedef int sysret;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fostertypedef priv_set_t Sun__Solaris__Privilege__Privset;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fostertypedef ucred_t Sun__Solaris__Ucred__Ucred;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic priv_set_t *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterdupset(const priv_set_t *s)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster priv_set_t *new = priv_allocset();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (new == NULL)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return (NULL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster priv_copyset(s, new);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return (new);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#define RETPRIVSET(set) \
ST(0) = sv_newmortal(); \
sv_setref_pv(ST(0), "Sun::Solaris::Privilege::PrivsetPtr", \
(void*)(set)); \
SvREADONLY_on(SvRV(ST(0)))
#define RETUCRED(uc) \
ST(0) = sv_newmortal(); \
sv_setref_pv(ST(0), "Sun::Solaris::Ucred::UcredPtr", \
(void*)(uc)); \
SvREADONLY_on(SvRV(ST(0)))
/*
* The XS code exported to perl is below here. Note that the XS preprocessor
* has its own commenting syntax, so all comments from this point on are in
* that form.
*/
MODULE = Sun::Solaris::Ucred PACKAGE = Sun::Solaris::Ucred
PROTOTYPES: ENABLE
Sun::Solaris::Ucred::Ucred *
ucred_get(pid);
pid_t pid;
uid_t
ucred_geteuid(uc)
Sun::Solaris::Ucred::Ucred *uc;
uid_t
ucred_getruid(uc)
Sun::Solaris::Ucred::Ucred *uc;
uid_t
ucred_getsuid(uc)
Sun::Solaris::Ucred::Ucred *uc;
gid_t
ucred_getegid(uc)
Sun::Solaris::Ucred::Ucred *uc;
gid_t
ucred_getrgid(uc)
Sun::Solaris::Ucred::Ucred *uc;
gid_t
ucred_getsgid(uc)
Sun::Solaris::Ucred::Ucred *uc;
pid_t
ucred_getpid(uc)
Sun::Solaris::Ucred::Ucred *uc;
zoneid_t
ucred_getzoneid(uc)
Sun::Solaris::Ucred::Ucred *uc;
projid_t
ucred_getprojid(uc)
Sun::Solaris::Ucred::Ucred *uc;
uint_t
ucred_getpflags(uc, flags)
Sun::Solaris::Ucred::Ucred *uc;
uint_t flags;
Sun::Solaris::Privilege::Privset *
ucred_getprivset(uc, which)
Sun::Solaris::Ucred::Ucred *uc;
const char *which;
PREINIT:
const priv_set_t *val;
CODE:
/*
* Since this function returns a pointer into the ucred_t, we need
* to copy it or perl may free one before the other; and the
* priv_set_t * returned by it doesn't react kindly to free().
*/
val = ucred_getprivset(uc, which);
if (val == NULL || (RETVAL = dupset(val)) == NULL)
XSRETURN_UNDEF;
RETPRIVSET(RETVAL);
Sun::Solaris::Ucred::Ucred *
getpeerucred(fd)
int fd;
CODE:
RETVAL = NULL;
if (getpeerucred(fd, &RETVAL) != 0)
XSRETURN_UNDEF;
RETUCRED(RETVAL);
void
ucred_getgroups(uc)
Sun::Solaris::Ucred::Ucred *uc;
PREINIT:
const gid_t *gids;
int n;
PPCODE:
n = ucred_getgroups(uc, &gids);
if (n < 0)
XSRETURN_UNDEF;
PUTBACK;
if (GIMME_V == G_SCALAR) {
EXTEND(SP, 1);
PUSHs(sv_2mortal(newSViv(n)));
PUTBACK;
XSRETURN(1);
} else if (GIMME_V == G_ARRAY) {
int i;
EXTEND(SP, n);
for (i = 0; i < n; i++)
PUSHs(sv_2mortal(newSViv(gids[i])));
PUTBACK;
XSRETURN(n);
} else {
PUTBACK;
XSRETURN(0);
}
MODULE = Sun::Solaris::Ucred PACKAGE = Sun::Solaris::Ucred::UcredPtr PREFIX = Ucred_
void
Ucred_DESTROY(uc)
Sun::Solaris::Ucred::Ucred *uc;
CODE:
ucred_free(uc);