monit-dev
[Top][All Lists]
Advanced

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

Re: OpenBSD patches for monit 3.2


From: Jan-Henrik Haukeland
Subject: Re: OpenBSD patches for monit 3.2
Date: 05 Jun 2003 18:01:25 +0200
User-agent: Gnus/5.0808 (Gnus v5.8.8) XEmacs/21.4 (Civil Service)

Got this from the OpenBSD project. This is more or less your domain
Christian and I think it's should be up to you if you want to include
it. 

Margarida, thanks for the patch! If Christian decide to include it
into our CVS repository we may also need your help in the future if we
do any changes to this particulary part of the codebase, because I do
not think any of us use OpenBSD (I may be wrong :)

Cheers! 


Margarida Sequeira <address@hidden> writes:

> Hello,
> 
> I'm the current maintainer for the monit port on OpenBSD, for the last
> monit release i noticed you divided sysdep.c into specific arches.
> I'm attaching patches OpenBSD specific, in case you want to integrate
> it..
> Basically i copied sysdep_FREEBSD.c and changed what was needed to
> function on OpenBSD as well as configure.
> 
> Thanks in advance and hoping to hear soon from you.
> 
> Margarida
> 
> $OpenBSD: patch-configure,v 1.2 2002/12/26 00:45:55 margarida Exp $
> --- configure.orig    Sun Jun  1 23:44:11 2003
> +++ configure Sun Jun  1 23:45:29 2003
> @@ -5311,6 +5311,11 @@ elif test `uname` = "HP-UX"
>  then
>     ARCH="HPUX"
>     CFLAGS="$CFLAGS -D _REENTRANT"
> +elif test `uname` = "OpenBSD"
> +then
> +   ARCH="OPENBSD"
> +   CFLAGS="$CFLAGS -D _REENTRANT"
> +   test_kvm="true"
>  elif test `uname` = "FreeBSD"
>  then
>     ARCH="FREEBSD"
> 
> $OpenBSD$
> --- process/sysdep_OPENBSD.c.orig     Sun Jun  1 23:39:00 2003
> +++ process/sysdep_OPENBSD.c  Sun Jun  1 23:36:23 2003
> @@ -0,0 +1,331 @@
> +/*
> + * Copyright (C), 2000-2003 by Contributors to the monit codebase. 
> + * All Rights Reserved.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of the
> + * License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * General Public License for more details.
> + * 
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software Foundation,
> + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> + */
> +
> +
> +#include <config.h>
> +
> +#ifdef HAVE_SYS_TYPES_H
> +#include <sys/types.h>
> +#endif
> +
> +#include <unistd.h>
> +
> +#ifdef HAVE_SYS_STAT_H
> +#include <sys/stat.h>
> +#endif
> +
> +#ifdef HAVE_FCNTL_H
> +#include <fcntl.h>
> +#endif
> +
> +#ifdef HAVE_STDLIB_H
> +#include <stdlib.h>
> +#endif
> +
> +#ifdef TIME_WITH_SYS_TIME
> +#include <time.h>
> +
> +#ifdef HAVE_SYS_TIME_H
> +#include <sys/time.h>
> +#endif
> +#else
> +#include <time.h>
> +#endif
> +
> +#ifdef HAVE_STRING_H
> +#include <string.h>
> +#endif
> +
> +#include <stdio.h>
> +#include <kvm.h>
> +#include <sys/param.h>
> +#include <sys/proc.h>
> +#include <sys/resource.h>
> +#include <sys/resourcevar.h>
> +#include <sys/lock.h>
> +#include <sys/user.h>
> +#include <uvm/uvm.h>
> +#include <uvm/uvm_object.h>
> +#include <uvm/uvm_pmap.h>
> +#include <machine/pmap.h>
> +#include <machine/vmparam.h>
> +#include <uvm/uvm_map.h>
> +#include <sys/vmmeter.h>
> +#include <sys/sysctl.h>
> +
> +#include "process.h"
> +#include "sysdep.h"
> +
> +/**
> + *  System dependent resource gathering code for FreeBSD.
> + *
> + *  @author Jan-Henrik Haukeland, <address@hidden>
> + *  @author Christian Hopp <address@hidden>
> + *  @author Rory Toma <address@hidden>
> + *
> + *  @version \$Id: sysdep_FREEBSD.c,v 1.2 2003/02/11 21:27:40 martinp Exp $
> + *
> + *  @file
> + */
> +
> +#define pagetok(size) ((size) << pageshift)
> +#define tv2sec(tv) (((u_int64_t) tv.tv_sec * 1000000) + (u_int64_t) 
> tv.tv_usec)
> +
> +static int pageshift;
> +static long mem_kbyte_max;
> +
> +#ifndef LOG1024
> +#define LOG1024         10
> +#endif
> +
> +static kvm_t * kvm_handle;
> +
> +static void calcru(struct proc *p, struct timeval *up, struct timeval *sp,
> +                struct timeval *ip)
> +{
> +  quad_t totusec;
> +  u_quad_t u, st, ut, it, tot;
> +#if (__FreeBSD_version < 300003)
> +  long sec, usec;
> +#endif 
> +  
> +  st = p->p_sticks;
> +  ut = p->p_uticks;
> +  it = p->p_iticks;
> +  
> +  tot = st + ut + it;
> +  if (tot == 0)
> +    {
> +      st = 1;
> +      tot = 1;
> +    }
> +  
> +#if (defined __FreeBSD__) && (__FreeBSD_version >= 300003)
> +  totusec = (u_quad_t) p->p_runtime;
> +#else
> +  sec = p->p_rtime.tv_usec;
> +  usec = p->p_rtime.tv_usec;
> +  
> +  totusec = (quad_t)sec * 1000000 + usec;
> +#endif
> +  
> +  if(totusec < 0)
> +    {
> +      fprintf (stderr, "calcru: negative time: %ld usec\n",
> +            (long)totusec);
> +      totusec = 0;
> +    }
> +  
> +  u = totusec;
> +  st = (u * st) / tot;
> +  sp->tv_sec = st / 1000000;
> +  sp->tv_usec = st % 1000000;
> +  ut = (u * ut) / tot;
> +  up->tv_sec = ut / 1000000;
> +  up->tv_usec = ut % 1000000;
> +  
> +  if(ip != NULL)
> +    {
> +      it = (u * it) / tot;
> +      ip->tv_sec = it / 1000000;
> +      ip->tv_usec = it % 1000000;
> +    }
> +}
> +
> +int init_process_info_sysdep(void) {
> +
> +  register int pagesize;
> +  struct uvmexp vmm;
> +  int mib[2];
> +  size_t len;
> +  
> +  struct nlist nlst [] = {
> +      { "_bufspace"},
> +      { "_cnt" },
> +      { 0 }
> +  };
> +
> +  if(getuid()!=0) {
> +
> +    return FALSE;
> +
> +  }
> +
> +  mib[0] = CTL_HW;
> +  mib[1] = HW_NCPU;
> +  len = sizeof(num_cpus);
> +  sysctl(mib, 2, &num_cpus, &len, NULL, 0);
> +
> +  kvm_handle = kvm_open(NULL, NULL, NULL, O_RDONLY, "monit");
> +  
> +  if ( kvm_handle == NULL ) {
> +    
> +    return FALSE;
> +    
> +  }
> +  
> +  /* ----------------------------- INIT MEM -----------------------------*/
> +  /* Got it from libgtop/sysdep/freebsd/mem.c */
> +
> +  /* Initialize nlist structure */
> +  if (kvm_nlist (kvm_handle, nlst) < 0)
> +  {
> +    return FALSE;
> +  }
> +
> +  /* get the page size with "getpagesize" and calculate pageshift
> +   * from it */
> +
> +  pagesize = getpagesize ();
> +  pageshift = 0;
> +  while (pagesize > 1) {
> +
> +    pageshift++;
> +    pagesize >>= 1;
> +
> +  }
> +
> +  /* we only need the amount of log(2)1024 for our conversion */
> +  pageshift -= LOG1024;
> +
> +  /* Get the data from kvm_* */
> +  if (kvm_read (kvm_handle, nlst[1].n_value,
> +             &vmm, sizeof (vmm)) != sizeof (vmm)) {
> +    return FALSE;
> +
> +  }
> +
> +  mem_kbyte_max= vmm.freemin +
> +    vmm.free + vmm.wired +
> +    vmm.active + vmm.inactive;
> +
> +  return TRUE;
> +
> +}
> +
> +int get_process_info_sysdep(ProcInfo_T p) {
> +
> +  struct kinfo_proc *pinfo;
> +
> +  /* Only needed for older versions of BSD that use kvm_uread */
> +  /* struct user *u_addr = (struct user *)USRSTACK; */
> +  struct pstats pstats;
> +  struct plimit plimit;
> +  struct vmspace *vms;
> +  register struct rusage *rup;
> +  long stat_utime;
> +  long stat_stime;
> +  long stat_cutime;
> +  long stat_cstime;
> +
> +  u_int64_t rss_lim;
> +
> +  int count;
> +
> +  /* Got it from libgtop */
> +
> +  pinfo = kvm_getprocs(kvm_handle, KERN_PROC_PID, p->pid, &count);
> +
> +  if ((pinfo == NULL) || (count < 1)) {
> +
> +    return FALSE;
> +
> +  }
> +
> +  /* ----------------------------- CPU TIMING ----------------------------*/
> +  /* Got it from libgtop/sysdep/freebsd/proctime.c */
> +  
> +  if (kvm_read (kvm_handle, 
> +             (unsigned long) pinfo [0].kp_proc.p_stats,
> +             &pstats, sizeof (pstats)) == sizeof (pstats)) {
> +    
> +    /* Need to fix for different versions of BSD - I think older ones
> +       use kvm_uread, and newer use kvm_read */
> +
> +  /*  if ((pinfo [0].kp_proc.p_flag & P_INMEM) &&
> +      kvm_uread (kvm_handle, &(pinfo [0]).kp_proc,
> +              (unsigned long) &u_addr->u_stats,
> +              (char *) &pstats, sizeof (pstats)) == sizeof (pstats)) {
> +  */
> +    rup = &pstats.p_ru;
> +    calcru(&(pinfo [0]).kp_proc,
> +        &rup->ru_utime, &rup->ru_stime, NULL);
> +
> +    stat_utime = tv2sec (pstats.p_ru.ru_utime);
> +    stat_stime = tv2sec (pstats.p_ru.ru_stime);
> +
> +    stat_cutime = tv2sec (pstats.p_cru.ru_utime);
> +    stat_cstime = tv2sec (pstats.p_cru.ru_stime);
> +
> +  } else {
> +
> +    return FALSE;
> +
> +  }
> +
> +  p->cputime_prev= p->cputime;
> +  p->cputime= (int)(( stat_utime + stat_stime ) / 1000);
> +
> +  if( include_children ) {
> +
> +    p->cputime+= (int)(( stat_cutime + stat_cstime ) / 1000);
> +
> +  }
> +
> +  /* first run ? */
> +
> +  if ( p->time_prev == 0.0 ) {
> +
> +    p->cputime_prev= p->cputime;
> +
> +  }
> +
> +  /* ----------------------------- MEMORY --------------------------------*/
> +  /* Got it from libgtop/sysdep/freebsd/procmem.c */
> +
> +  if (kvm_read (kvm_handle,
> +             (unsigned long) pinfo [0].kp_proc.p_limit,
> +             (char *) &plimit, sizeof (plimit)) != sizeof (plimit)) {
> +
> +    return FALSE;
> +
> +  }
> +
> +  rss_lim = (u_int64_t)
> +    (plimit.pl_rlimit [RLIMIT_RSS].rlim_cur);
> +
> +  vms = &pinfo [0].kp_eproc.e_vm;
> +
> +  p->mem_kbyte= (u_int64_t) pagetok (vms->vm_rssize);
> +             /* <<LOG1024 removed, we wanna have kb */
> +
> +  /* ----------------------------- STATE ---------------------------------*/
> +  /* Got it from libgtop/sysdep/freebsd/procstate.c */
> +
> +  if ( pinfo [0].kp_proc.p_stat == SZOMB ) {
> +
> +    p->status_flag |= PROCESS_ZOMBIE;
> +
> +  }
> +
> +  p->mem_percent = (int) ((double) p->mem_kbyte * 1000.0 / mem_kbyte_max);
> +
> +  return TRUE;
> +
> +}
> 

-- 
Jan-Henrik Haukeland




reply via email to

[Prev in Thread] Current Thread [Next in Thread]