[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: OpenBSD Compilation Issues
From: |
Russell Adams |
Subject: |
Re: OpenBSD Compilation Issues |
Date: |
Fri, 28 Feb 2003 12:05:22 -0600 |
User-agent: |
Mutt/1.4i |
Everything seems to work fine, though I keep getting "monit: pread:
Bad address" on occasion. This may be related to how locked down this
particular machine is...
Russell
On Fri, Feb 28, 2003 at 11:03:52AM -0600, Russell Adams wrote:
> Ok, I've manually applied portions of the patches for 3.1 from the
> ports tree to 3.2 to make it compile successfully under OpenBSD.
>
> It loads with a simple configuration file.
>
> I've attached the patch file to this email for further reference.
>
> Russell
>
> On Fri, Feb 28, 2003 at 05:03:16PM +0100, Jan-Henrik Haukeland wrote:
> > Russell Adams <address@hidden> writes:
> >
> > > Thanks for the pointer. My older ports tree doesn't include that. ;]
> > >
> > > I may just settle for 3.1 instead of the new version.
> >
> > You'll miss out on the monitoring mode fix then, but maybe you can
> > convince the OpenBSD maintainer to upgrade to 3.2? or start with the
> > OpenBSD 3.1 port to build your own monit 3.2 on OpenBSD?
> >
> > > Any ideas on how to run Monit under init on OpenBSD?
> >
> > Sorry, I know very little about the BSD platform, but surely there
> > must be mailinglists in OpenBSD land where you may ask.
> >
> > --
> > Jan-Henrik Haukeland
> >
> >
> > --
> > To unsubscribe:
> > http://mail.nongnu.org/mailman/listinfo/monit-general
>
> diff -Naru monit-3.2/configure monit-3.2_openbsd/configure
> --- monit-3.2/configure Tue Feb 18 08:26:03 2003
> +++ monit-3.2_openbsd/configure Fri Feb 28 04:25:29 2003
> @@ -5316,6 +5316,11 @@
> ARCH="FREEBSD"
> CFLAGS="$CFLAGS -D _REENTRANT"
> test_kvm="true"
> +elif test `uname` = "OpenBSD"
> +then
> + ARCH="OPENBSD"
> + CFLAGS="$CFLAGS -D _REENTRANT"
> + test_kvm="true"
> elif test `uname` = "Darwin"
> then
> ARCH="DARWIN"
> diff -Naru monit-3.2/monitor.h monit-3.2_openbsd/monitor.h
> --- monit-3.2/monitor.h Mon Feb 17 08:58:55 2003
> +++ monit-3.2_openbsd/monitor.h Fri Feb 28 04:25:57 2003
> @@ -336,7 +336,7 @@
> int exist_file(char *);
> char *get_ctime();
> char *get_RFC1123date(long *);
> -char *get_uptime(long delta);
> +char *get_uptime(time_t delta);
> char *get_process_uptime(char *);
> char *get_md5sum(char *);
> int check_md5(char *, char *);
> diff -Naru monit-3.2/process/sysdep_OPENBSD.c
> monit-3.2_openbsd/process/sysdep_OPENBSD.c
> --- monit-3.2/process/sysdep_OPENBSD.c Wed Dec 31 18:00:00 1969
> +++ monit-3.2_openbsd/process/sysdep_OPENBSD.c Fri Feb 28 04:30:29 2003
> @@ -0,0 +1,333 @@
> +/*
> + * 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>
> +
> +ssize_t kvm_uread(kvm_t *, const struct proc *, u_long, char *, size_t);
> +
> +#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_OPENBSD.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;
> +
> +}
> --
> To unsubscribe:
> http://mail.nongnu.org/mailman/listinfo/monit-general