int addMRoute( struct MRouteDesc *Dp ) /* ** Adds the multicast routed '*Dp' to the kernel routes ** ** returns: - 0 if the function succeeds ** - the errno value for non-fatal failure condition */ { struct mfcctl CtlReq; CtlReq.mfcc_origin = Dp->OriginAdr; // Kaohj // CtlReq.mfcc_subscriber = Dp->SubsAdr; CtlReq.mfcc_mcastgrp = Dp->McAdr; CtlReq.mfcc_parent = Dp->InVif; /* copy the TTL vector */ if( sizeof( CtlReq.mfcc_ttls ) != sizeof( Dp->TtlVc ) || VCMC( CtlReq.mfcc_ttls ) != VCMC( Dp->TtlVc ) ) log( LOG_ERR, 0, "data types doesn't match in " __FILE__ ", source adaption needed !" ); memcpy( CtlReq.mfcc_ttls, Dp->TtlVc, sizeof( CtlReq.mfcc_ttls ) ); { char FmtBuO[ 32 ], FmtBuM[ 32 ]; log( LOG_DEBUG, 0, "adding MFC: %s -> %s, InpVIf: %d", fmtInAdr( FmtBuO, CtlReq.mfcc_origin ), fmtInAdr( FmtBuM, CtlReq.mfcc_mcastgrp ), CtlReq.mfcc_parent == ALL_VIFS ? -1 : CtlReq.mfcc_parent ); } if( setsockopt( MRouterFD, IPPROTO_IP, MRT_ADD_MFC, (void *)&CtlReq, sizeof( CtlReq ) ) ) log( LOG_WARNING, errno, "MRT_ADD_MFC" ); return errno; }
void log_info( int Serverity, int Errno, const char *FmtSt, ... ) { const char ServVc[][ 5 ] = { "EMER", "ALER", "CRIT", "ERRO", "Warn", "Note", "Info", "Debu" }; const char *ServPt = Serverity < 0 || Serverity >= VCMC( ServVc ) ? "!unknown serverity!" : ServVc[ Serverity ]; const char *ErrSt = (Errno <= 0) ? NULL : (const char *)strerror( Errno ); { va_list ArgPt; unsigned Ln; va_start( ArgPt, FmtSt ); Ln = snprintf( LogLastMsg, sizeof( LogLastMsg ), "%s: ", ServPt ); Ln += vsnprintf( LogLastMsg + Ln, sizeof( LogLastMsg ) - Ln, FmtSt, ArgPt ); if( ErrSt ) snprintf( LogLastMsg + Ln, sizeof( LogLastMsg ) - Ln, "; Errno(%d): %s", Errno, ErrSt ); va_end( ArgPt ); } // update our global Last... variables LogLastServerity = Serverity; LogLastErrno = Errno; // control logging to stderr if(Serverity < LOG_WARNING || Serverity <= Log2Stderr ) fprintf( stderr, "%s\n", LogLastMsg ); // always to syslog syslog( Serverity, "%s", LogLastMsg ); if( Serverity <= LOG_ERR ) exit( -1 ); }