xref: /onnv-gate/usr/src/cmd/perl/contrib/Sun/Solaris/Ucred/Ucred.xs (revision 12388:1bc8d55b0dfd)
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  */
8 
9 
10 /* Solaris includes. */
11 #include <ucred.h>
12 #include <priv.h>
13 
14 /* Perl includes. */
15 #include "EXTERN.h"
16 #include "perl.h"
17 #include "XSUB.h"
18 
19 typedef int sysret;
20 typedef priv_set_t Sun__Solaris__Privilege__Privset;
21 typedef ucred_t Sun__Solaris__Ucred__Ucred;
22 
23 static priv_set_t *
dupset(const priv_set_t * s)24 dupset(const priv_set_t *s)
25 {
26 	priv_set_t *new = priv_allocset();
27 	if (new == NULL)
28 		return (NULL);
29 
30 	priv_copyset(s, new);
31 	return (new);
32 }
33 
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)))
39 
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)))
45 /*
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  */
50 
51 MODULE = Sun::Solaris::Ucred PACKAGE = Sun::Solaris::Ucred
52 PROTOTYPES: ENABLE
53 
54 Sun::Solaris::Ucred::Ucred *
55 ucred_get(pid);
56 	pid_t pid;
57 
58 uid_t
59 ucred_geteuid(uc)
60 	Sun::Solaris::Ucred::Ucred *uc;
61 
62 uid_t
63 ucred_getruid(uc)
64 	Sun::Solaris::Ucred::Ucred *uc;
65 
66 uid_t
67 ucred_getsuid(uc)
68 	Sun::Solaris::Ucred::Ucred *uc;
69 
70 gid_t
71 ucred_getegid(uc)
72 	Sun::Solaris::Ucred::Ucred *uc;
73 
74 gid_t
75 ucred_getrgid(uc)
76 	Sun::Solaris::Ucred::Ucred *uc;
77 
78 gid_t
79 ucred_getsgid(uc)
80 	Sun::Solaris::Ucred::Ucred *uc;
81 
82 pid_t
83 ucred_getpid(uc)
84 	Sun::Solaris::Ucred::Ucred *uc;
85 
86 zoneid_t
87 ucred_getzoneid(uc)
88 	Sun::Solaris::Ucred::Ucred *uc;
89 
90 projid_t
91 ucred_getprojid(uc)
92 	Sun::Solaris::Ucred::Ucred *uc;
93 
94 uint_t
95 ucred_getpflags(uc, flags)
96 	Sun::Solaris::Ucred::Ucred *uc;
97 	uint_t flags;
98 
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);
115 
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);
124 
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;
135 
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);
145 
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 	}
154 
155 
156 
157 
158 MODULE = Sun::Solaris::Ucred PACKAGE = Sun::Solaris::Ucred::UcredPtr PREFIX = Ucred_
159 
160 void
161 Ucred_DESTROY(uc)
162 	Sun::Solaris::Ucred::Ucred *uc;
163 CODE:
164 	ucred_free(uc);
165 
166