/* * The Spread Toolkit. * * The contents of this file are subject to the Spread Open-Source * License, Version 1.0 (the ``License''); you may not use * this file except in compliance with the License. You may obtain a * copy of the License at: * * http://www.spread.org/license/ * * or in the file ``license.txt'' found in this distribution. * * Software distributed under the License is distributed on an AS IS basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Creators of Spread are: * Yair Amir, Michal Miskin-Amir, Jonathan Stanton. * * Copyright (C) 1993-2004 Spread Concepts LLC * * All Rights Reserved. * * Major Contributor(s): * --------------- * Cristina Nita-Rotaru crisn@cs.purdue.edu - group communication security. * Theo Schlossnagle jesus@omniti.com - Perl, skiplists, autoconf. * Dan Schoenblum dansch@cnds.jhu.edu - Java interface. * John Schultz jschultz@cnds.jhu.edu - contribution to process group membership. * */ #include #include "arch.h" /* undef redefined variables under windows */ #ifdef ARCH_PC_WIN95 #undef EINTR #undef EAGAIN #undef EWOULDBLOCK #undef EINPROGRESS #endif #include #include #include "log.h" #include "configuration.h" #include "membership.h" #include "prot_body.h" #include "sp_events.h" #include "alarm.h" static int Is_inited = 0; static sp_time alive_time; static FILE *fd; static proc My; static void Log_alive(int dummy, void *dummy_p); void Log_init() { long start_file_pos; Is_inited = 1; My = Conf_my(); fd = fopen( My.name, "a" ); if( fd == NULL ) Alarm( EXIT, "Log_init: error (%s) could not open file %s\n",strerror(errno), My.name ); start_file_pos = ftell(fd); if (start_file_pos == -1) Alarm( EXIT, "Log_init: failed to find end of file %s\n", My.name ); fclose(fd); fd = fopen( My.name, "r+" ); if( fd == NULL ) Alarm( EXIT, "Log_init: error (%s) could not open file %s\n",strerror(errno), My.name ); fseek( fd, start_file_pos, SEEK_SET ); alive_time.sec = 10; alive_time.usec = 0; Log_alive(0, NULL); fprintf( fd, "B %13ld\n",E_get_time().sec ); fflush( fd ); } static void Log_alive(int dummy, void *dummy_p) { long file_pos; if( !Is_inited ) return; #if ( SPREAD_PROTOCOL == 3 ) fprintf( fd, "A %13ld %11d\n",E_get_time().sec, Highest_seq ); #else fprintf( fd, "A %13ld \n",E_get_time().sec ); #endif if( fseek( fd, -28, SEEK_CUR ) ) Alarm( EXIT, "Log_alive: error (%s) in fseek -28 on %s\n", strerror(errno), My.name); file_pos = ftell(fd); if( fseek( fd, 28, SEEK_CUR ) ) Alarm( EXIT, "Log_alive: error (%s) in fseek 28 on %s\n", strerror(errno), My.name); fclose(fd); fd = fopen( My.name, "r+" ); if( fd == NULL ) Alarm( EXIT, "Log_alive: error (%s) could not open file %s\n",strerror(errno), My.name ); if( fseek( fd, file_pos, SEEK_SET ) ) Alarm( EXIT, "Log_alive: error (%s) in fseek file_pos (%ld) on %s\n", strerror(errno), file_pos, My.name); E_queue( Log_alive, 0, NULL, alive_time ); } void Log_membership() { configuration Cn; int32 proc_id; proc dummy_p; int i,j; int found; if( !Is_inited ) return; #if ( SPREAD_PROTOCOL == 3 ) fprintf( fd, "M %13ld %13d %11d > ", E_get_time().sec, Memb_id().time, Highest_seq ); #else fprintf( fd, "M %13ld %13d > ", E_get_time().sec, Memb_id_for_Network().time ); #endif found = -1; Cn= Conf(); for( i=0; i < Conf().num_segments; i++ ) { for( j=0; j < Cn.segments[i].num_procs; j++ ) { proc_id = Cn.segments[i].procs[j]->id; if( Conf_id_in_conf( Memb_active_ptr(), proc_id ) != -1 ) { if( found == -1 ) found = Conf_proc_by_id( proc_id, &dummy_p ); fprintf( fd, " %2d", found ); }else fprintf( fd, " --" ); } } fprintf( fd, "\n"); Log_alive(0, NULL); } void Log_sess_connect( mailbox mbox, int32 address, char *private_group ) { char ip[16]; if( !Is_inited ) return; Conf_id_to_str( address, ip ); #if ( SPREAD_PROTOCOL == 3 ) fprintf( fd, "C %13ld %11d %3d %-16s %-10s\n", E_get_time().sec, Highest_seq, mbox, ip, private_group ); #else fprintf( fd, "C %13ld %3d %-16s %-10s\n", E_get_time().sec, mbox, ip, private_group ); #endif Log_alive(0, NULL); } void Log_sess_disconnect( mailbox mbox, int32 address, char *private_group, int num_mess ) { char ip[16]; if( !Is_inited ) return; Conf_id_to_str( address, ip ); #if ( SPREAD_PROTOCOL == 3 ) fprintf( fd, "D %13ld %11d %3d %-16s %-10s %d\n", E_get_time().sec, Highest_seq, mbox, ip, private_group, num_mess ); #else fprintf( fd, "D %13ld %3d %-16s %-10s %d\n", E_get_time().sec, mbox, ip, private_group, num_mess ); #endif Log_alive(0, NULL); }