-/* @(#) $Id$ */
+/* @(#) $Id: ./src/os_xml/os_xml_writer.c, 2011/09/08 dcid Exp $
+ */
/* Copyright (C) 2009 Trend Micro Inc.
* All rights reserved.
* Available at http://www.ossec.net/
*/
+#include <stdio.h>
+#include <string.h>
-
-#include "shared.h"
-
-#include "os_xml_writer.h"
-//#include "os_xml.h"
-
-#define _R_CONFS '<'
-#define _R_CONFE '>'
-#define _R_EQUAL '='
-#define _R_COM '!'
-#define _R_VAR '$'
-
-#define OPEN 51
-#define CLOSE 52
-
-#define LEOF -2
+#include "os_xml.h"
+#include "os_xml_internal.h"
/* Internal functions */
-int _oswcomment(FILE *fp_in, FILE *fp_out);
-int _WReadElem(FILE *fp_in, FILE *fp_out, int position, int parent,
- char **node, char *value, int node_pos);
-
-
-/* Currently line */
-int _line;
-
+static int _oswcomment(FILE *fp_in, FILE *fp_out) __attribute__((nonnull));
+static int _WReadElem(FILE *fp_in, FILE *fp_out, unsigned int position, unsigned int parent,
+ const char **node, const char *value, unsigned int node_pos) __attribute__((nonnull));
+static int _xml_wfgetc(FILE *fp_in, FILE *fp_out) __attribute__((nonnull));
/* Local fgetc */
-int _xml_wfgetc(FILE *fp_in, FILE *fp_out)
+static int _xml_wfgetc(FILE *fp_in, FILE *fp_out)
{
int c;
fputc(c, fp_out);
}
- if(c == '\n') /* add new line */
- _line++;
-
- return(c);
+ return(c);
}
-#define FWGETC(fp_in, fp_out) _xml_wfgetc(fp_in, fp_out)
-
-
-
/* OS_WriteXML
* Write an XML file, based on the input and values to change.
*/
-int OS_WriteXML(char *infile, char *outfile, char **nodes, char *attr,
- char *oldval, char *newval, int type)
+int OS_WriteXML(const char *infile, const char *outfile, const char **nodes,
+ const char *oldval, const char *newval)
{
int r = 0;
- int node_pos = 0;
FILE *fp_in;
FILE *fp_out;
- /* Nodes and newval must be set. */
- if(!nodes || !newval)
- {
- return(XMLW_ERROR);
- }
-
/* Opening infile */
fp_in = fopen(infile,"r");
if(!fp_in)
if((r = _WReadElem(fp_in, fp_out, 0, 0,
- nodes, newval, node_pos)) < 0) /* First position */
+ nodes, newval, 0)) < 0) /* First position */
{
fclose(fp_in);
fclose(fp_out);
/* We didn't find an entry, add at the end. */
if(!oldval && r == 0)
{
- int r = 0;
+ int s = 0;
int rwidth = 0;
-
+
fseek(fp_out, 0, SEEK_END);
fprintf(fp_out, "\n");
-
+
/* Printing each node. */
- while(nodes[r])
+ while(nodes[s])
{
- fprintf(fp_out, "%*c<%s>", rwidth, ' ', nodes[r]);
- r++;
+ fprintf(fp_out, "%*c<%s>", rwidth, ' ', nodes[s]);
+ s++;
rwidth += 3;
- if(nodes[r])
+ if(nodes[s])
fprintf(fp_out, "\n");
}
-
+
/* Printing val. */
- r--;
+ s--;
rwidth -=6;
- fprintf(fp_out, "%s</%s>\n", newval, nodes[r]);
- r--;
-
+ fprintf(fp_out, "%s</%s>\n", newval, nodes[s]);
+ s--;
+
/* Closing each node. */
- while(r >= 0)
+ while(s >= 0)
{
- fprintf(fp_out, "%*c</%s>\n", rwidth, ' ', nodes[r]);
- r--;
+ fprintf(fp_out, "%*c</%s>\n", rwidth, ' ', nodes[s]);
+ s--;
rwidth -= 3;
}
}
-
+
fclose(fp_in);
fclose(fp_out);
return(0);
/* Getting comments */
-int _oswcomment(FILE *fp_in, FILE *fp_out)
+static int _oswcomment(FILE *fp_in, FILE *fp_out)
{
int c;
if((c = fgetc(fp_in)) == _R_COM)
{
fputc(c, fp_out);
- while((c = FWGETC(fp_in, fp_out)) != EOF)
+ while((c = _xml_wfgetc(fp_in, fp_out)) != EOF)
{
if(c == _R_COM)
{
-int _WReadElem(FILE *fp_in, FILE *fp_out,
- int position, int parent, char **nodes, char *val, int node_pos)
+static int _WReadElem(FILE *fp_in, FILE *fp_out,
+ unsigned int position, unsigned int parent, const char **nodes, const char *val, unsigned int node_pos)
{
int c;
int ret_code = 0;
memset(closedelem,'\0',XML_MAXSIZE +1);
- while((c = FWGETC(fp_in, fp_out)) != EOF)
+ while((c = _xml_wfgetc(fp_in, fp_out)) != EOF)
{
/* Max size */
if(count >= XML_MAXSIZE)
continue;
}
}
-
-
+
+
/* Real checking */
if(location == -1)
{
continue;
}
}
-
+
/* Looking for the closure */
else if((location == 0) && ((c == _R_CONFE) || (c == ' ')))
/* Removing the / at the end of the element name */
- if(elem[count -1] == '/')
+ if(count > 0 && elem[count -1] == '/')
{
_ge = '/';
elem[count -1] = '\0';
}
-
+
/* If we may have more attributes */
if(c == ' ')
{
/* Writing the attributes */
- while((c = FWGETC(fp_in, fp_out)) != EOF)
+ while((c = _xml_wfgetc(fp_in, fp_out)) != EOF)
{
if(c == _R_CONFE)
{
{
count = 0;
location = -1;
-
+
memset(elem,'\0',XML_MAXSIZE);
memset(closedelem,'\0',XML_MAXSIZE);
memset(cont,'\0',XML_MAXSIZE);
-
+
if(parent > 0)
{
return(ret_code);
{
count = 0;
location = 1;
- }
+ }
/* Checking position of the node */
}
/* Checking if the element name matches */
- if(node_pos == position &&
+ if(node_pos == position &&
nodes[node_pos] && strcmp(elem, nodes[node_pos]) == 0)
{
node_pos++;
}
}
}
-
+
else if((location == 2) &&(c == _R_CONFE))
{
closedelem[count]='\0';
memset(elem,'\0',XML_MAXSIZE);
memset(closedelem,'\0',XML_MAXSIZE);
memset(cont,'\0',XML_MAXSIZE);
-
- count = 0;
+
+ count = 0;
location = -1;
if(parent > 0)
{
cont[count] = '\0';
count = 0;
location = 2;
- }
+ }
else
{
int wret_code;
{
ret_code = 1;
}
-
+
count = 0;
}
}
{
if(location == 0)
{
- elem[count++] = c;
+ elem[count++] = (char) c;
}
else if(location == 1)
{
- cont[count++] = c;
+ cont[count++] = (char) c;
}
else if(location == 2)
{
- closedelem[count++] = c;
+ closedelem[count++] = (char) c;
}
}
}
-
+
if(location == -1)
{
return(ret_code);
return(-1);
-}
+}