Index: head/sysutils/p5-BSD-Sysctl/Makefile =================================================================== --- head/sysutils/p5-BSD-Sysctl/Makefile +++ head/sysutils/p5-BSD-Sysctl/Makefile @@ -3,7 +3,7 @@ PORTNAME= BSD-Sysctl PORTVERSION= 0.11 -PORTREVISION= 3 +PORTREVISION= 4 CATEGORIES= sysutils perl5 MASTER_SITES= CPAN PKGNAMEPREFIX= p5- Index: head/sysutils/p5-BSD-Sysctl/files/patch-Makefile.PL =================================================================== --- head/sysutils/p5-BSD-Sysctl/files/patch-Makefile.PL +++ head/sysutils/p5-BSD-Sysctl/files/patch-Makefile.PL @@ -0,0 +1,8 @@ +--- Makefile.PL.orig 2009-09-25 13:50:50.000000000 -0600 ++++ Makefile.PL 2018-03-08 13:01:25.754377000 -0700 +@@ -119,3 +119,5 @@ + T,struct_cdev 25 auto + Q 26 FMT_64 + QU 27 FMT_U64 ++C 28 FMT_INT8 ++CU 29 FMT_UINT8 Index: head/sysutils/p5-BSD-Sysctl/files/patch-Sysctl.pm =================================================================== --- head/sysutils/p5-BSD-Sysctl/files/patch-Sysctl.pm +++ head/sysutils/p5-BSD-Sysctl/files/patch-Sysctl.pm @@ -0,0 +1,22 @@ +--- Sysctl.pm.orig 2014-01-21 16:08:32.000000000 -0700 ++++ Sysctl.pm 2018-03-08 12:06:28.456797000 -0700 +@@ -42,6 +42,8 @@ + use constant FMT_STRUCT_CDEV => 25; + use constant FMT_64 => 26; + use constant FMT_U64 => 27; ++use constant FMT_UINT8 => 28; ++use constant FMT_INT8 => 29; + + push @EXPORT_OK, 'sysctl'; + sub sysctl { +@@ -105,7 +107,9 @@ + + sub reset { + my $self = shift; +- delete $self->{_ctx}; ++ delete $self->{_next}; ++ delete $self->{_name}; ++ delete $self->{_len0}; + return $self; + } + Index: head/sysutils/p5-BSD-Sysctl/files/patch-Sysctl.xs =================================================================== --- head/sysutils/p5-BSD-Sysctl/files/patch-Sysctl.xs +++ head/sysutils/p5-BSD-Sysctl/files/patch-Sysctl.xs @@ -1,5 +1,5 @@ ---- Sysctl.xs.orig 2014-01-22 00:02:47.000000000 +0100 -+++ Sysctl.xs 2018-05-11 10:26:40.364491000 +0200 +--- Sysctl.xs.orig 2014-01-21 15:02:47.000000000 -0800 ++++ Sysctl.xs 2018-05-21 13:25:07.145336000 -0700 @@ -14,6 +14,7 @@ #include @@ -12,34 +12,7 @@ #include #include "bsd-sysctl.h" -+void -+_iterator_first(HV *self) -+{ -+ SV **headp; -+ int name[CTL_MAXNAME]; -+ size_t len; -+ -+ headp = hv_fetch(self, "head", 4, 0); -+ if (headp == NULL || *headp == NULL) -+ croak( "failed to fetch head in _iterator_first()\n" ); -+ -+ if (SvPOK(*headp)) { -+ /* we were given starting node */ -+ len = sizeof(name); -+ if (sysctlnametomib(SvPV_nolen(*headp), name, &len) == -1) -+ croak("sysctlnametomib(head) failed in _iterator_first\n"); -+ } else { -+ /* start at the top like sysctl -a */ -+ name[0] = 1; -+ len = 1; -+ } -+ -+ hv_store(self, "_next", 5, newSVpvn((char const *) name, len * sizeof(int)), 0); -+ hv_store(self, "_len0", 5, newSViv(len), 0); -+ hv_store(self, "_name", 5, newSVpvn("", 0), 0); -+} -+ - int +-int -_init_iterator(HV *self, int *mib, int *miblenp, int valid) { - SV **headp; - int qoid[CTL_MAXNAME]; @@ -48,7 +21,13 @@ - SV **clenp; - int cmplen; - int j; -- ++void ++_iterator_first(HV *self) ++{ ++ SV **headp; ++ int name[CTL_MAXNAME]; ++ size_t len; + - qoid[0] = 0; - qoid[1] = 2; - if (valid) { @@ -59,22 +38,79 @@ - cmplen = SvIV(*clenp); - } - else { -- headp = hv_fetch(self, "head", 4, 0); + headp = hv_fetch(self, "head", 4, 0); - if (!(headp && *headp)) { - croak( "failed to get some head in _init_iterator()\n" ); - } -- if (SvPOK(*headp)) { ++ if (headp == NULL || *headp == NULL) ++ croak( "failed to fetch head in _iterator_first()\n" ); ++ + if (SvPOK(*headp)) { - /* begin where asked */ - qoidlen = sizeof(qoid); - if (sysctlnametomib( SvPV_nolen(*headp), qoid+2, (size_t*)&qoidlen) == -1) { - warn( "_init_iterator(%s): sysctlnametomib lookup failed\n", - SvPV_nolen(*headp) - ); -- return 0; ++ /* we were given starting node */ ++ len = sizeof(name); ++ if (sysctlnametomib(SvPV_nolen(*headp), name, &len) == -1) ++ croak("sysctlnametomib(head) failed in _iterator_first\n"); ++ } else { ++ /* start at the top like sysctl -a */ ++ name[0] = 1; ++ len = 1; ++ } ++ ++ hv_store(self, "_next", 5, newSVpvn((char const *) name, len * sizeof(int)), 0); ++ hv_store(self, "_len0", 5, newSViv(len), 0); ++ hv_store(self, "_name", 5, newSVpvn("", 0), 0); ++} ++ ++int ++_iterator_next(HV *self) ++{ ++ SV *nextp, **len0p, *namep; ++ int *next, name1[CTL_MAXNAME + 2], name2[CTL_MAXNAME + 2]; ++ size_t len0, next_len, len1, len2; ++ ++ if (! hv_exists(self, "_len0", 5)) ++ _iterator_first(self); ++ ++ len0p = hv_fetch(self, "_len0", 5, 0); ++ if (len0p == NULL || *len0p == NULL) ++ croak("hv_fetch(_len0) failed in _iterator_next\n"); ++ len0 = SvIV(*len0p); ++ ++ nextp = hv_delete(self, "_next", 5, 0); ++ if (nextp == NULL) + return 0; - } - cmplen = qoidlen; - qoidlen += 2; -- } ++ next = (int *) SvPV(nextp, next_len); ++ next_len /= sizeof(int); ++ ++ namep = hv_delete(self, "_name", 5, 0); ++ if (namep == NULL) ++ return 0; ++ ++ /* ++ * Get next (after _next): name1 = [ 0, 2, next ] ++ */ ++ ++ name1[0] = 0; ++ name1[1] = 2; /* get next */ ++ memcpy((name1 + 2), next, next_len * sizeof(int)); ++ len1 = next_len + 2; ++ ++ len2 = sizeof(name2); ++ if (sysctl(name1, len1, name2, &len2, 0, 0) < 0) { ++ if (errno == ENOENT) ++ return (0); ++ ++ croak("sysctl(next) failed in _iterator_next()\n"); + } - else { - /* begin at the beginning */ - qoid[2] = 1; @@ -85,7 +121,8 @@ - SvREFCNT_inc(clen); - hv_store(self, "_len", 4, clen, 0); - } -- ++ len2 /= sizeof(int); + - /* - printf( "next: " ); - for (j = 0; j < qoidlen; ++j) { @@ -93,7 +130,11 @@ - } - printf("\n"); - */ -- ++ if (len2 < len0) ++ return 0; /* shorter than first */ ++ if (memcmp(name2, next, len0 * sizeof(int)) != 0) ++ return 0; /* does not match anymore */ + - /* load the mib */ - if (sysctl(qoid, qoidlen, mib, (size_t*)miblenp, 0, 0) == -1) { - return 0; @@ -102,84 +143,35 @@ - if (*miblenp < cmplen) { - return 0 ; - } -- ++ /* at this point, name2/len2 has next iterator, update _next here */ ++ hv_store(self, "_next", 5, newSVpvn((char const *) name2, len2 * sizeof(int)), 0); + - for (j = 0; j < cmplen; ++j) { - if (mib[j] != qoid[j+2]) { - return 0; -- } -- } -- return 1; -+_iterator_next(HV *self) -+{ -+ SV *nextp, **len0p, *namep; -+ int *next, name1[CTL_MAXNAME + 2], name2[CTL_MAXNAME + 2]; -+ size_t len0, next_len, len1, len2; ++ /* ++ * Get name (from name2): name1 = [ 0, 1, name2 ] ++ */ + -+ if (! hv_exists(self, "_len0", 5)) -+ _iterator_first(self); ++ name1[0] = 0; ++ name1[1] = 1; /* get name */ ++ memcpy((name1 + 2), name2, len2 * sizeof(int)); ++ len1 = len2 + 2; + -+ len0p = hv_fetch(self, "_len0", 5, 0); -+ if (len0p == NULL || *len0p == NULL) -+ croak("hv_fetch(_len0) failed in _iterator_next\n"); -+ len0 = SvIV(*len0p); -+ -+ nextp = hv_delete(self, "_next", 5, 0); -+ if (nextp == NULL) -+ return 0; -+ next = (int *) SvPV(nextp, next_len); -+ next_len /= sizeof(int); ++ len2 = sizeof(name2); ++ if (sysctl(name1, len1, name2, &len2, 0, 0) < 0) { ++ if (errno == ENOENT) ++ return (0); + -+ namep = hv_delete(self, "_name", 5, 0); -+ if (namep == NULL) -+ return 0; ++ croak("sysctl(name) failed in _iterator_next()\n"); + } +- } +- return 1; + -+ /* -+ * Get next (after _next): name1 = [ 0, 2, next ] -+ */ ++ /* at this point, name2/len2 has name, update _name here */ ++ hv_store(self, "_name", 5, newSVpvn((char const *) name2, len2 - 1), 0); + -+ name1[0] = 0; -+ name1[1] = 2; /* get next */ -+ memcpy((name1 + 2), next, next_len * sizeof(int)); -+ len1 = next_len + 2; -+ -+ len2 = sizeof(name2); -+ if (sysctl(name1, len1, name2, &len2, 0, 0) < 0) { -+ if (errno == ENOENT) -+ return (0); -+ -+ croak("sysctl(next) failed in _iterator_next()\n"); -+ } -+ len2 /= sizeof(int); -+ -+ if (len2 < len0) -+ return 0; /* shorter than first */ -+ if (memcmp(name2, next, len0 * sizeof(int)) != 0) -+ return 0; /* does not match anymore */ -+ -+ /* at this point, name2/len2 has next iterator, update _next here */ -+ hv_store(self, "_next", 5, newSVpvn((char const *) name2, len2 * sizeof(int)), 0); -+ -+ /* -+ * Get name (from name2): name1 = [ 0, 1, name2 ] -+ */ -+ -+ name1[0] = 0; -+ name1[1] = 1; /* get name */ -+ memcpy((name1 + 2), name2, len2 * sizeof(int)); -+ len1 = len2 + 2; -+ -+ len2 = sizeof(name2); -+ if (sysctl(name1, len1, name2, &len2, 0, 0) < 0) { -+ if (errno == ENOENT) -+ return (0); -+ -+ croak("sysctl(name) failed in _iterator_next()\n"); -+ } -+ -+ /* at this point, name2/len2 has name, update _name here */ -+ hv_store(self, "_name", 5, newSVpvn((char const *) name2, len2 - 1), 0); -+ -+ return 1; ++ return 1; } +/* @@ -216,9 +208,10 @@ - p = (int *)SvPVX(*ctxp); - miblen = *p++; - memcpy(mib, p, miblen * sizeof(int)); -- + - if (!_init_iterator(self, mib, (int*)&miblen, 1)) { -- XSRETURN_UNDEF; ++ if (_iterator_next(self) == 0) + XSRETURN_UNDEF; - } - } - else { @@ -257,17 +250,158 @@ - ctx = newSVpvn((const char *)qoid, (miblen+1) * sizeof(int)); - SvREFCNT_inc(ctx); - hv_store(self, "_ctx", 4, ctx, 0); +- ++ ++ namep = hv_fetch(self, "_name", 5, 0); ++ SvREFCNT_inc(*namep); ++ RETVAL = *namep; + OUTPUT: + RETVAL -+ if (_iterator_next(self) == 0) -+ XSRETURN_UNDEF; -+ -+ namep = hv_fetch(self, "_name", 5, 0); -+ SvREFCNT_inc(*namep); -+ RETVAL = *namep; +@@ -235,6 +223,10 @@ + case 'A': + fmt_type = FMT_A; + break; ++ case 'C': ++ ++f; ++ fmt_type = *f == 'U' ? FMT_UINT8 : FMT_INT8; ++ break; + case 'I': + ++f; + fmt_type = *f == 'U' ? FMT_UINT : FMT_INT; +@@ -339,6 +331,21 @@ OUTPUT: RETVAL -@@ -583,25 +571,79 @@ ++#define DECODE(T) \ ++ if (buflen == sizeof(T)) { \ ++ RETVAL = newSViv(*(T *)buf); \ ++ } \ ++ else { \ ++ AV *c = (AV *)sv_2mortal((SV *)newAV()); \ ++ char *bptr = buf; \ ++ while (buflen >= sizeof(T)) { \ ++ av_push(c, newSViv(*(T *)bptr)); \ ++ buflen -= sizeof(T); \ ++ bptr += sizeof(T); \ ++ } \ ++ RETVAL = newRV((SV *)c); \ ++ } ++ + SV * + _mib_lookup(const char *arg) + INIT: +@@ -398,96 +405,31 @@ + SvCUR_set(sv_buf, buflen); + RETVAL = sv_buf; + break; ++ case FMT_INT8: ++ DECODE(int8_t); ++ break; ++ case FMT_UINT8: ++ DECODE(uint8_t); ++ break; + case FMT_INT: +- if (buflen == sizeof(int)) { +- RETVAL = newSViv(*(int *)buf); +- } +- else { +- AV *c = (AV *)sv_2mortal((SV *)newAV()); +- char *bptr = buf; +- while (buflen >= sizeof(int)) { +- av_push(c, newSViv(*(int *)bptr)); +- buflen -= sizeof(int); +- bptr += sizeof(int); +- } +- RETVAL = newRV((SV *)c); +- } ++ DECODE(int); + break; + case FMT_UINT: +- if (buflen == sizeof(unsigned int)) { +- RETVAL = newSViv(*(unsigned int *)buf); +- } +- else { +- AV *c = (AV *)sv_2mortal((SV *)newAV()); +- char *bptr = buf; +- while (buflen >= sizeof(unsigned int)) { +- av_push(c, newSViv(*(unsigned int *)bptr)); +- buflen -= sizeof(unsigned int); +- bptr += sizeof(unsigned int); +- } +- RETVAL = newRV((SV *)c); +- } ++ DECODE(unsigned int); + break; + case FMT_LONG: +- if (buflen == sizeof(long)) { +- RETVAL = newSVuv(*(long *)buf); +- } +- else { +- AV *c = (AV *)sv_2mortal((SV *)newAV()); +- char *bptr = buf; +- while (buflen >= sizeof(long)) { +- av_push(c, newSVuv(*(long *)bptr)); +- buflen -= sizeof(long); +- bptr += sizeof(long); +- } +- RETVAL = newRV((SV *)c); +- } ++ DECODE(long); + break; + case FMT_ULONG: +- if (buflen == sizeof(unsigned long)) { +- RETVAL = newSVuv(*(unsigned long *)buf); +- } +- else { +- AV *c = (AV *)sv_2mortal((SV *)newAV()); +- char *bptr = buf; +- while (buflen >= sizeof(unsigned long)) { +- av_push(c, newSVuv(*(unsigned long *)bptr)); +- buflen -= sizeof(unsigned long); +- bptr += sizeof(unsigned long); +- } +- RETVAL = newRV((SV *)c); +- } ++ DECODE(unsigned long); + break; + case FMT_64: +- if (buflen == sizeof(int64_t)) { +- RETVAL = newSVuv(*(int64_t *)buf); +- } +- else { +- AV *c = (AV *)sv_2mortal((SV *)newAV()); +- char *bptr = buf; +- while (buflen >= sizeof(int64_t)) { +- av_push(c, newSVuv(*(int64_t *)bptr)); +- buflen -= sizeof(int64_t); +- bptr += sizeof(int64_t); +- } +- RETVAL = newRV((SV *)c); +- } ++ DECODE(int64_t); + break; + case FMT_U64: +- if (buflen == sizeof(uint64_t)) { +- RETVAL = newSVuv(*(uint64_t *)buf); +- } +- else { +- AV *c = (AV *)sv_2mortal((SV *)newAV()); +- char *bptr = buf; +- while (buflen >= sizeof(uint64_t)) { +- av_push(c, newSVuv(*(uint64_t *)bptr)); +- buflen -= sizeof(uint64_t); +- bptr += sizeof(uint64_t); +- } +- RETVAL = newRV((SV *)c); +- } ++ DECODE(uint64_t); + break; ++#undef DECODE + case FMT_CLOCKINFO: { + HV *c = (HV *)sv_2mortal((SV *)newHV()); + struct clockinfo *inf = (struct clockinfo *)buf; +@@ -583,25 +525,79 @@ } case FMT_DEVSTAT: { HV *c = (HV *)sv_2mortal((SV *)newHV()); @@ -362,7 +496,7 @@ break; } #if __FreeBSD_version >= 500000 -@@ -878,6 +920,10 @@ +@@ -878,6 +874,12 @@ SV **oidp; SV *oid; char *oid_data; @@ -370,14 +504,43 @@ + long long llval; + uint64_t uint64val; + unsigned long long ullval; ++ int8_t int8val; ++ uint8_t uint8val; int oid_fmt; int oid_len; int intval; -@@ -955,6 +1001,42 @@ - newval = &ulongval; - newsize = sizeof(ulongval); +@@ -936,6 +938,26 @@ + newsize = sizeof(uintval); break; + ++ case FMT_INT8: ++ int8val = (int8_t)strtol(value, &endconvptr, 0); ++ if (endconvptr == value || *endconvptr != '\0') { ++ warn("invalid integer: '%s'", value); ++ XSRETURN_UNDEF; ++ } ++ newval = &int8val; ++ newsize = sizeof(int8val); ++ break; + ++ case FMT_UINT8: ++ uint8val = (uint8_t)strtoul(value, &endconvptr, 0); ++ if (endconvptr == value || *endconvptr != '\0') { ++ warn("invalid unsigned integer: '%s'", value); ++ XSRETURN_UNDEF; ++ } ++ newval = &uint8val; ++ newsize = sizeof(uint8val); ++ break; ++ + case FMT_LONG: + longval = strtol(value, &endconvptr, 0); + if (endconvptr == value || *endconvptr != '\0') { +@@ -954,6 +976,41 @@ + } + newval = &ulongval; + newsize = sizeof(ulongval); ++ break; + case FMT_64: + llval = strtoll(value, &endconvptr, 0); + if (endconvptr == value || *endconvptr != '\0' || @@ -412,7 +575,6 @@ + uint64val = (uint64_t)ullval; + newval = &uint64val; + newsize = sizeof(uint64val); -+ break; + break; } - if (sysctl((int *)oid_data, oid_len, 0, 0, newval, newsize) == -1) {