Still problems with Nagios 2.9 and NDO under Solaris 8

Masopust, Christian christian.masopust at siemens.com
Mon Sep 17 08:07:28 CEST 2007


> >>> i'm still having problems with ndoutils under Solaris 9.
> >>>  
> >>> When i'm activating it (event_broker_options=-1) in nagios.cfg
> >>> my nagios won't start anymore !!   it always stops with a 
> >> segmentation fault!
> >>>  
> >>> here's the traceback of the dump:
> >>>  
> >>> (gdb) bt
> >>> #0  0xff1b3288 in strlen () from /usr/lib/libc.so.1
> >>> #1  0xff10bcbc in ndo_escape_buffer (buffer=Cannot access 
> >> memory at address 0x44
> >>> ) at io.c:424
> >>> #2  0xff104788 in ndomod_write_object_config 
> >> (config_type=1) at ndomod.c:3183
> >>> #3  0xff103d30 in ndomod_write_config (config_type=1) at 
> >> ndomod.c:2999
> >>> #4  0xff103b44 in ndomod_broker_data (event_type=7, 
> >> data=0xffbef954) at ndomod.c:2940
> >>> #5  0x0001d038 in neb_make_callbacks ()
> >>> #6  0x0001ca38 in broker_program_state ()
> >>> #7  0x0001b67c in main ()
> >>>
> >>> is there anyone who could shed a little lite on this ??
> >>>  
> >> Not really. The program receives a SIGSEGV in 
> >> ndo_escape_buffer because it gets
> >> passed an invalid pointer (memory address 0x44 is not 
> >> available to programs).
> >>
> >> Why it gets passed a bogus address on Solaris is a mystery 
> to me, as
> >> contact_struct->name is located at relative address 0 within 
> >> the contact_struct
> >> data structure (unless your compiler re-arranges it ofcourse).
> >>
> > Hello Andreas,
> > 
> > that's real funny.... i tried yesterday the same sources on a RHEL 4
> > system and it works perfectly !
> > 
> > and also funny is that the SIGSEGV on Solaris 8 is there whether i
> > compile Nagios and NDO with gcc (4.1.2) or Sun-Studio 11 ...
> > 
> > isn't there anyone who also has Nagios running on Solaris 8 ??  :-))
> > 
> 
> Probably, but it's unlikely that many of those run NDOUtils compiled
> with Solaris' compiler.
> 
> -- 

Hello Andreas,

I'm not (totally) sure about this as i already tried to compile Nagios
and NDOUtils with SUN-Studio compilers (Studio 11 for Solaris 8) and
get the same results.

Maybe you remember one of my last mails (from April this year)...

> 1. error during compile: Solaris 8 doesn't provide the SUN_LEN macro, so i
>    copied it from one of my Linux - systems   ---> compile ok.
> 2. error during linking: Solaris 8 doesn't provide "strtof". I found the
>    source for strtof on www.koders.com and added it ---> link ok

this is what i did:

1. add the following to include/config.h (for ndoutils):
#ifndef SUN_LEN
#define SUN_LEN(sunp) ((size_t)((struct sockaddr_un *)0)->sun_path + strlen((sunp)->sun_path))
#endif

2. add the following file to src (and add it to the makefile) to get "strtof":
bash-2.03# cat strtof.c
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

float strtof(const char* s, char** endptr) {
    register const char*  p     = s;
    register float        value = 0.;
    int                   sign  = +1;
    float                 factor;
    unsigned int          expo;

    while ( isspace(*p) )
        p++;

    switch (*p) {
    case '-': sign = -1;
    case '+': p++;
    default : break;
    }

    while ( (unsigned int)(*p - '0') < 10u )
        value = value*10 + (*p++ - '0');

    if ( *p == '.' ) {
        factor = 1.;

        p++;
        while ( (unsigned int)(*p - '0') < 10u ) {
            factor *= 0.1;
            value  += (*p++ - '0') * factor;
        }
    }

    if ( (*p | 32) == 'e' ) {
        expo   = 0;
        factor = 10.L;

        switch (*++p) { 
        case '-': factor = 0.1;
        case '+': p++;
                  break;
        case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
                  break;
        default : value = 0.L;
                  p     = s;
                  goto done;
        }

        while ( (unsigned int)(*p - '0') < 10u )
            expo = 10 * expo + (*p++ - '0');

        while ( 1 ) {
            if ( expo & 1 )
                value *= factor;
            if ( (expo >>= 1) == 0 )
                break;
            factor *= factor;
        }
    }

done:
    if ( endptr != NULL )
        *endptr = (char*)p;

    return value * sign;
}


any ideas more?   especially.... is my definition for SUN_LEN correct?
and... does anybody have a (maybe) better "strtof" for Solaris 8 ?

Thanks again!
Christian



-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/




More information about the Developers mailing list