ports/139599: sysutils/p5-BSD-Sysctl can not handle QUAD integer.
KOIE Hidetaka
koie at suri.co.jp
Wed Oct 14 12:30:05 UTC 2009
>Number: 139599
>Category: ports
>Synopsis: sysutils/p5-BSD-Sysctl can not handle QUAD integer.
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Wed Oct 14 12:30:04 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator: KOIE Hidetaka
>Release: FreeBSD 9.0-CURRENT amd64
>Organization:
surigiken
>Environment:
FreeBSD guriandgura 9.0-CURRENT FreeBSD 9.0-CURRENT #0: Mon Oct 5 16:49:42 JST 2009 koie at guriandgura:/
usr/obj/usr/src/sys/GURIANDGURA amd64
>Description:
I'm trying to get values under kstat.zfs.
But print sysctl('kstat.zfs.misc.arcstats.c') shows empty.
>How-To-Repeat:
use BSD::Sysctl 'sysctl';
print sysctl('kstat.zfs.misc.arcstats.c');
>Fix:
Implement 'Q'/QUAD like this patch.
I don't know perl and this patch was written by imitation.
I tested this patch on amd64.
I supposed this patch does not work on i386,
because newSVuv() generates 32bit integer.
Patch attached with submission follows:
diff -rpu work/BSD-Sysctl-0.09/Makefile.PL work.koie/BSD-Sysctl-0.09/Makefile.PL
--- work/BSD-Sysctl-0.09/Makefile.PL 2009-09-15 04:50:42.000000000 +0900
+++ work.koie/BSD-Sysctl-0.09/Makefile.PL 2009-10-14 19:50:03.417268572 +0900
@@ -117,3 +117,4 @@ S,vmtotal 22 auto
S,xinpcb 23 auto
S,xvfsconf 24 auto
T,struct_cdev 25 auto
+Q 26 FMT_QUAD
diff -rpu work/BSD-Sysctl-0.09/Sysctl.pm work.koie/BSD-Sysctl-0.09/Sysctl.pm
--- work/BSD-Sysctl-0.09/Sysctl.pm 2009-09-15 02:55:20.000000000 +0900
+++ work.koie/BSD-Sysctl-0.09/Sysctl.pm 2009-10-14 19:50:26.978236337 +0900
@@ -40,6 +40,7 @@ use constant FMT_VMTOTAL => 22;
use constant FMT_XINPCB => 23;
use constant FMT_XVFSCONF => 24;
use constant FMT_STRUCT_CDEV => 25;
+use constant FMT_QUAD => 26;
push @EXPORT_OK, 'sysctl';
sub sysctl {
diff -rpu work/BSD-Sysctl-0.09/Sysctl.xs work.koie/BSD-Sysctl-0.09/Sysctl.xs
--- work/BSD-Sysctl-0.09/Sysctl.xs 2009-09-15 05:08:40.000000000 +0900
+++ work.koie/BSD-Sysctl-0.09/Sysctl.xs 2009-10-14 20:06:33.161933261 +0900
@@ -241,6 +241,9 @@ _mib_info(const char *arg)
++f;
fmt_type = *f == 'U' ? FMT_ULONG : FMT_LONG;
break;
+ case 'Q':
+ fmt_type = FMT_QUAD;
+ break;
case 'S': {
if (strcmp(f,"S,clockinfo") == 0) { fmt_type = FMT_CLOCKINFO; }
else if (strcmp(f,"S,loadavg") == 0) { fmt_type = FMT_LOADAVG; }
@@ -452,6 +455,21 @@ _mib_lookup(const char *arg)
RETVAL = newRV((SV *)c);
}
break;
+ case FMT_QUAD:
+ 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);
+ }
+ break;
case FMT_CLOCKINFO: {
HV *c = (HV *)sv_2mortal((SV *)newHV());
struct clockinfo *inf = (struct clockinfo *)buf;
@@ -845,6 +863,7 @@ _mib_set(const char *arg, const char *va
unsigned int uintval;
long longval;
unsigned long ulongval;
+ long long longlongval;
void *newval = 0;
size_t newsize = 0;
char *endconvptr;
@@ -916,6 +935,16 @@ _mib_set(const char *arg, const char *va
newval = &ulongval;
newsize = sizeof(ulongval);
break;
+
+ case FMT_QUAD:
+ longlongval = strtoll(value, &endconvptr, 0);
+ if (endconvptr == value || *endconvptr != '\0') {
+ warn("invalid long long integer: '%s'", value);
+ XSRETURN_UNDEF;
+ }
+ newval = &longlongval;
+ newsize = sizeof(longlongval);
+ break;
}
if (sysctl((int *)oid_data, oid_len, 0, 0, newval, newsize) == -1) {
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list