Lines 1-5
Link Here
|
1 |
--- Sysctl.xs.orig 2014-01-21 23:02:47 UTC |
1 |
--- Sysctl.xs.orig 2014-01-21 16:02:47.000000000 -0700 |
2 |
+++ Sysctl.xs |
2 |
+++ Sysctl.xs 2018-03-09 10:15:13.911891000 -0700 |
3 |
@@ -14,6 +14,7 @@ |
3 |
@@ -14,6 +14,7 @@ |
4 |
|
4 |
|
5 |
#include <stdio.h> |
5 |
#include <stdio.h> |
Lines 8-17
Link Here
|
8 |
#include <sys/sysctl.h> |
8 |
#include <sys/sysctl.h> |
9 |
|
9 |
|
10 |
#include <sys/time.h> /* struct clockinfo */ |
10 |
#include <sys/time.h> /* struct clockinfo */ |
11 |
@@ -48,78 +49,114 @@ |
11 |
@@ -48,78 +49,129 @@ |
12 |
#include <netinet6/raw_ip6.h> |
12 |
#include <netinet6/raw_ip6.h> |
13 |
#include "bsd-sysctl.h" |
13 |
#include "bsd-sysctl.h" |
14 |
|
14 |
|
|
|
15 |
+#define DECODE(T) \ |
16 |
+ if (buflen == sizeof(T)) { \ |
17 |
+ RETVAL = newSViv(*(T *)buf); \ |
18 |
+ } \ |
19 |
+ else { \ |
20 |
+ AV *c = (AV *)sv_2mortal((SV *)newAV()); \ |
21 |
+ char *bptr = buf; \ |
22 |
+ while (buflen >= sizeof(T)) { \ |
23 |
+ av_push(c, newSViv(*(T *)bptr)); \ |
24 |
+ buflen -= sizeof(T); \ |
25 |
+ bptr += sizeof(T); \ |
26 |
+ } \ |
27 |
+ RETVAL = newRV((SV *)c); \ |
28 |
+ } |
29 |
+ |
15 |
+void |
30 |
+void |
16 |
+_iterator_first(HV *self) |
31 |
+_iterator_first(HV *self) |
17 |
+{ |
32 |
+{ |
Lines 188-194
Link Here
|
188 |
MODULE = BSD::Sysctl PACKAGE = BSD::Sysctl |
203 |
MODULE = BSD::Sysctl PACKAGE = BSD::Sysctl |
189 |
|
204 |
|
190 |
PROTOTYPES: ENABLE |
205 |
PROTOTYPES: ENABLE |
191 |
@@ -127,67 +164,18 @@ PROTOTYPES: ENABLE |
206 |
@@ -127,67 +179,18 @@ |
192 |
SV * |
207 |
SV * |
193 |
next (SV *refself) |
208 |
next (SV *refself) |
194 |
INIT: |
209 |
INIT: |
Lines 263-269
Link Here
|
263 |
OUTPUT: |
278 |
OUTPUT: |
264 |
RETVAL |
279 |
RETVAL |
265 |
|
280 |
|
266 |
@@ -878,6 +866,10 @@ _mib_set(const char *arg, const char *value) |
281 |
@@ -235,6 +238,10 @@ |
|
|
282 |
case 'A': |
283 |
fmt_type = FMT_A; |
284 |
break; |
285 |
+ case 'C': |
286 |
+ ++f; |
287 |
+ fmt_type = *f == 'U' ? FMT_UINT8 : FMT_INT8; |
288 |
+ break; |
289 |
case 'I': |
290 |
++f; |
291 |
fmt_type = *f == 'U' ? FMT_UINT : FMT_INT; |
292 |
@@ -398,96 +405,31 @@ |
293 |
SvCUR_set(sv_buf, buflen); |
294 |
RETVAL = sv_buf; |
295 |
break; |
296 |
+ |
297 |
+ case FMT_INT8: |
298 |
+ DECODE(int8_t); |
299 |
+ break; |
300 |
+ case FMT_UINT8: |
301 |
+ DECODE(uint8_t); |
302 |
+ break; |
303 |
case FMT_INT: |
304 |
- if (buflen == sizeof(int)) { |
305 |
- RETVAL = newSViv(*(int *)buf); |
306 |
- } |
307 |
- else { |
308 |
- AV *c = (AV *)sv_2mortal((SV *)newAV()); |
309 |
- char *bptr = buf; |
310 |
- while (buflen >= sizeof(int)) { |
311 |
- av_push(c, newSViv(*(int *)bptr)); |
312 |
- buflen -= sizeof(int); |
313 |
- bptr += sizeof(int); |
314 |
- } |
315 |
- RETVAL = newRV((SV *)c); |
316 |
- } |
317 |
- break; |
318 |
+ DECODE(int); |
319 |
+ break; |
320 |
case FMT_UINT: |
321 |
- if (buflen == sizeof(unsigned int)) { |
322 |
- RETVAL = newSViv(*(unsigned int *)buf); |
323 |
- } |
324 |
- else { |
325 |
- AV *c = (AV *)sv_2mortal((SV *)newAV()); |
326 |
- char *bptr = buf; |
327 |
- while (buflen >= sizeof(unsigned int)) { |
328 |
- av_push(c, newSViv(*(unsigned int *)bptr)); |
329 |
- buflen -= sizeof(unsigned int); |
330 |
- bptr += sizeof(unsigned int); |
331 |
- } |
332 |
- RETVAL = newRV((SV *)c); |
333 |
- } |
334 |
- break; |
335 |
+ DECODE(unsigned int); |
336 |
+ break; |
337 |
case FMT_LONG: |
338 |
- if (buflen == sizeof(long)) { |
339 |
- RETVAL = newSVuv(*(long *)buf); |
340 |
- } |
341 |
- else { |
342 |
- AV *c = (AV *)sv_2mortal((SV *)newAV()); |
343 |
- char *bptr = buf; |
344 |
- while (buflen >= sizeof(long)) { |
345 |
- av_push(c, newSVuv(*(long *)bptr)); |
346 |
- buflen -= sizeof(long); |
347 |
- bptr += sizeof(long); |
348 |
- } |
349 |
- RETVAL = newRV((SV *)c); |
350 |
- } |
351 |
- break; |
352 |
+ DECODE(long); |
353 |
+ break; |
354 |
case FMT_ULONG: |
355 |
- if (buflen == sizeof(unsigned long)) { |
356 |
- RETVAL = newSVuv(*(unsigned long *)buf); |
357 |
- } |
358 |
- else { |
359 |
- AV *c = (AV *)sv_2mortal((SV *)newAV()); |
360 |
- char *bptr = buf; |
361 |
- while (buflen >= sizeof(unsigned long)) { |
362 |
- av_push(c, newSVuv(*(unsigned long *)bptr)); |
363 |
- buflen -= sizeof(unsigned long); |
364 |
- bptr += sizeof(unsigned long); |
365 |
- } |
366 |
- RETVAL = newRV((SV *)c); |
367 |
- } |
368 |
- break; |
369 |
+ DECODE(unsigned long); |
370 |
+ break; |
371 |
case FMT_64: |
372 |
- if (buflen == sizeof(int64_t)) { |
373 |
- RETVAL = newSVuv(*(int64_t *)buf); |
374 |
- } |
375 |
- else { |
376 |
- AV *c = (AV *)sv_2mortal((SV *)newAV()); |
377 |
- char *bptr = buf; |
378 |
- while (buflen >= sizeof(int64_t)) { |
379 |
- av_push(c, newSVuv(*(int64_t *)bptr)); |
380 |
- buflen -= sizeof(int64_t); |
381 |
- bptr += sizeof(int64_t); |
382 |
- } |
383 |
- RETVAL = newRV((SV *)c); |
384 |
- } |
385 |
- break; |
386 |
+ DECODE(int64_t); |
387 |
+ break; |
388 |
case FMT_U64: |
389 |
- if (buflen == sizeof(uint64_t)) { |
390 |
- RETVAL = newSVuv(*(uint64_t *)buf); |
391 |
- } |
392 |
- else { |
393 |
- AV *c = (AV *)sv_2mortal((SV *)newAV()); |
394 |
- char *bptr = buf; |
395 |
- while (buflen >= sizeof(uint64_t)) { |
396 |
- av_push(c, newSVuv(*(uint64_t *)bptr)); |
397 |
- buflen -= sizeof(uint64_t); |
398 |
- bptr += sizeof(uint64_t); |
399 |
- } |
400 |
- RETVAL = newRV((SV *)c); |
401 |
- } |
402 |
- break; |
403 |
+ DECODE(uint64_t); |
404 |
+ break; |
405 |
case FMT_CLOCKINFO: { |
406 |
HV *c = (HV *)sv_2mortal((SV *)newHV()); |
407 |
struct clockinfo *inf = (struct clockinfo *)buf; |
408 |
@@ -878,6 +820,12 @@ |
267 |
SV **oidp; |
409 |
SV **oidp; |
268 |
SV *oid; |
410 |
SV *oid; |
269 |
char *oid_data; |
411 |
char *oid_data; |
Lines 271-280
Link Here
|
271 |
+ long long llval; |
413 |
+ long long llval; |
272 |
+ uint64_t uint64val; |
414 |
+ uint64_t uint64val; |
273 |
+ unsigned long long ullval; |
415 |
+ unsigned long long ullval; |
|
|
416 |
+ int8_t int8val; |
417 |
+ uint8_t uint8val; |
274 |
int oid_fmt; |
418 |
int oid_fmt; |
275 |
int oid_len; |
419 |
int oid_len; |
276 |
int intval; |
420 |
int intval; |
277 |
@@ -954,6 +946,42 @@ _mib_set(const char *arg, const char *value) |
421 |
@@ -936,6 +884,26 @@ |
|
|
422 |
newsize = sizeof(uintval); |
423 |
break; |
424 |
|
425 |
+ case FMT_INT8: |
426 |
+ int8val = (int8_t)strtol(value, &endconvptr, 0); |
427 |
+ if (endconvptr == value || *endconvptr != '\0') { |
428 |
+ warn("invalid integer: '%s'", value); |
429 |
+ XSRETURN_UNDEF; |
430 |
+ } |
431 |
+ newval = &int8val; |
432 |
+ newsize = sizeof(int8val); |
433 |
+ break; |
434 |
+ |
435 |
+ case FMT_UINT8: |
436 |
+ uint8val = (uint8_t)strtoul(value, &endconvptr, 0); |
437 |
+ if (endconvptr == value || *endconvptr != '\0') { |
438 |
+ warn("invalid unsigned integer: '%s'", value); |
439 |
+ XSRETURN_UNDEF; |
440 |
+ } |
441 |
+ newval = &uint8val; |
442 |
+ newsize = sizeof(uint8val); |
443 |
+ break; |
444 |
+ |
445 |
case FMT_LONG: |
446 |
longval = strtol(value, &endconvptr, 0); |
447 |
if (endconvptr == value || *endconvptr != '\0') { |
448 |
@@ -954,6 +922,42 @@ |
278 |
} |
449 |
} |
279 |
newval = &ulongval; |
450 |
newval = &ulongval; |
280 |
newsize = sizeof(ulongval); |
451 |
newsize = sizeof(ulongval); |