pkgsrc-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: pkg/33444: sysutils/gkrellm fails to build after recent I/O stats changes



The following reply was made to PR pkg/33444; it has been noted by GNATS.

From: Anthony Mallet <anthony.mallet%useless-ficus.net@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc: 
Subject: Re: pkg/33444: sysutils/gkrellm fails to build after recent I/O stats 
changes
Date: Tue, 23 May 2006 22:33:58 +0200

 --zsGcSz7Pyn
 Content-Type: text/plain; charset=us-ascii
 Content-Description: message body text
 Content-Transfer-Encoding: 7bit
 
 Hi,
 
 Here is the fix I wrote when I encountered the same problem.
 This is a new version of patch-ab which integrates the necessary
 changes. I don't send a diff against previous patch-ab file since I find
 diff of diff rather difficult to read...
 
 Regards,
 -- Anthony
 
 --zsGcSz7Pyn
 Content-Type: text/plain
 Content-Disposition: inline;
        filename="patch-ab"
 Content-Transfer-Encoding: 7bit
 
 --- src/sysdeps/netbsd.c.orig  2006-03-30 00:23:37.000000000 +0200
 +++ src/sysdeps/netbsd.c       2006-05-16 12:21:31.000000000 +0200
 @@ -63,7 +63,8 @@
  {
     static int mib[] = { CTL_KERN, KERN_CP_TIME };
     u_int64_t cp_time[ncpus][CPUSTATES];
 -   int len, n;
 +   int n;
 +   size_t len;
  
     if (ncpus > 1) {
         len = sizeof(cp_time[0]);
 @@ -94,7 +95,7 @@
  {
        static int mib[] = { CTL_HW, HW_NCPU };
        int ncpus;
 -      int len = sizeof(int);
 +      size_t len = sizeof(int);
  
        if (sysctl(mib, 2, &ncpus, &len, NULL, 0) < 0)
                return 1;
 @@ -109,41 +110,35 @@
  #include <sys/proc.h>
  #include <sys/sysctl.h>
  #include <uvm/uvm_extern.h>
 -#include <kvm.h>
  
  #include <utmp.h>
  
 -static struct nlist nl[] = {
 -#define X_UVM_EXP    0
 -   { "_uvmexp" },
 -   { NULL }
 -};
 -
 -extern        kvm_t   *kvmd;
 -
  void
  gkrellm_sys_proc_read_data(void)
  {
 -   static int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL };
 +   int mib[6];
     double avenrun;
 -      guint   n_forks = 0, n_processes = 0;
 -   struct uvmexp *uvmexp;
 -   int len, i;
 -
 -   if (sysctl(mib, 3, NULL, &len, NULL, 0) >= 0) {
 -      n_processes = len / sizeof(struct kinfo_proc);
 +   guint n_forks = 0, n_processes = 0;
 +   struct uvmexp_sysctl uvmexp;
 +   size_t size;
 +
 +   mib[0] = CTL_KERN;
 +   mib[1] = KERN_PROC2;
 +   mib[2] = KERN_PROC_ALL;
 +   mib[3] = 0;
 +   mib[4] = sizeof(struct kinfo_proc2);
 +   mib[5] = 0;
 +   if (sysctl(mib, 6, NULL, &size, NULL, 0) >= 0) {
 +      n_processes = size / sizeof(struct kinfo_proc2);
     }
  
 -   /* get name list if it is not done yet */
 -   if (kvmd == NULL) return;
 -   if (nl[0].n_type == 0) kvm_nlist(kvmd, nl);
 -
 -   if (nl[0].n_type != 0) {
 -      uvmexp = (struct uvmexp *)nl[X_UVM_EXP].n_value;
 -      if (kvm_read(kvmd, (u_long)&uvmexp->forks, &i, sizeof(i)) == sizeof(i))
 -       n_forks = i;
 +   mib[0] = CTL_VM;
 +   mib[1] = VM_UVMEXP2;
 +   size = sizeof(uvmexp);
 +   if (sysctl(mib, 2, &uvmexp, &size, NULL, 0) >= 0) {
 +      n_forks = uvmexp.forks;
     }
 -
 + 
     if (getloadavg(&avenrun, 1) <= 0)
                avenrun = 0;
        gkrellm_proc_assign_data(n_processes, 0, n_forks, avenrun);
 @@ -183,6 +178,96 @@
  
  
  /* ===================================================================== */
 +/* Memory/Swap monitor interface */
 +
 +#include <sys/vmmeter.h>
 +#include <sys/sysctl.h>
 +#include <uvm/uvm_extern.h>
 +
 +
 +void
 +gkrellm_sys_mem_read_data(void)
 +{
 +   int mib[2];
 +   guint64 total, used, free, shared, buffers, cached;
 +   struct vmtotal vmt;
 +   struct uvmexp_sysctl uvmexp;
 +   size_t len;
 +
 +   mib[0] = CTL_VM;
 +   mib[1] = VM_METER;
 +   len = sizeof(vmt);
 +   if (sysctl(mib, 2, &vmt, &len, NULL, 0) < 0)
 +      memset(&vmt, 0, sizeof(vmt));
 +
 +   mib[0] = CTL_VM;
 +   mib[1] = VM_UVMEXP2;
 +   len = sizeof(uvmexp);
 +   if (sysctl(mib, 2, &uvmexp, &len, NULL, 0) < 0)
 +      memset(&uvmexp, 0, sizeof(uvmexp));
 +
 +   total = uvmexp.npages << uvmexp.pageshift;
 +
 +   /* not sure of what must be computed */
 +   free = (uvmexp.inactive + uvmexp.free) << uvmexp.pageshift;
 +   shared = vmt.t_rmshr << uvmexp.pageshift;
 +
 +   /* can't use "uvmexp.active << uvmexp.pageshift" here because the
 +    * display for "free" uses "total - used" which is very wrong. */
 +   used = total - free;
 +
 +   /* don't know how to get those values */
 +   buffers = 0;
 +   cached = 0;
 +
 +   gkrellm_mem_assign_data(total, used, free, shared, buffers, cached);
 +
 +}
 +
 +void
 +gkrellm_sys_swap_read_data(void)
 +{
 +   static int pgout, pgin;
 +   int mib[2];
 +   struct uvmexp_sysctl uvmexp;
 +   size_t len;
 +   static gulong swapin = 0, swapout = 0;
 +   guint64 swap_total, swap_used;
 +
 +   mib[0] = CTL_VM;
 +   mib[1] = VM_UVMEXP2;
 +   len = sizeof(uvmexp);
 +   if (sysctl(mib, 2, &uvmexp, &len, NULL, 0) < 0)
 +      memset(&uvmexp, 0, sizeof(uvmexp));
 +
 +   /* show only the pages located on the disk and not in memory */
 +   swap_total = (guint64) (uvmexp.swpages << uvmexp.pageshift);
 +   swap_used = (guint64) (uvmexp.swpgonly << uvmexp.pageshift);
 +
 +   /* For page in/out operations, uvmexp struct doesn't seem to be reliable */
 +
 +   /* if the number of swapped pages that are in memory (inuse - only) is
 +    * greater that the previous value (pgin), we count this a "page in" */
 +   if (uvmexp.swpginuse - uvmexp.swpgonly > pgin)
 +      swapin += uvmexp.swpginuse - uvmexp.swpgonly - pgin;
 +   pgin = uvmexp.swpginuse - uvmexp.swpgonly;
 +
 +   /* same for page out */
 +   if (uvmexp.swpgonly > pgout)
 +      swapout += uvmexp.swpgonly - pgout;
 +   pgout = uvmexp.swpgonly;
 +
 +   gkrellm_swap_assign_data(swap_total, swap_used, swapin, swapout);
 +}
 +
 +gboolean
 +gkrellm_sys_mem_init(void)
 +      {
 +      return TRUE;
 +      }
 +
 +
 +/* ===================================================================== */
  /* Sensor monitor interface */
  
    /* Tables of voltage correction factors and offsets derived from the
 @@ -295,7 +380,7 @@
     int fd;                    /* file desc. for /dev/sysmon */
     int id = 0;                        /* incremented for each sensor */
     int type;
 -   char *s, base_name[32];
 +   char *s, base_name[33];
     gboolean   found_sensors = FALSE;
  
     /* check if some sensor is configured */
 @@ -336,3 +421,169 @@
     return found_sensors;
  }
  
 +
 +/* ===================================================================== */
 +/* Disk monitor interface */
 +
 +#ifdef HW_DISKSTATS
 +# include <sys/dkstat.h>
 +# include <sys/disk.h>
 +#else
 +# include <sys/iostat.h>
 +#endif
 +
 +gboolean
 +gkrellm_sys_disk_init(void)
 +{
 +#ifdef HW_DISKSTATS
 +      int mib[3] = { CTL_HW, HW_DISKSTATS, sizeof(struct disk_sysctl) };
 +#else
 +      int mib[3] = { CTL_HW, HW_IOSTATS, sizeof(struct io_sysctl) };
 +#endif
 +      size_t size;
 +
 +      /* Just test if the sysctl call works */
 +      if (sysctl(mib, 3, NULL, &size, NULL, 0) == -1)
 +              return (FALSE);
 +
 +      return (TRUE);
 +}
 +
 +void
 +gkrellm_sys_disk_read_data(void)
 +{
 +      int i, n_disks;
 +#ifdef HW_DISKSTATS
 +      int mib[3] = { CTL_HW, HW_DISKSTATS, sizeof(struct disk_sysctl) };
 +      struct disk_sysctl *dk_drives;
 +#else
 +      int mib[3] = { CTL_HW, HW_IOSTATS, sizeof(struct io_sysctl) };
 +      struct io_sysctl *dk_drives;
 +#endif
 +      size_t size;
 +      guint64 rbytes, wbytes;
 +
 +      if (sysctl(mib, 3, NULL, &size, NULL, 0) == -1)
 +              return;
 +      dk_drives = malloc(size);
 +      if (dk_drives == NULL)
 +              return;
 +      n_disks = size / sizeof(dk_drives[0]);
 +      if (sysctl(mib, 3, dk_drives, &size, NULL, 0) == -1)
 +              return;
 +
 +      for (i = 0; i < n_disks; i++) {
 +#ifdef HW_DISKSTATS
 +# if __NetBSD_Version__ >= 106110000
 +              rbytes = dk_drives[i].dk_rbytes;
 +              wbytes = dk_drives[i].dk_wbytes;
 +# else
 +              rbytes = dk_drives[i].dk_bytes;
 +              wbytes = 0;
 +# endif
 +              gkrellm_disk_assign_data_by_name(dk_drives[i].dk_name, rbytes, 
wbytes, FALSE);
 +#else
 +              rbytes = dk_drives[i].rbytes;
 +              wbytes = dk_drives[i].wbytes;
 +              gkrellm_disk_assign_data_by_name(dk_drives[i].name, rbytes, 
wbytes, FALSE);
 +#endif
 +
 +
 +      }
 +
 +      free(dk_drives);
 +}
 +
 +gchar *
 +gkrellm_sys_disk_name_from_device(gint device_number, gint unit_number,
 +                      gint *order)
 +      {
 +      return NULL;    /* disk data by device not implemented */
 +      }
 +
 +gint
 +gkrellm_sys_disk_order_from_name(gchar *name)
 +      {
 +      return -1;  /* append disk charts as added */
 +      }
 +
 +#if __NetBSD_Version__ >= 399000100
 +
 +#include "../inet.h"
 +
 +#include <errno.h>
 +#include <sys/socket.h>
 +#include <netinet/in.h>
 +#include <netinet/tcp_fsm.h>
 +
 +static const struct gkrellm_inet_fam {
 +      sa_family_t family;
 +      const char *mib;
 +} families[] = { {AF_INET, "net.inet.tcp.pcblist"},
 +#ifdef INET6
 +    {AF_INET6, "net.inet6.tcp6.pcblist"},
 +#endif
 +    {0, NULL} };
 +
 +void
 +gkrellm_sys_inet_read_tcp_data()
 +{
 +      ActiveTCP tcp;
 +      int mib[CTL_MAXNAME], i;
 +      size_t sz;
 +      u_int namelen;
 +      struct kinfo_pcb *pcbt = NULL;
 +      const struct gkrellm_inet_fam *pf = families;
 +
 +      while (pf->mib != NULL) {
 +              sz = CTL_MAXNAME;
 +              if (sysctlnametomib(pf->mib, mib, &sz) == -1)
 +                      return;
 +              namelen = sz;
 +
 +              mib[namelen++] = PCB_ALL;
 +              mib[namelen++] = 0;
 +              mib[namelen++] = sizeof(struct kinfo_pcb);
 +              mib[namelen++] = INT_MAX;
 +
 +              sz = 0;
 +              pcbt = NULL;
 +              if (sysctl(&mib[0], namelen, pcbt, &sz, NULL, 0) == -1)
 +                      return;
 +              pcbt = malloc(sz);
 +              if (pcbt == NULL)
 +                      return;
 +              if (sysctl(&mib[0], namelen, pcbt, &sz, NULL, 0) == -1)
 +                      return;
 +
 +              sz /= sizeof(struct kinfo_pcb);
 +              for (i = 0; i < sz; i++) {
 +                      tcp.family = pf->family;
 +                      if (pf->family == AF_INET) {
 +                              struct sockaddr_in *sin =
 +                                  (struct sockaddr_in *)&pcbt[i].ki_dst;
 +                              tcp.remote_addr.s_addr = sin->sin_addr.s_addr;
 +                              tcp.remote_port = sin->sin_port;
 +
 +                              sin = (struct sockaddr_in *)&pcbt[i].ki_src;
 +                              tcp.local_port = sin->sin_port;
 +#ifdef INET6
 +                      } else { /* AF_INET6 */
 +                              struct sockaddr_in6 *sin =
 +                                  (struct sockaddr_in6 *)&pcbt[i].ki_dst;
 +                              memcpy(&tcp.remote_addr6, &sin->sin6_addr,
 +                                  sizeof(struct in6_addr));
 +                              tcp.remote_port = sin->sin6_port;
 +
 +                              sin = (struct sockaddr_in6 *)&pcbt[i].ki_src;
 +                              tcp.local_port = sin->sin6_port;
 +#endif
 +                      }
 +                      if (pcbt[i].ki_tstate == TCPS_ESTABLISHED)
 +                              gkrellm_inet_log_tcp_port_data(&tcp);
 +              }
 +              free(pcbt);
 +              pf++;
 +      }
 +}
 +#endif
 
 --zsGcSz7Pyn--
 



Home | Main Index | Thread Index | Old Index