00001 /* 00002 * Copyright (c) 2006 Regents of the SIGNET lab, University of Padova. 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions 00007 * are met: 00008 * 1. Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * 3. Neither the name of the University of Padova (SIGNET lab) nor the 00014 * names of its contributors may be used to endorse or promote products 00015 * derived from this software without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00018 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 00019 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00020 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 00021 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00022 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00023 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 00024 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 00025 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 00026 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 00027 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00028 */ 00029 00030 #include <stdarg.h> 00031 #include "cltracer.h" 00032 #include "clsap.h" 00033 00034 /*------------------------------------------------------------------------------------------------------- 00035 methods for clTracer class 00036 ---------------------------------------------------------------------------------------------------------*/ 00037 00038 ClTracer::ClTracer() : commonTr_(0) 00039 { 00040 for (int i = 0; i < MAXHASHINDEX; i++) 00041 tr_[i] = 0; 00042 } 00043 00044 // add a new tracer (insert sorted by level, decreasing from the max) 00045 // (a new tracer of the same level is inserted in tail of the already inserted tracer) 00046 void ClTracer::addTracer(ClMessageTracer *newTr) 00047 { 00048 if(!newTr) 00049 return; 00050 int i = newTr->clType() % MAXHASHINDEX; 00051 addTracer(newTr, &(tr_[i])); 00052 } 00053 00054 void ClTracer::addCommonTracer(ClMessageTracer *newTr) 00055 { 00056 if(!newTr) 00057 return; 00058 commonTr_ = newTr; 00059 } 00060 00061 void ClTracer::addTracer(ClMessageTracer *newTr, ClMessageTracer **tr) 00062 { 00063 if(!*tr) 00064 { 00065 /* 00066 newTr is the first ClMessageTracer with this key 00067 */ 00068 *tr = newTr; 00069 (*tr)->next(newTr); 00070 return; 00071 } 00072 newTr->next(*tr); 00073 ClMessageTracer *cur; 00074 00075 for (cur = *tr; cur->next() != *tr; cur = cur->next()); 00076 00077 cur->next(newTr); 00078 00079 } 00080 00081 // begin the trace of the packet that is crossing the ClSAP 00082 void ClTracer::trace(ClMessage *m, ConnectorTrace *clsap) 00083 { 00084 if(commonTr_) 00085 commonTr_->format(m, clsap); 00086 int i = m->type() % MAXHASHINDEX; 00087 ClMessageTracer *cur; 00088 for (cur = tr_[i]; cur && cur->next() != tr_[i]; cur = cur->next()) 00089 { 00090 if(cur->clType() == m->type()) 00091 { 00092 tr_[i] = cur; 00093 cur->format(m, clsap); 00094 return; 00095 } 00096 } 00097 if(cur && cur->clType() == m->type()) 00098 { 00099 tr_[i] = cur; 00100 cur->format(m, clsap); 00101 } 00102 } 00103 00104 /*------------------------------------------------------------------------------------------------------- 00105 methods for ClMessageTracer class 00106 ---------------------------------------------------------------------------------------------------------*/ 00107 00108 ClMessageTracer::ClMessageTracer(ClMessage_t clType) : clType_(clType) 00109 { 00110 next_ = 0; 00111 } 00112 00113 ClMessage_t ClMessageTracer::clType() 00114 { 00115 return (clType_); 00116 } 00117 00118 ClMessageTracer* ClMessageTracer::next() 00119 { 00120 return (next_); 00121 } 00122 00123 void ClMessageTracer::next(ClMessageTracer *tr) 00124 { 00125 next_ = tr; 00126 } 00127 00128 void ClMessageTracer::writeTrace(ConnectorTrace *clsap, char *s, ...) 00129 { 00130 va_list ap; 00131 va_start(ap,s); 00132 clsap->vWriteTrace(s, ap); 00133 //printf(s,ap); 00134 va_end(ap); 00135 } 00136 00137