00001
00002
00007
00008
00009 #include "policy-dump.h"
00010 #include "memory.h"
00011 #include <stdio.h>
00012
00013 void dumpOutput(FILE *fd, POLICY_OUTPUT *o, unsigned int tabs, char freeme){
00014 unsigned int i;
00015 if(!o) return;
00016 if(fd){
00017 for(i=0;i<tabs;i++){
00018 fprintf(fd, ".");
00019 }
00020 fprintf(fd, "OUTPUT(%s, %s", o->name, o->args);
00021 if(o->eof) fprintf(fd, ", EOF)\n");
00022 else fprintf(fd, ")\n");
00023 dumpTest(fd, o->tNext, tabs, freeme);
00024 dumpOutput(fd, o->oNext, tabs, freeme);
00025 if(freeme){
00026 free_safe(o->name);
00027 free_safe(o->args);
00028 free_safe(o);
00029 }
00030 }
00031 else if(freeme){
00032 dumpTest(fd, o->tNext, 0, freeme);
00033 dumpOutput(fd, o->oNext, tabs, freeme);
00034 free_safe(o->name);
00035 free_safe(o->args);
00036 free_safe(o);
00037 }
00038 }
00039
00040 void dumpProto(FILE *fd, POLICY_PROTO *p, unsigned int tabs, char freeme){
00041 unsigned int i;
00042 if(!p) return;
00043 if(fd){
00044 for(i=0;i<tabs;i++){
00045 fprintf(fd, ".");
00046 }
00047 fprintf(fd, "PROTO(%lx, %s)\n", p->proto_num, p->proto_name);
00048 dumpTest(fd, p->test, tabs+2, freeme);
00049 for(i=0;i<tabs;i++){
00050 fprintf(fd, ".");
00051 }
00052 fprintf(fd, "END_PROTO\n");
00053 dumpProto(fd, p->next, tabs, freeme);
00054 if(freeme){
00055 free_safe(p->proto_name);
00056 free_safe(p);
00057 }
00058 }
00059 else if(freeme){
00060 dumpTest(fd, p->test, 0, freeme);
00061 dumpProto(fd, p->next, 0, freeme);
00062 free_safe(p->proto_name);
00063 free_safe(p);
00064 }
00065 }
00066
00067 void dumpTest(FILE *fd, POLICY_TEST *t, unsigned int tabs, char freeme){
00068 unsigned int i;
00069 unsigned long ul;
00070
00071 if(!t) return;
00072 if(fd){
00073 for(i=0;i<tabs;i++){
00074 fprintf(fd, ".");
00075 }
00076 if(t->test_type==POLICY_TEST_TYPE_MASKED){
00077 fprintf(fd, "TEST(p_name=%s,p_num=%lx,v=",t->p_name, t->p_num);
00078 for(ul=0;ul<t->m_len;ul++){
00079 fprintf(fd, "%2.2hhx",(t->m_val)[ul]);
00080 }
00081 fprintf(fd, ",m=");
00082 for(ul=0;ul<t->m_len;ul++){
00083 fprintf(fd, "%2.2hhx",(t->m_mask)[ul]);
00084 }
00085 fprintf(fd, ",o=%lx,l=%lx,t=%c",t->m_offset,t->m_len,t->m_type);
00086 }
00087 else if(t->test_type==POLICY_TEST_TYPE_VAR){
00088 fprintf(fd, "TEST(p_name=%s,p_num=%lx,v=%lx,vt=%c,tt=%c%c",t->p_name,t->p_num,t->v_val,t->v_vType,t->v_tType[0],t->v_tType[1]);
00089 }
00090 else if(t->test_type==POLICY_TEST_TYPE_ANALYSIS){
00091 fprintf(fd, "ANALYSIS(%s, %s", t->a_name, t->a_args);
00092 }
00093 else {
00094 fprintf(fd, "TEST - UNKNOWN TYPE ");
00095 }
00096 fprintf(fd, ",p_num=%lx,p_name=%s)\n",t->p_num,t->p_name);
00097 dumpResult(fd, t->result, tabs+2, freeme);
00098 for(i=0;i<tabs;i++){
00099 fprintf(fd, ".");
00100 }
00101 if(t->test_type==POLICY_TEST_TYPE_ANALYSIS){
00102 fprintf(fd, "END_ANALYSIS\n");
00103 }
00104 else {
00105 fprintf(fd, "END_TEST\n");
00106 }
00107 if(freeme){
00108 if(t->test_type==POLICY_TEST_TYPE_MASKED){
00109 free_safe(t->m_val);
00110 free_safe(t->m_mask);
00111 }
00112 free_safe(t->p_name);
00113 free_safe(t);
00114 }
00115 }
00116 else if(freeme){
00117 dumpResult(fd, t->result, 0, freeme);
00118 if(t->test_type==POLICY_TEST_TYPE_MASKED){
00119 free_safe(t->m_val);
00120 free_safe(t->m_mask);
00121 }
00122 free_safe(t->p_name);
00123 free_safe(t);
00124 }
00125 }
00126
00127 void dumpResult(FILE *fd, POLICY_RESULT *r, unsigned int tabs, char freeme){
00128 unsigned int i;
00129 if(!r) return;
00130 if(fd){
00131 for(i=0;i<tabs;i++){
00132 fprintf(fd, ".");
00133 }
00134 fprintf(fd, "RESULT(%s,%hu)\n",r->sResult,r->iResult);
00135 dumpOutput(fd, r->match, tabs+2, freeme);
00136 for(i=0;i<tabs;i++){
00137 fprintf(fd, ".");
00138 }
00139 fprintf(fd, "END_RESULT\n");
00140 dumpResult(fd, r->next, tabs, freeme);
00141 if(freeme){
00142 free_safe(r->sResult);
00143 free_safe(r);
00144 }
00145 }
00146 else if(freeme){
00147 dumpOutput(fd, r->match, 0, freeme);
00148 dumpResult(fd, r->next, tabs, freeme);
00149 free_safe(r->sResult);
00150 free_safe(r);
00151 }
00152 }
00153
00154 void dumpInit(FILE *fd, POLICY_INITS *i, unsigned int tabs, char freeme){
00155 unsigned int u;
00156 if(!i) return;
00157 if(fd){
00158 for(u=0;u<tabs;u++){
00159 fprintf(fd, ".");
00160 }
00161 fprintf(fd, "INIT(%s",i->plugname);
00162 for(u=0;u<i->string_count;u++){
00163 fprintf(fd, ",%s",(i->init_string)[u]);
00164 }
00165 fprintf(fd, ")\n");
00166 dumpInit(fd, i->next, tabs, freeme);
00167 if(freeme){
00168 for(u=0;u<i->string_count;u++){
00169 free_safe((i->init_string)[u]);
00170 }
00171 free_safe(i);
00172 }
00173 }
00174 else if(freeme){
00175 dumpInit(fd, i->next, 0, freeme);
00176 for(u=0;u<i->string_count;u++){
00177 free_safe((i->init_string)[u]);
00178 }
00179 free_safe(i);
00180 }
00181 }
00182
00183 void dumpInput(FILE *fd, POLICY_INPUT *i, unsigned int tabs, char freeme){
00184 unsigned int u;
00185 if(!i) return;
00186 if(fd){
00187 for(u=0;u<tabs;u++){
00188 fprintf(fd, ".");
00189 }
00190 fprintf(fd, "INPUT(%s,%hu,%s,%u)\n", i->plugname, i->weight, i->sSrc, i->iSrc);
00191 dumpInput(fd, i->next, tabs, freeme);
00192 if(freeme){
00193 free_safe(i->plugname);
00194 free_safe(i->sSrc);
00195 free_safe(i);
00196 }
00197 }
00198 else if(freeme){
00199 dumpInput(fd, i->next, 0, freeme);
00200 free_safe(i->plugname);
00201 free_safe(i->sSrc);
00202 free_safe(i);
00203 }
00204 }
00205
00206 void dumpPolicy(FILE *fd, POLICY_HEAD *h, char freeme){
00207 if(!h) return;
00208 if(fd){
00209 fprintf(fd, "POLICY");
00210 fprintf(fd, "..INITS\n");
00211 dumpInit(fd, h->inits, 4, freeme);
00212 fprintf(fd, "..END_INITS\n..INPUTS\n");
00213 dumpInput(fd, h->input, 4, freeme);
00214 fprintf(fd, "..END_INPUTS\n..DEFAULTS\n");
00215 dumpOutput(fd, h->def, 4, freeme);
00216 fprintf(fd, "..END_DEFAULTS\n..PROTOS\n");
00217 dumpProto(fd, h->top, 4, freeme);
00218 fprintf(fd, "..END_PROTOS\nEND_POLICY\n");
00219 if(freeme) free_safe(h);
00220 }
00221 else if(freeme){
00222 dumpInit(fd, h->inits, 0, freeme);
00223 dumpInput(fd, h->input, 0, freeme);
00224 dumpOutput(fd, h->def, 0, freeme);
00225 dumpProto(fd, h->top, 0, freeme);
00226 free_safe(h);
00227 }
00228 }