1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
|
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#include "securebits.h"
#include <errno.h>
#include <sys/capability.h>
#include <sys/prctl.h>
#include <stdio.h>
#include <unistd.h>
#define CAP_EFFECTIVE 0
#define CAP_PERMITTED 1
#define CAP_INHERITABLE 2
#include "const-c.inc"
#ifdef PR_SET_PTRACER
#define NOT_SET (-1)
static int __cached_ptracer;
#endif
MODULE = Linux::Prctl PACKAGE = Linux::Prctl
INCLUDE: const-xs.inc
int
get_dumpable()
CODE:
RETVAL = prctl(PR_GET_DUMPABLE, 0, 0, 0, 0);
OUTPUT:
RETVAL
int
set_dumpable(dumpable)
int dumpable
CODE:
RETVAL = prctl(PR_SET_DUMPABLE, dumpable, 0, 0, 0);
OUTPUT:
RETVAL
int
get_endian()
CODE:
int endianness;
if(prctl(PR_GET_ENDIAN, &endianness, 0, 0, 0))
XSRETURN_UNDEF;
RETVAL = endianness;
OUTPUT:
RETVAL
int
set_endian(endianness)
INIT:
int endianness = 0;
CODE:
RETVAL = prctl(PR_SET_ENDIAN, endianness, 0, 0, 0);
OUTPUT:
RETVAL
int get_fpemu()
INIT:
int fpemu = 0;
CODE:
if(prctl(PR_GET_FPEMU, &fpemu, 0, 0, 0))
XSRETURN_UNDEF;
RETVAL = fpemu;
OUTPUT:
RETVAL
int
set_fpemu(fpemu)
int fpemu
CODE:
RETVAL = prctl(PR_SET_FPEMU, fpemu, 0, 0, 0);
OUTPUT:
RETVAL
int get_fpexc()
INIT:
int fpexc = 0;
CODE:
if(prctl(PR_GET_FPEXC, &fpexc, 0, 0, 0))
XSRETURN_UNDEF;
RETVAL = fpexc;
OUTPUT:
RETVAL
int
set_fpexc(fpexc)
int fpexc
CODE:
RETVAL = prctl(PR_SET_FPEXC, fpexc, 0, 0, 0);
OUTPUT:
RETVAL
=for comment
New in 2.6.32, but named and implemented inconsistently. The linux
implementation has two ways of setting the policy to the default, and thus
needs an extra argument. We ignore the first argument and always all
PR_MCE_KILL_SET. This makes our implementation simpler and keeps the prctl
interface more consistent
=cut
#ifdef PR_MCE_KILL
#define PR_GET_MCE_KILL PR_MCE_KILL_GET
#define PR_SET_MCE_KILL PR_MCE_KILL
int
set_mce_kill(mce_kill)
int mce_kill
CODE:
RETVAL = prctl(PR_SET_MCE_KILL, PR_MCE_KILL_SET, mce_kill, 0, 0);
OUTPUT:
RETVAL
int
get_mce_kill()
CODE:
RETVAL = prctl(PR_GET_MCE_KILL, 0, 0, 0, 0);
OUTPUT:
RETVAL
#endif
char *
get_name()
INIT:
char *name = (char*)malloc(32);
CODE:
prctl(PR_GET_NAME, name, 0, 0, 0);
RETVAL = name;
OUTPUT:
RETVAL
int
set_name(name)
char *name
CODE:
RETVAL = prctl(PR_SET_NAME, name, 0, 0, 0);
OUTPUT:
RETVAL
int
get_pdeathsig()
INIT:
int signal;
CODE:
prctl(PR_GET_PDEATHSIG, &signal, 0, 0, 0);
RETVAL = signal;
OUTPUT:
RETVAL
int
set_pdeathsig(signal)
int signal
CODE:
RETVAL = prctl(PR_SET_PDEATHSIG, signal, 0, 0, 0);
OUTPUT:
RETVAL
#ifdef PR_SET_PTRACER
int
set_ptracer(pid)
int pid
CODE:
RETVAL = prctl(PR_SET_PTRACER, pid, 0, 0, 0);
__cached_ptracer = pid;
OUTPUT:
RETVAL
int get_ptracer()
CODE:
if(__cached_ptracer == NOT_SET){
__cached_ptracer = (int)getppid();
}
RETVAL = __cached_ptracer;
OUTPUT:
RETVAL
#endif
#ifdef PR_SET_SECCOMP
int
set_seccomp(val)
int val
CODE:
RETVAL = prctl(PR_SET_SECCOMP, val, 0, 0, 0);
OUTPUT:
RETVAL
int
get_seccomp()
CODE:
RETVAL = prctl(PR_GET_SECCOMP, 0, 0, 0, 0);
OUTPUT:
RETVAL
#endif
#ifdef PR_SET_SECUREBITS
int
set_securebits(bits)
int bits
CODE:
RETVAL = prctl(PR_SET_SECUREBITS, bits, 0, 0, 0);
OUTPUT:
RETVAL
int
get_securebits()
CODE:
RETVAL = prctl(PR_GET_SECUREBITS, 0, 0, 0, 0);
OUTPUT:
RETVAL
#endif
#ifdef PR_GET_TIMERSLACK
int
set_timerslack(timerslack)
int timerslack
CODE:
RETVAL = prctl(PR_SET_TIMERSLACK, timerslack, 0, 0, 0);
OUTPUT:
RETVAL
int
get_timerslack()
CODE:
RETVAL = prctl(PR_GET_TIMERSLACK, 0, 0, 0, 0);
OUTPUT:
RETVAL
#endif
int
set_timing(timing)
int timing
CODE:
RETVAL = prctl(PR_SET_TIMING, timing, 0, 0, 0);
OUTPUT:
RETVAL
int
get_timing()
CODE:
RETVAL = prctl(PR_GET_TIMING, 0, 0, 0, 0);
OUTPUT:
RETVAL
#ifdef PR_SET_TSC
int
set_tsc(tsc)
int tsc
CODE:
RETVAL = prctl(PR_SET_TSC, tsc, 0, 0, 0);
OUTPUT:
RETVAL
int
get_tsc()
CODE:
int tsc;
prctl(PR_GET_TSC, &tsc, 0, 0, 0);
RETVAL = tsc;
OUTPUT:
RETVAL
#endif
int
set_unalign(unalign)
int unalign
CODE:
RETVAL = prctl(PR_SET_UNALIGN, unalign, 0, 0, 0);
OUTPUT:
RETVAL
int
get_unalign()
CODE:
int unalign;
prctl(PR_GET_UNALIGN, &unalign, 0, 0, 0);
RETVAL = unalign;
OUTPUT:
RETVAL
#ifdef PR_CAPBSET_DROP
int
capbset_drop(cap)
int cap
CODE:
RETVAL = prctl(PR_CAPBSET_DROP, cap, 0, 0, 0);
OUTPUT:
RETVAL
int
capbset_read(cap)
int cap
CODE:
RETVAL = prctl(PR_CAPBSET_READ, cap, 0, 0, 0);
OUTPUT:
RETVAL
#endif
int
get_cap(flag, cap)
int flag
int cap
CODE:
cap_flag_value_t isset;
cap_t caps = cap_get_proc();
if(cap_get_flag(caps, (cap_value_t)cap, (cap_flag_t)flag, &isset) == -1)
croak("cap_get_flag failed: %s", strerror(errno));
cap_free(caps);
RETVAL = isset;
OUTPUT:
RETVAL
int
set_cap(flag, cap, val)
int flag
int cap
int val
CODE:
cap_flag_value_t isset;
cap_t caps = cap_get_proc();
if(cap_set_flag(caps, (cap_flag_t)flag, 1, (const cap_value_t *)&cap, (cap_flag_value_t)val) == -1)
croak("cap_set_flag failed: %s", strerror(errno));
cap_set_proc(caps);
cap_free(caps);
RETVAL = isset;
OUTPUT:
RETVAL
|