X-Git-Url: http://ftp.carnet.hr/pub/carnet-debian/scm?a=blobdiff_plain;f=src%2Fos_xml%2Fos_xml_writer.c;h=1919612c5027c1cf076ac3a5fbfc1a8d45249afa;hb=e81e4e82e5115bf99b6fbd9ebd486de325d67ed6;hp=939ca24b1d65ee61e8379203519bc3f2d5fc8981;hpb=914feba5d54f979cd5d7e69c349c3d01f630042a;p=ossec-hids.git diff --git a/src/os_xml/os_xml_writer.c b/src/os_xml/os_xml_writer.c index 939ca24..1919612 100755 --- a/src/os_xml/os_xml_writer.c +++ b/src/os_xml/os_xml_writer.c @@ -1,11 +1,12 @@ -/* @(#) $Id: os_xml_writer.c,v 1.5 2009/06/24 17:06:32 dcid Exp $ */ +/* @(#) $Id: ./src/os_xml/os_xml_writer.c, 2011/09/08 dcid Exp $ + */ /* Copyright (C) 2009 Trend Micro Inc. * All rights reserved. * * This program is a free software; you can redistribute it * and/or modify it under the terms of the GNU General Public - * License (version 3) as published by the FSF - Free Software + * License (version 2) as published by the FSF - Free Software * Foundation */ @@ -13,36 +14,20 @@ * Available at http://www.ossec.net/ */ +#include +#include - -#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; @@ -53,34 +38,20 @@ int _xml_wfgetc(FILE *fp_in, FILE *fp_out) 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) @@ -99,7 +70,7 @@ int OS_WriteXML(char *infile, char *outfile, char **nodes, char *attr, 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); @@ -109,39 +80,39 @@ int OS_WriteXML(char *infile, char *outfile, char **nodes, char *attr, /* 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\n", newval, nodes[r]); - r--; - + fprintf(fp_out, "%s\n", newval, nodes[s]); + s--; + /* Closing each node. */ - while(r >= 0) + while(s >= 0) { - fprintf(fp_out, "%*c\n", rwidth, ' ', nodes[r]); - r--; + fprintf(fp_out, "%*c\n", rwidth, ' ', nodes[s]); + s--; rwidth -= 3; } } - + fclose(fp_in); fclose(fp_out); return(0); @@ -150,13 +121,13 @@ int OS_WriteXML(char *infile, char *outfile, char **nodes, char *attr, /* 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) { @@ -201,8 +172,8 @@ int _oswcomment(FILE *fp_in, FILE *fp_out) -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; @@ -218,7 +189,7 @@ int _WReadElem(FILE *fp_in, FILE *fp_out, 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) @@ -239,8 +210,8 @@ int _WReadElem(FILE *fp_in, FILE *fp_out, continue; } } - - + + /* Real checking */ if(location == -1) { @@ -262,7 +233,7 @@ int _WReadElem(FILE *fp_in, FILE *fp_out, continue; } } - + /* Looking for the closure */ else if((location == 0) && ((c == _R_CONFE) || (c == ' '))) @@ -272,18 +243,18 @@ int _WReadElem(FILE *fp_in, FILE *fp_out, /* 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) { @@ -298,11 +269,11 @@ int _WReadElem(FILE *fp_in, FILE *fp_out, { 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); @@ -313,7 +284,7 @@ int _WReadElem(FILE *fp_in, FILE *fp_out, { count = 0; location = 1; - } + } /* Checking position of the node */ @@ -323,7 +294,7 @@ int _WReadElem(FILE *fp_in, FILE *fp_out, } /* 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++; @@ -345,7 +316,7 @@ int _WReadElem(FILE *fp_in, FILE *fp_out, } } } - + else if((location == 2) &&(c == _R_CONFE)) { closedelem[count]='\0'; @@ -357,8 +328,8 @@ int _WReadElem(FILE *fp_in, FILE *fp_out, memset(elem,'\0',XML_MAXSIZE); memset(closedelem,'\0',XML_MAXSIZE); memset(cont,'\0',XML_MAXSIZE); - - count = 0; + + count = 0; location = -1; if(parent > 0) { @@ -376,7 +347,7 @@ int _WReadElem(FILE *fp_in, FILE *fp_out, cont[count] = '\0'; count = 0; location = 2; - } + } else { int wret_code; @@ -395,7 +366,7 @@ int _WReadElem(FILE *fp_in, FILE *fp_out, { ret_code = 1; } - + count = 0; } } @@ -403,19 +374,19 @@ int _WReadElem(FILE *fp_in, FILE *fp_out, { 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); @@ -423,7 +394,7 @@ int _WReadElem(FILE *fp_in, FILE *fp_out, return(-1); -} +}