4555 macro side-effects with /usr/include/libelf.h
[unleashed.git] / usr / src / cmd / perl / contrib / Sun / Solaris / Ucred / Ucred.xs
blob4f463b58cdc0973b908b50e9dd2220f15341eeec
1 /*
2  * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
3  */
4 /*
5  * Ucred.xs contains XS wrappers for the process privilege maniplulation
6  * functions.
7  */
10 /* Solaris includes. */
11 #include <ucred.h>
12 #include <priv.h>
14 /* Perl includes. */
15 #include "EXTERN.h"
16 #include "perl.h"
17 #include "XSUB.h"
19 typedef int sysret;
20 typedef priv_set_t Sun__Solaris__Privilege__Privset;
21 typedef ucred_t Sun__Solaris__Ucred__Ucred;
23 static priv_set_t *
24 dupset(const priv_set_t *s)
26         priv_set_t *new = priv_allocset();
27         if (new == NULL)
28                 return (NULL);
30         priv_copyset(s, new);
31         return (new);
34 #define RETPRIVSET(set)         \
35         ST(0) = sv_newmortal();                                         \
36         sv_setref_pv(ST(0), "Sun::Solaris::Privilege::PrivsetPtr",      \
37             (void*)(set));                                              \
38         SvREADONLY_on(SvRV(ST(0)))
40 #define RETUCRED(uc)            \
41         ST(0) = sv_newmortal();                                         \
42         sv_setref_pv(ST(0), "Sun::Solaris::Ucred::UcredPtr",            \
43             (void*)(uc));                                               \
44         SvREADONLY_on(SvRV(ST(0)))
46  * The XS code exported to perl is below here.  Note that the XS preprocessor
47  * has its own commenting syntax, so all comments from this point on are in
48  * that form.
49  */
51 MODULE = Sun::Solaris::Ucred PACKAGE = Sun::Solaris::Ucred
52 PROTOTYPES: ENABLE
54 Sun::Solaris::Ucred::Ucred *
55 ucred_get(pid);
56         pid_t pid;
58 uid_t
59 ucred_geteuid(uc)
60         Sun::Solaris::Ucred::Ucred *uc;
62 uid_t
63 ucred_getruid(uc)
64         Sun::Solaris::Ucred::Ucred *uc;
66 uid_t
67 ucred_getsuid(uc)
68         Sun::Solaris::Ucred::Ucred *uc;
70 gid_t
71 ucred_getegid(uc)
72         Sun::Solaris::Ucred::Ucred *uc;
74 gid_t
75 ucred_getrgid(uc)
76         Sun::Solaris::Ucred::Ucred *uc;
78 gid_t
79 ucred_getsgid(uc)
80         Sun::Solaris::Ucred::Ucred *uc;
82 pid_t
83 ucred_getpid(uc)
84         Sun::Solaris::Ucred::Ucred *uc;
86 zoneid_t
87 ucred_getzoneid(uc)
88         Sun::Solaris::Ucred::Ucred *uc;
90 projid_t
91 ucred_getprojid(uc)
92         Sun::Solaris::Ucred::Ucred *uc;
94 uint_t
95 ucred_getpflags(uc, flags)
96         Sun::Solaris::Ucred::Ucred *uc;
97         uint_t flags;
99 Sun::Solaris::Privilege::Privset *
100 ucred_getprivset(uc, which)
101         Sun::Solaris::Ucred::Ucred *uc;
102         const char *which;
103 PREINIT:
104         const priv_set_t *val;
105 CODE:
106         /*
107          * Since this function returns a pointer into the ucred_t, we need
108          * to copy it or perl may free one before the other; and the
109          * priv_set_t * returned by it doesn't react kindly to free().
110          */
111         val = ucred_getprivset(uc, which);
112         if (val == NULL || (RETVAL = dupset(val)) == NULL)
113                 XSRETURN_UNDEF;
114         RETPRIVSET(RETVAL);
116 Sun::Solaris::Ucred::Ucred *
117 getpeerucred(fd)
118         int fd;
119 CODE:
120         RETVAL = NULL;
121         if (getpeerucred(fd, &RETVAL) != 0)
122                 XSRETURN_UNDEF;
123         RETUCRED(RETVAL);
125 void
126 ucred_getgroups(uc)
127         Sun::Solaris::Ucred::Ucred *uc;
128 PREINIT:
129         const gid_t *gids;
130         int n;
131 PPCODE:
132         n = ucred_getgroups(uc, &gids);
133         if (n < 0)
134                 XSRETURN_UNDEF;
136         PUTBACK;
137         if (GIMME_V == G_SCALAR) {
138                 EXTEND(SP, 1);
139                 PUSHs(sv_2mortal(newSViv(n)));
140                 PUTBACK;
141                 XSRETURN(1);
142         } else if (GIMME_V == G_ARRAY) {
143                 int i;
144                 EXTEND(SP, n);
146                 for (i = 0; i < n; i++)
147                         PUSHs(sv_2mortal(newSViv(gids[i])));
148                 PUTBACK;
149                 XSRETURN(n);
150         } else {
151                 PUTBACK;
152                 XSRETURN(0);
153         }
158 MODULE = Sun::Solaris::Ucred PACKAGE = Sun::Solaris::Ucred::UcredPtr PREFIX = Ucred_
160 void
161 Ucred_DESTROY(uc)
162         Sun::Solaris::Ucred::Ucred *uc;
163 CODE:
164         ucred_free(uc);