I am using libxml library to parse the xml file into my code and then assign each element node to the corresponding linked list node. I think the code runs just fine,I hope, as I am still new to this and would like your review.
Is there anything that I may be doing wrong/dangerous approach?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/parser.h>
struct node {
char *polname;
char *devname;
char *status;
char *srczone;
char *dstzone;
char *srcaddr;
char *dstaddr;
char *srcuser;
char *app;
char *service;
char *urlcategory;
char *action;
char *vulnerability;
struct node *next;
};
struct node *head = NULL;
void insert(char *a, char *b, char *c, char *d, char *e, char *f, char*g, char *h, char *i, char *j, char *k, char *l, char *m){
struct node *temp;
temp = (struct node*)malloc(sizeof(struct node));
temp->polname = a;
temp->devname = b;
temp->status = c;
temp->srczone = d;
temp->dstzone = e;
temp->srcaddr = f;
temp->dstaddr = g;
temp->srcuser = h;
temp->app = i;
temp->service = j;
temp->urlcategory = k;
temp->action = l;
temp->vulnerability = m;
temp->next = head;
head= temp;
}
void traverse_dom_trees(xmlNode * a_node)
{
xmlNode *cur_node = NULL;
for (cur_node = a_node; cur_node; cur_node = cur_node->next)
{
char *pol, *dev, *stat, *srcz, *dstz, *srca, *dsta, *srcu, *app, *ser, *url, *act, *vul;
if(strcmp((const char *)cur_node->name,(const char *)"policyName") == 0){
xmlChar *a = xmlNodeGetContent(cur_node);
printf("printing a: %s\n", a);
pol = strdup(a);
printf("printing pol: %s\n", pol);
}
else if(strcmp((const char *)cur_node->name,(const char *)"deviceName") == 0) {
xmlChar *b = xmlNodeGetContent(cur_node);
printf("printing b: %s\n", b);
dev = strdup(b);
printf("printing dev: %s\n", dev);
}
else if(strcmp((const char *)cur_node->name,(const char *)"status") == 0){
xmlChar *c = xmlNodeGetContent(cur_node);
printf("printing c: %s\n", c);
stat = strdup(c);
printf("printing stat: %s\n", stat);
}
else if(strcmp((const char *)cur_node->name,(const char *)"srcZone") == 0){
xmlChar *d = xmlNodeGetContent(cur_node);
printf("printing d: %s\n", d);
srcz = strdup(d);
printf("printing srcz: %s\n", srcz);
}
else if(strcmp((const char *)cur_node->name,(const char *)"dstZone") == 0){
xmlChar *e = xmlNodeGetContent(cur_node);
printf("printing e: %s\n", e);
dstz = strdup(e);
printf("printing dstz: %s\n", dstz);
}
else if(strcmp((const char *)cur_node->name,(const char *)"srcAddr") == 0){
xmlChar *f = xmlNodeGetContent(cur_node);
printf("printing f: %s\n", f);
srca = strdup(f);
printf("printing srca: %s\n", srca);
}
else if(strcmp((const char *)cur_node->name,(const char *)"dstAddr") == 0){
xmlChar *g = xmlNodeGetContent(cur_node);
printf("printing g: %s\n", g);
dsta = strdup(g);
printf("printing dsta: %s\n", dsta);
}
else if(strcmp((const char *)cur_node->name,(const char *)"srcUser") == 0){
xmlChar *h = xmlNodeGetContent(cur_node);
printf("printing h: %s\n", h);
srcu = strdup(h);
printf("printing srcu: %s\n", srcu);
}
else if(strcmp((const char *)cur_node->name,(const char *)"application") == 0){
xmlChar *i = xmlNodeGetContent(cur_node);
printf("printing i: %s\n", i);
app = strdup(i);
printf("printing app: %s\n", app);
}
else if(strcmp((const char *)cur_node->name,(const char *)"service") == 0){
xmlChar *j = xmlNodeGetContent(cur_node);
printf("printing j: %s\n", j);
ser = strdup(j);
printf("printing ser: %s\n", ser);
}
else if(strcmp((const char *)cur_node->name,(const char *)"urlCategory") == 0){
xmlChar *k = xmlNodeGetContent(cur_node);
printf("printing k: %s\n", k);
url = strdup(k);
printf("printing url: %s\n", url);
}
else if(strcmp((const char *)cur_node->name,(const char *)"action") == 0){
xmlChar *l = xmlNodeGetContent(cur_node);
printf("printing l: %s\n", l);
act = strdup(l);
printf("printing act: %s\n", act);
}
else if(strcmp((const char *)cur_node->name,(const char *)"vulnerability") == 0){
xmlChar *m = xmlNodeGetContent(cur_node);
printf("printing m: %s\n", m);
vul = strdup(m);
printf("printing vul: %s\n", vul);
}
insert (pol, dev, stat, srcz, dstz, srca, dsta, srcu, app, ser, url, act, vul );
// print();
traverse_dom_trees(cur_node->children);
}
}
int main(int argc, char **argv)
{
xmlDocPtr doc;
xmlNode *roo_element = NULL;
if (argc != 2)
{
printf("\nInvalid argument\n");
return(1);
}
doc = xmlReadFile(argv[1], NULL, XML_PARSE_NOBLANKS | XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_NONET);
if (doc == NULL)
{
fprintf(stderr, "Document not parsed successfully.\n");
return 0;
}
roo_element = xmlDocGetRootElement(doc);
if (roo_element == NULL)
{
fprintf(stderr, "empty document\n");
xmlFreeDoc(doc);
return 0;
}
printf("Root Node is %s\n", roo_element->name);
traverse_dom_trees(roo_element);
xmlFreeDoc(doc); // free document
xmlCleanupParser(); // Free globals
return 0;
}
Since everybody asked me to provide the input file, so here it is... Sorry for the delay.
File.xml
<policyList>
<policySecurity>
<policyName>AutoAdd</policyName>
<deviceName>PA-722</deviceName>
<status>ACTIVE</status>
<srcZone>any</srcZone>
<dstZone>any</dstZone>
<srcAddr>any</srcAddr>
<dstAddr>5.5.5.4</dstAddr>
<srcUser>any</srcUser>
<application>any</application>
<service>any</service>
<urlCategory>any</urlCategory>
<action>deny</action>
</policySecurity>
<policySecurity>
<policyName>Test-1</policyName>
<deviceName>PA-710</deviceName>
<status>ACTIVE</status>
<srcZone>any</srcZone>
<dstZone>any</dstZone>
<srcAddr>192.168.1.23</srcAddr>
<dstAddr>8.8.8.8</dstAddr>
<srcUser>vivek</srcUser>
<application>any</application>
<service>any</service>
<urlCategory>any</urlCategory>
<action>deny</action>
</policySecurity>
<policyVulnerability>
<policyName>Test-1</policyName>
<deviceName>PA-710</deviceName>
<status>ACTIVE</status>
<srcZone>any</srcZone>
<dstZone>any</dstZone>
<srcAddr>192.168.1.23</srcAddr>
<dstAddr>8.8.8.8</dstAddr>
<srcUser>vivek</srcUser>
<application>any</application>
<service>any</service>
<urlCategory>any</urlCategory>
<vulnerability>VP-33567</vulnerability>
<action>deny</action>
</policyVulnerability>
</policyList>