=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/kstat/kstat.c,v retrieving revision 1.12 retrieving revision 1.13 diff -c -r1.12 -r1.13 *** src/usr.bin/kstat/kstat.c 2023/11/16 02:45:54 1.12 --- src/usr.bin/kstat/kstat.c 2023/11/16 03:17:34 1.13 *************** *** 1,4 **** ! /* $OpenBSD: kstat.c,v 1.12 2023/11/16 02:45:54 dlg Exp $ */ /* * Copyright (c) 2020 David Gwynne --- 1,4 ---- ! /* $OpenBSD: kstat.c,v 1.13 2023/11/16 03:17:34 dlg Exp $ */ /* * Copyright (c) 2020 David Gwynne *************** *** 193,198 **** --- 193,199 ---- err(1, "kstat version"); kstat_list(&kt, fd, version, &kfs); + kstat_read(&kt, fd); kstat_print(&kt); if (wait == 0) *************** *** 516,522 **** { struct kstat_entry *kse; struct kstat_req *ksreq; - size_t len; uint64_t id = 0; for (;;) { --- 517,522 ---- *************** *** 529,547 **** ksreq->ks_version = version; ksreq->ks_id = ++id; - ksreq->ks_datalen = len = 64; /* magic */ - ksreq->ks_data = malloc(len); - if (ksreq->ks_data == NULL) - err(1, "data alloc"); - if (ioctl(fd, KSTATIOC_NFIND_ID, ksreq) == -1) { if (errno == ENOENT) { free(ksreq->ks_data); free(kse); break; } - - kse->serrno = errno; } else id = ksreq->ks_id; --- 529,540 ---- *************** *** 554,571 **** if (RBT_INSERT(kstat_tree, kt, kse) != NULL) errx(1, "duplicate kstat entry"); ! if (kse->serrno != 0) ! continue; ! ! while (ksreq->ks_datalen > len) { ! len = ksreq->ks_datalen; ! ksreq->ks_data = realloc(ksreq->ks_data, len); ! if (ksreq->ks_data == NULL) ! err(1, "data resize (%zu)", len); ! ! if (ioctl(fd, KSTATIOC_FIND_ID, ksreq) == -1) ! err(1, "find id %llu", ksreq->ks_id); ! } } } --- 547,555 ---- if (RBT_INSERT(kstat_tree, kt, kse) != NULL) errx(1, "duplicate kstat entry"); ! ksreq->ks_data = malloc(ksreq->ks_datalen); ! if (ksreq->ks_data == NULL) ! err(1, "kstat data alloc"); } } *************** *** 581,587 **** ksreq->ks_provider, ksreq->ks_instance, ksreq->ks_name, ksreq->ks_unit); if (kse->serrno != 0) { ! printf("\t%s\n", strerror(kse->serrno)); continue; } switch (ksreq->ks_type) { --- 565,572 ---- ksreq->ks_provider, ksreq->ks_instance, ksreq->ks_name, ksreq->ks_unit); if (kse->serrno != 0) { ! printf("\tkstat read error: %s\n", ! strerror(kse->serrno)); continue; } switch (ksreq->ks_type) { *************** *** 607,615 **** struct kstat_req *ksreq; RBT_FOREACH(kse, kstat_tree, kt) { ksreq = &kse->kstat; if (ioctl(fd, KSTATIOC_FIND_ID, ksreq) == -1) ! err(1, "update id %llu", ksreq->ks_id); } } --- 592,601 ---- struct kstat_req *ksreq; RBT_FOREACH(kse, kstat_tree, kt) { + kse->serrno = 0; ksreq = &kse->kstat; if (ioctl(fd, KSTATIOC_FIND_ID, ksreq) == -1) ! kse->serrno = errno; } }