From 37022b9e9e1e2b70642e7e491b59a5418d14d35c Mon Sep 17 00:00:00 2001
From: Oussama Ghorbel <oussama.ghorbel@iopsys.eu>
Date: Wed, 12 Feb 2020 10:33:08 +0100
Subject: [PATCH] update to ugw 8.4.1.30 / libhelper-2.3.0.16.tar.xz

---
 LICENSE                | 502 ++++++++++++++++++++++++++++++++
 Makefile               |   4 +-
 README.md              |   0
 help_debug.c           |   2 +-
 help_list.c            | 642 +++++++++++++++++++++++++++++++++++------
 include/help_defs.h    |   4 +
 include/help_enums.h   |   3 +-
 include/help_error.h   |  17 +-
 include/help_objlist.h |  98 ++++++-
 include/help_proto.h   |  32 +-
 include/help_structs.h |  42 ++-
 11 files changed, 1238 insertions(+), 108 deletions(-)
 create mode 100644 LICENSE
 delete mode 100644 README.md

diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..4362b49
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,502 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/Makefile b/Makefile
index f518ca5..462df86 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 # ******************************************************************************** #
 #       Copyright (C) 2018 Intel Corporation					   #
-#       Copyright (C) 2017-2018 Intel Corporation                                   #
+#       Copyright (C) 2017-2018 Intel Corporation                                  #
 #       Lantiq Beteiligungs-GmbH & Co. KG                                          #
 #       Lilienthalstrasse 15, 85579 Neubiberg, Germany                             #
 #       For licensing information, see the file 'LICENSE' in the root folder of    #
@@ -18,6 +18,6 @@ bins := libhelper.so
 
 libhelper.so_sources := $(wildcard *.c)
 libhelper.so_cflags := -I./include/ 
-libhelper.so_ldflags :=  
+libhelper.so_ldflags := -lsafec-3.3 
 	
 include make.inc
diff --git a/README.md b/README.md
deleted file mode 100644
index e69de29..0000000
diff --git a/help_debug.c b/help_debug.c
index f1bc395..2d2d8b3 100755
--- a/help_debug.c
+++ b/help_debug.c
@@ -148,7 +148,7 @@ int help_free(void* pcFree, char *pcFile, uint32_t iLine)
 #else
 	UNUSED_VAR(pcFile);
 	UNUSED_VAR(iLine);
-	if(pcFree)
+	if(pcFree != NULL)
         {
                 free(pcFree);
 		pcFree = NULL;
diff --git a/help_list.c b/help_list.c
index e94513f..c146bb2 100644
--- a/help_list.c
+++ b/help_list.c
@@ -18,6 +18,9 @@
 
 #include <stdio.h>
 #include <string.h>
+#include "libsafec/safe_str_lib.h"
+#include "libsafec/safe_lib.h"
+#include "libsafec/safe_mem_lib.h"
 #include "help_objlist.h"
 
 #ifndef LOG_LEVEL
@@ -49,13 +52,19 @@ int help_storeLocalDB(ObjList *wlObj, const char *pcPath)
 	char *paramValuePtr;
 	char *objName;
 	int objIndex = 0; //running index
-	int nRet = UGW_SUCCESS;
+	int nRet = UGW_SUCCESS, nFSt=-1;
 
 	ObjList *obj;
 	ParamList *param;
 	
-	FILE *fp = fopen(pcPath, "w");
-	if (!fp) {
+	FILE *fp=NULL;
+	if((nFSt=fopen_s(&fp, pcPath, "w")) != EOK){
+		LOGF_LOG_ERROR("Failed to open file for writing : %s\n",pcPath);
+		nRet = UGW_FAILURE;
+		goto finish;
+	}
+
+	if(fp == NULL){
 		LOGF_LOG_ERROR("Failed to open file for writing : %s\n",pcPath);
 		nRet = UGW_FAILURE;
 		goto finish;
@@ -82,7 +91,7 @@ int help_storeLocalDB(ObjList *wlObj, const char *pcPath)
 	}
 
 finish:
-	if(fp)
+	if(nFSt == EOK && fp != NULL)
 		fclose(fp);
 	return nRet;
 }
@@ -93,27 +102,32 @@ finish:
  *  ============================================================================*/
 int help_loadLocalDB(ObjList* wlObj, const char *pcPath)
 {
-	FILE* fp;
+	FILE* fp=NULL;
 	char* line = NULL;
 
-	unsigned int len = 0;
+	size_t len = 0;
+	size_t len1=0;
 	
 	char* parameterName = NULL;
-	char* parameterValue = NULL;
+	char* parameterValue = NULL,*pcSavePtr=NULL;
 
-	int	objCurrentIdx = -1;
+	int	objCurrentIdx = -1,nFSt=-1;
 	char objCurrentName[MAX_LEN_PARAM_NAME];
 
 	ObjList* obj = NULL;
 	int nRet = UGW_SUCCESS;
 
-	fp = fopen(pcPath, "r");
-	if (fp == NULL){
+	if((nFSt=fopen_s(&fp, pcPath, "r")) != EOK){
 		LOGF_LOG_ERROR("File Not Found : %s\n",pcPath);
 		nRet = UGW_FAILURE;
 		goto finish;
 	}
 
+	if(fp == NULL){
+		LOGF_LOG_ERROR("Failed to open file for writing : %s\n",pcPath);
+		nRet = UGW_FAILURE;
+		goto finish;
+	}
 	if ( wlObj == NULL) {
 		LOGF_LOG_ERROR("ERROR Null Pointer WlObj, can't return data \n");
 		nRet = UGW_FAILURE;
@@ -122,10 +136,15 @@ int help_loadLocalDB(ObjList* wlObj, const char *pcPath)
 
 	obj = wlObj;
 	while ( getline(&line, &len, fp) != -1 ) {
-		parameterName=strtok(line, "=");
-		parameterValue=strtok(NULL, "\n");
+		if((len1=strnlen_s(line,128+256)) <= 0){ //param+obj
+			LOGF_LOG_ERROR("fetchig len is failed\n");
+			nRet = UGW_FAILURE;
+			goto finish;
+		}
+
+		parameterName=strtok_s(line,&len1, "=", &pcSavePtr);
+		parameterValue=strtok_s(NULL, &len1, "\n", &pcSavePtr);
 
-		
 		if (parameterName == NULL)
 		{
 			nRet = UGW_FAILURE;
@@ -137,7 +156,7 @@ int help_loadLocalDB(ObjList* wlObj, const char *pcPath)
 			continue;
 		}
 
-		if ( ! strncmp(parameterName, "Object", strlen("Object")) ) {
+		if ( ! strncmp(parameterName, "Object", strnlen_s("Object",10)) ) {
 			objCurrentIdx =  indexFromString(parameterName);
 			if ( objCurrentIdx < 0 ) {
 				LOGF_LOG_ERROR("Illegal Object Index \n");
@@ -146,7 +165,11 @@ int help_loadLocalDB(ObjList* wlObj, const char *pcPath)
 			}
 
 			//strcpy(objCurrentName, parameterValue);
-			snprintf(objCurrentName, MAX_LEN_OBJNAME, "%s", parameterValue);
+			if (strncpy_s(objCurrentName, MAX_LEN_PARAM_NAME , parameterValue, MAX_LEN_PARAM_NAME) != EOK ) {
+				LOGF_LOG_ERROR("strncpy_s failed \n");
+				nRet = UGW_FAILURE;
+				goto finish;
+			}
 			obj = help_addObjList(obj, objCurrentName, 0, 0, 0, 0);
 			continue;
 		}
@@ -161,7 +184,7 @@ int help_loadLocalDB(ObjList* wlObj, const char *pcPath)
 	}
 
 finish:
-	if ( fp )
+	if (nFSt == EOK && fp != NULL)
 		fclose(fp);
 	if ( line )
 		free(line);
@@ -178,33 +201,45 @@ static void help_updateObjName( ObjList *pxObjSrc, ObjList *pxObjDst)
 {
 	ObjList *pxTmpObj;
 	char sBuf[MAX_LEN_OBJNAME]={0};
-	int nObjLen=0;
+	size_t nObjLen=0;
 
 	FOR_EACH_OBJ(pxObjSrc, pxTmpObj)
 	{
 		sBuf[0]='\0';
-		nObjLen = strlen(pxTmpObj->sObjName);
-		if (nObjLen > 1)
+		nObjLen = strnlen_s(pxTmpObj->sObjName,MAX_LEN_OBJNAME-1);
+		if (nObjLen > 1 && nObjLen < MAX_LEN_OBJNAME)
 	        {	
 			if(pxTmpObj->sObjName[nObjLen-1] != '.')
 			{
-				snprintf(sBuf, MAX_LEN_OBJNAME-1, "%s.", pxTmpObj->sObjName);
-				snprintf(pxTmpObj->sObjName, MAX_LEN_OBJNAME, "%s", sBuf);		
+				if (sprintf_s(sBuf, MAX_LEN_OBJNAME, "%s.", pxTmpObj->sObjName) <=0) {
+					LOGF_LOG_CRITICAL("sprintf_s failed\n");
+				}
+				if (sprintf_s(pxTmpObj->sObjName, MAX_LEN_OBJNAME, "%s", sBuf) <= 0) {
+					LOGF_LOG_CRITICAL("sprintf_s failed\n");
+				}
 			}
+		}else{
+			LOGF_LOG_CRITICAL("Invalid Length %zu \n", nObjLen);
 		}
 	}
 
 	FOR_EACH_OBJ(pxObjDst, pxTmpObj)
 	{
 		sBuf[0]='\0';
-		nObjLen = strlen(pxTmpObj->sObjName);
-		if (nObjLen > 1)
+		nObjLen = strnlen_s(pxTmpObj->sObjName,MAX_LEN_OBJNAME);
+		if (nObjLen > 1 && nObjLen < MAX_LEN_OBJNAME)
 		{
 			if(pxTmpObj->sObjName[nObjLen-1] != '.')
 			{
-				snprintf(sBuf, MAX_LEN_OBJNAME-1, "%s.", pxTmpObj->sObjName);
-				snprintf(pxTmpObj->sObjName, MAX_LEN_OBJNAME, "%s", sBuf);		
+				if (sprintf_s(sBuf, MAX_LEN_OBJNAME, "%s.", pxTmpObj->sObjName) <=0) {
+					LOGF_LOG_CRITICAL("sprintf_s failed\n");
+				}
+				if (sprintf_s(pxTmpObj->sObjName, MAX_LEN_OBJNAME, "%s", sBuf) <= 0) {
+					LOGF_LOG_CRITICAL("sprintf_s failed\n");
+				}
 			}
+		}else{
+			LOGF_LOG_CRITICAL("Invalid Length %zu \n", nObjLen);
 		}
 	}
 }
@@ -218,6 +253,12 @@ static void help_updateObjName( ObjList *pxObjSrc, ObjList *pxObjDst)
 OUT ObjAttrList *  help_addObjAttrList(IN ObjAttrList *pxObjList, IN const char *pcObjName, IN const char *pcWebName,IN uint32_t unFlag)           
 {
 	ObjAttrList *pxTmp;
+
+	if(pcObjName == NULL){
+		LOGF_LOG_ERROR("ObjectName Can't be empty\n");
+		return NULL;
+	}
+
 	pxTmp = HELP_MALLOC(sizeof(ObjAttrList));
 	if(!pxTmp) 
 	{
@@ -227,12 +268,16 @@ OUT ObjAttrList *  help_addObjAttrList(IN ObjAttrList *pxObjList, IN const char
 
 	if(pcObjName != NULL)
 	{
-		snprintf(pxTmp->sObjName,MAX_LEN_OBJNAME, "%s",pcObjName);
+		if (strncpy_s(pxTmp->sObjName,MAX_LEN_OBJNAME ,pcObjName, MAX_LEN_OBJNAME) != EOK) {
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 
 	if(pcWebName != NULL)
 	{
-		snprintf(pxTmp->sObjWebName,MAX_LEN_WEBNAME, "%s",pcWebName);
+		if (strncpy_s(pxTmp->sObjWebName,MAX_LEN_WEBNAME, pcWebName, MAX_LEN_WEBNAME) != EOK) {
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 
 	pxTmp->unObjAttr = unFlag;
@@ -252,6 +297,12 @@ ParamAttrList * help_addParamAttrList(IN ObjAttrList *pxObjList,IN const char *p
 			  IN uint32_t unParamFlag)
 {
 	ParamAttrList *pxTmp;
+
+	if(pcParamName == NULL){
+		LOGF_LOG_ERROR("ParameterName Can't be empty\n");
+		return NULL;
+	}
+
 	pxTmp = HELP_MALLOC(sizeof(ParamAttrList));
 	if(!pxTmp) 
 	{
@@ -261,27 +312,37 @@ ParamAttrList * help_addParamAttrList(IN ObjAttrList *pxObjList,IN const char *p
 	
 	if(pcParamName != NULL)
 	{
-		snprintf(pxTmp->sParamName, MAX_LEN_PARAM_NAME, "%s", pcParamName);
+		if (strncpy_s(pxTmp->sParamName, MAX_LEN_PARAM_NAME, pcParamName, MAX_LEN_PARAM_NAME) != EOK) {
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 	
 	if(pcParamProfile != NULL)
 	{
-		snprintf(pxTmp->sParamProfile, MAX_LEN_PROFILENAME, "%s", pcParamProfile);
+		if (strncpy_s(pxTmp->sParamProfile, MAX_LEN_PROFILENAME , pcParamProfile, MAX_LEN_PROFILENAME) != EOK) {
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 	
 	if(pcParamWebName != NULL)
 	{
-		snprintf(pxTmp->sParamWebName,MAX_LEN_WEBNAME, "%s",pcParamWebName);
+		if (strncpy_s(pxTmp->sParamWebName, MAX_LEN_WEBNAME ,pcParamWebName, MAX_LEN_WEBNAME) !=  EOK) {
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 	
 	if(pcValidVal != NULL)
 	{
-		snprintf(pxTmp->sParamValidVal, MAX_LEN_VALID_VALUE, "%s", pcValidVal);
+		if (strncpy_s(pxTmp->sParamValidVal, MAX_LEN_VALID_VALUE, pcValidVal, MAX_LEN_VALID_VALUE) != EOK) {
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 	
 	if(pcParamValue != NULL)
 	{
-		snprintf(pxTmp->sParamValue, MAX_LEN_PARAM_VALUE, "%s", pcParamValue);
+		if (strncpy_s(pxTmp->sParamValue, MAX_LEN_PARAM_VALUE, pcParamValue, MAX_LEN_PARAM_VALUE) != EOK) {
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 
 	pxTmp->unMinVal  = unMinVal;
@@ -301,6 +362,12 @@ ParamAttrList * help_addParamAttrList(IN ObjAttrList *pxObjList,IN const char *p
 OUT ObjACSList *  help_addAcsObjList(IN ObjACSList *pxObjList, IN const char *pcObjName, IN uint32_t unObjOper, IN uint32_t unFlag)           
 {
 	ObjACSList *pxTmp;
+	
+	if(pcObjName == NULL){
+		LOGF_LOG_CRITICAL("ObjectName can't be empty\n");
+		return NULL;
+	}
+
 	pxTmp = HELP_MALLOC(sizeof(ObjACSList));
 	if(!pxTmp) 
 	{
@@ -308,10 +375,12 @@ OUT ObjACSList *  help_addAcsObjList(IN ObjACSList *pxObjList, IN const char *pc
 		return NULL;
 	}
 
-	if((pcObjName != NULL) && (strlen(pcObjName) < MAX_LEN_OBJNAME) )
+	if((pcObjName != NULL) && (strnlen_s(pcObjName,MAX_LEN_OBJNAME) < MAX_LEN_OBJNAME) )
 	{
 		memset(pxTmp->sObjName, 0x0, MAX_LEN_OBJNAME);
-		snprintf(pxTmp->sObjName, MAX_LEN_OBJNAME, "%s", pcObjName);
+		if (strncpy_s(pxTmp->sObjName, MAX_LEN_OBJNAME, pcObjName, MAX_LEN_OBJNAME) != EOK) {
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 	else
 	{
@@ -346,31 +415,35 @@ OUT ParamACSList * help_addAcsParamList(IN ObjACSList *pxObjList, IN const char
 		return NULL;
 	}
 	
-	if( (pcParamName != NULL) && (strlen(pcParamName) < MAX_LEN_PARAM_NAME) )
+	if( (pcParamName != NULL) && (strnlen_s(pcParamName,MAX_LEN_PARAM_NAME) < MAX_LEN_PARAM_NAME) )
 	{
 		memset(pxTmp->sParamName, 0x0, MAX_LEN_PARAM_NAME);
-		snprintf(pxTmp->sParamName, MAX_LEN_PARAM_NAME, "%s", pcParamName);
+		if (strncpy_s(pxTmp->sParamName, MAX_LEN_PARAM_NAME, pcParamName, MAX_LEN_PARAM_NAME) != EOK ){
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 	else
 	{
 		if(pcParamName != NULL)
 		{
-			LOGF_LOG_CRITICAL("Param Name Buffer OverFlow ParamName[%s]: ParamNameLen[%zu]\n",pcParamName,strlen(pcParamName));
+			LOGF_LOG_CRITICAL("Param Name Buffer OverFlow ParamName[%s]: ParamNameLen[%zu]\n",pcParamName,strnlen_s(pcParamName,MAX_LEN_PARAM_NAME));
 		}
 		HELP_FREE(pxTmp);
 		return NULL;
 	}
 
-	if((pcParamValue != NULL) && (strlen(pcParamValue) < MAX_LEN_PARAM_VALUE) )
+	if((pcParamValue != NULL) && (strnlen_s(pcParamValue,MAX_LEN_PARAM_VALUE) < MAX_LEN_PARAM_VALUE) )
 	{
 		memset(pxTmp->sParamValue, 0x0, MAX_LEN_PARAM_VALUE);
-		snprintf(pxTmp->sParamValue, MAX_LEN_PARAM_VALUE, "%s", pcParamValue);
+		if (strncpy_s(pxTmp->sParamValue, MAX_LEN_PARAM_VALUE, pcParamValue, MAX_LEN_PARAM_VALUE) != EOK ) {
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 	else
 	{
 		if((pcParamValue != NULL))
 		{
-			LOGF_LOG_CRITICAL("Param Value Buffer OverFlow ParamName [%s] ParamValue[%s]: ParamValueLen[%zu]\n",pcParamName,pcParamValue,strlen(pcParamValue));
+			LOGF_LOG_CRITICAL("Param Value Buffer OverFlow ParamName [%s] ParamValue[%s]: ParamValueLen[%zu]\n",pcParamName,pcParamValue,strnlen_s(pcParamValue,MAX_LEN_PARAM_VALUE));
 			HELP_FREE(pxTmp);
 			return NULL;
 		}
@@ -390,6 +463,12 @@ OUT ParamACSList * help_addAcsParamList(IN ObjACSList *pxObjList, IN const char
 OUT ObjList *  help_addObjList(IN ObjList *pxObjList, IN const char *pcObjName, IN uint16_t unSid, IN uint16_t unOid, IN uint32_t unObjOper, IN uint32_t unFlag)           
 {
 	ObjList *pxTmp;
+
+	if(pcObjName == NULL){
+		LOGF_LOG_CRITICAL("ObjectName Can't be empty \n");
+		return NULL;
+	}
+
 	pxTmp = HELP_MALLOC(sizeof(ObjList));
 	if(!pxTmp) 
 	{
@@ -397,10 +476,12 @@ OUT ObjList *  help_addObjList(IN ObjList *pxObjList, IN const char *pcObjName,
 		return NULL;
 	}
 
-	if((pcObjName != NULL) && (strlen(pcObjName) < MAX_LEN_OBJNAME) )
+	if((pcObjName != NULL) && (strnlen_s(pcObjName,MAX_LEN_OBJNAME) < MAX_LEN_OBJNAME) )
 	{
 		memset(pxTmp->sObjName, 0x0, MAX_LEN_OBJNAME);
-		snprintf(pxTmp->sObjName, MAX_LEN_OBJNAME, "%s", pcObjName);
+		if (strncpy_s(pxTmp->sObjName, MAX_LEN_OBJNAME, pcObjName, MAX_LEN_OBJNAME) != EOK) {
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 	else
 	{
@@ -419,6 +500,82 @@ OUT ObjList *  help_addObjList(IN ObjList *pxObjList, IN const char *pcObjName,
 	return pxTmp;
 }
 
+/*  =============================================================================
+ *   Function Name 	: help_addUCIConfigData					*
+ *   Description 	: Function to add  UCIConfigDatato the head node	*
+ *  ============================================================================*/
+OUT UCIConfigData* help_addUCIConfigData(IN UCIConfigData *pxUCIConfigData)
+{
+	ParamList *__pxTmpConfParam = NULL;
+	ParamList *__pxTmpValParam = NULL;
+	ValueList *__pxTmpValueList = NULL;
+	ArrayList *__pxTmpArrayList = NULL;
+	UCIConfigData *pxTmp = NULL;
+
+	pxTmp = HELP_MALLOC(sizeof(UCIConfigData));
+	if(!pxTmp)
+	{
+		LOGF_LOG_CRITICAL(" malloc failed\n");
+		return NULL;
+	}
+
+	list_add_tail( &(pxTmp->xClist), &(pxUCIConfigData->xClist) );
+
+	__pxTmpConfParam = HELP_MALLOC(sizeof(ParamList));
+	if(!__pxTmpConfParam)
+	{
+		LOGF_LOG_CRITICAL(" malloc failed\n");
+
+		free(pxTmp);
+
+		return NULL;
+	}
+	INIT_LIST_HEAD(&(__pxTmpConfParam->xPlist)); 
+	pxTmp->pxConfigList = (void *)__pxTmpConfParam;
+
+	__pxTmpValueList = HELP_MALLOC(sizeof(ValueList));
+	if(!__pxTmpValueList)
+	{
+		LOGF_LOG_CRITICAL(" malloc failed\n");
+
+		free(pxTmp);
+		free(__pxTmpConfParam);
+
+		return NULL;
+	}
+	pxTmp->pxValueList = (void *)__pxTmpValueList;
+
+	__pxTmpValParam = HELP_MALLOC(sizeof(ParamList));
+	if(!__pxTmpValParam)
+	{
+		LOGF_LOG_CRITICAL(" malloc failed\n");
+
+		free(pxTmp);
+		free(__pxTmpConfParam);
+		free(__pxTmpValueList);
+
+		return NULL;
+	}
+	INIT_LIST_HEAD(&(__pxTmpValParam->xPlist)); 
+	pxTmp->pxValueList->pxParamValueList = (void *)__pxTmpValParam;
+
+	__pxTmpArrayList = HELP_MALLOC(sizeof(ArrayList));
+	if(!__pxTmpArrayList)
+	{
+		LOGF_LOG_CRITICAL(" malloc failed\n");
+		free(pxTmp);
+		free(__pxTmpConfParam);
+		free(__pxTmpValueList);
+		free(__pxTmpValParam);
+		return NULL;
+	}
+
+	INIT_LIST_HEAD(&(__pxTmpArrayList->xClist));
+	pxTmp->pxValueList->pxArrayValueList = (void *)__pxTmpArrayList;
+
+	return pxTmp;
+}
+
 /*  =============================================================================
  *   Function Name 	: help_addParamList					*
  *   Description 	: Function to add parameter list to the head node	*
@@ -427,6 +584,12 @@ OUT ParamList * help_addParamList(IN ObjList *pxObjList,IN const char *pcParamNa
 			IN const char *pcParamValue,IN uint32_t unFlag)
 {
 	ParamList *pxTmp;
+	
+	if(pcParamName == NULL){
+		LOGF_LOG_CRITICAL("Invalid ParameterName can't be empty\n");
+		return NULL;
+	}
+
 	pxTmp = HELP_MALLOC(sizeof(ParamList));
 	if(!pxTmp) 
 	{
@@ -434,16 +597,18 @@ OUT ParamList * help_addParamList(IN ObjList *pxObjList,IN const char *pcParamNa
 		return NULL;
 	}
 	
-	if( (pcParamName != NULL) && (strlen(pcParamName) < MAX_LEN_PARAM_NAME) )
+	if( (pcParamName != NULL) && (strnlen_s(pcParamName,MAX_LEN_PARAM_NAME) < MAX_LEN_PARAM_NAME) )
 	{
 		memset(pxTmp->sParamName, 0x0, MAX_LEN_PARAM_NAME);
-		snprintf(pxTmp->sParamName, MAX_LEN_PARAM_NAME, "%s", pcParamName);
+		if (strncpy_s(pxTmp->sParamName, MAX_LEN_PARAM_NAME, pcParamName, MAX_LEN_PARAM_NAME) != EOK) {
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 	else
 	{
 		if(pcParamName != NULL)
 		{
-			LOGF_LOG_CRITICAL("Param Name Buffer OverFlow ParamName[%s]: ParamNameLen[%zu]\n",pcParamName,strlen(pcParamName));
+			LOGF_LOG_CRITICAL("Param Name Buffer OverFlow ParamName[%s]: ParamNameLen[%zu]\n",pcParamName,strnlen_s(pcParamName,MAX_LEN_PARAM_NAME));
 		}
 		HELP_FREE(pxTmp);
 		return NULL;
@@ -452,16 +617,18 @@ OUT ParamList * help_addParamList(IN ObjList *pxObjList,IN const char *pcParamNa
 	
 	pxTmp->unParamId = unParamId;
 
-	if((pcParamValue != NULL) && (strlen(pcParamValue) < MAX_LEN_PARAM_VALUE) )
+	if((pcParamValue != NULL) && (strnlen_s(pcParamValue,MAX_LEN_PARAM_VALUE) < MAX_LEN_PARAM_VALUE) )
 	{
 		memset(pxTmp->sParamValue, 0x0, MAX_LEN_PARAM_VALUE);
-		snprintf(pxTmp->sParamValue, MAX_LEN_PARAM_VALUE, "%s", pcParamValue);
+		if (strncpy_s(pxTmp->sParamValue, MAX_LEN_PARAM_VALUE, pcParamValue, MAX_LEN_PARAM_VALUE) != EOK){
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 	else
 	{
 		if((pcParamValue != NULL))
 		{
-			LOGF_LOG_CRITICAL("Param Value Buffer OverFlow ParamName [%s] ParamValue[%s]: ParamValueLen[%zu]\n",pcParamName,pcParamValue,strlen(pcParamValue));
+			LOGF_LOG_CRITICAL("Param Value Buffer OverFlow ParamName [%s] ParamValue[%s]: ParamValueLen[%zu]\n",pcParamName,pcParamValue,strnlen_s(pcParamValue,MAX_LEN_PARAM_VALUE));
 			HELP_FREE(pxTmp);
 			return NULL;
 		}
@@ -482,6 +649,12 @@ ParamList * help_paramListOnly(IN ParamList *pxParamList,IN const char *pcParamN
 			IN const char *pcParamValue,IN uint32_t unFlag)
 {
 	ParamList *pxTmp;
+
+	if(pcParamName == NULL){
+		LOGF_LOG_CRITICAL("Invalid ParameterName can't be empty\n");
+		return NULL;
+	}
+
 	pxTmp = HELP_MALLOC(sizeof(ParamList));
 	if(!pxTmp) 
 	{
@@ -489,10 +662,12 @@ ParamList * help_paramListOnly(IN ParamList *pxParamList,IN const char *pcParamN
 		return NULL;
 	}
 	
-	if((pcParamName != NULL) && (strlen(pcParamName) < MAX_LEN_PARAM_NAME) )
+	if((pcParamName != NULL) && (strnlen_s(pcParamName,MAX_LEN_PARAM_NAME) < MAX_LEN_PARAM_NAME) )
 	{
 		memset(pxTmp->sParamName, 0x0, MAX_LEN_PARAM_NAME);
-		snprintf(pxTmp->sParamName, MAX_LEN_PARAM_NAME, "%s", pcParamName);
+		if(strncpy_s(pxTmp->sParamName, MAX_LEN_PARAM_NAME, pcParamName, MAX_LEN_PARAM_NAME) != EOK) {
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 	else
 	{
@@ -506,16 +681,18 @@ ParamList * help_paramListOnly(IN ParamList *pxParamList,IN const char *pcParamN
 	
 	pxTmp->unParamId = unParamId;
 
-	if((pcParamValue != NULL) && (strlen(pcParamValue) < MAX_LEN_PARAM_VALUE) )
+	if((pcParamValue != NULL) && (strnlen_s(pcParamValue,MAX_LEN_PARAM_VALUE) < MAX_LEN_PARAM_VALUE) )
 	{
 		memset(pxTmp->sParamValue, 0x0, MAX_LEN_PARAM_VALUE);
-		snprintf(pxTmp->sParamValue, MAX_LEN_PARAM_VALUE, "%s", pcParamValue);
+		if (strncpy_s(pxTmp->sParamValue, MAX_LEN_PARAM_VALUE, pcParamValue, MAX_LEN_PARAM_VALUE) != EOK) {
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 	else
 	{
 		if((pcParamValue != NULL))
 		{
-			LOGF_LOG_CRITICAL("Param Value Buffer OverFlow ParamName [%s] ParamValue[%s]: ParamValueLen[%zu]\n",pcParamName,pcParamValue,strlen(pcParamValue));
+			LOGF_LOG_CRITICAL("Param Value Buffer OverFlow ParamName [%s] ParamValue[%s]: ParamValueLen[%zu]\n",pcParamName,pcParamValue,strnlen_s(pcParamValue,MAX_LEN_PARAM_VALUE));
 			HELP_FREE(pxTmp);
 			return NULL;
 		}
@@ -538,38 +715,38 @@ void help_printObj(IN void *pxObj,uint32_t unSubOper)
 		ObjList *pxTmpObj;
 		ParamList *pxParam;
 		
-		printf("\n @@@ PRINT OBJLIST START @@@\n");
+		fprintf(stderr,"\n @@@ PRINT OBJLIST START @@@\n");
 		
 		FOR_EACH_OBJ(pxObj,pxTmpObj)
 		{
-			printf("\"%s\": { \n",GET_OBJ_NAME(pxTmpObj));
-			printf("\t\t \"Sid\" :\"%d\",\n",GET_OBJ_SID(pxTmpObj));
-			printf("\t\t \"Oid\" : \"%d\",\n", GET_OBJ_OID(pxTmpObj));
+			fprintf(stderr,"\"%s\": { \n",GET_OBJ_NAME(pxTmpObj));
+			fprintf(stderr,"\t\t \"Sid\" :\"%d\",\n",GET_OBJ_SID(pxTmpObj));
+			fprintf(stderr,"\t\t \"Oid\" : \"%d\",\n", GET_OBJ_OID(pxTmpObj));
 
 			if (IS_SOPT_OBJNAME(unSubOper))
 			{
-				printf("\t\t \"ObjOper\" : \"%d\"\n",GET_OBJ_SUBOPER(pxTmpObj));
+				fprintf(stderr,"\t\t \"ObjOper\" : \"%d\"\n",GET_OBJ_SUBOPER(pxTmpObj));
 			}
 			else
 			{
-				printf("\t\t \"ObjOper\" : \"%d\",\n",GET_OBJ_SUBOPER(pxTmpObj));
+				fprintf(stderr,"\t\t \"ObjOper\" : \"%d\",\n",GET_OBJ_SUBOPER(pxTmpObj));
 			}
 			
-			printf("\t\t \"Flag\" : \"0x%x\",\n",GET_OBJ_FLAG(pxTmpObj));
+			fprintf(stderr,"\t\t \"Flag\" : \"0x%x\",\n",GET_OBJ_FLAG(pxTmpObj));
 
 			FOR_EACH_PARAM(pxTmpObj,pxParam)
 			{
 				
-				printf("\t\t \"%s\": { \n",GET_PARAM_NAME(pxParam));
-				printf("\t\t\t \"paramId\" : \"%d\",\n",GET_PARAM_ID(pxParam)); 
-				printf("\t\t\t \"paramValue\" : \"%s\",\n",GET_PARAM_VALUE(pxParam)); 
-				printf("\t\t\t \"paramFlag\" : \"0x%x\"\n",GET_PARAM_FLAG(pxParam)); 
-				printf("\t\t },\n");
+				fprintf(stderr,"\t\t \"%s\": { \n",GET_PARAM_NAME(pxParam));
+				fprintf(stderr,"\t\t\t \"paramId\" : \"%d\",\n",GET_PARAM_ID(pxParam)); 
+				fprintf(stderr,"\t\t\t \"paramValue\" : \"%s\",\n",GET_PARAM_VALUE(pxParam)); 
+				fprintf(stderr,"\t\t\t \"paramFlag\" : \"0x%x\"\n",GET_PARAM_FLAG(pxParam)); 
+				fprintf(stderr,"\t\t },\n");
 			}
-			printf("\t },\n");
+			fprintf(stderr,"\t },\n");
 		}
-		printf(" }\n");
-		printf("\n @@@@@@ PRINT OBJLIST END @@@@@@\n");
+		fprintf(stderr," }\n");
+		fprintf(stderr,"\n @@@@@@ PRINT OBJLIST END @@@@@@\n");
 	}
 	else if (IS_SOPT_OBJATTR(unSubOper))
 	{
@@ -653,6 +830,54 @@ void help_printParamList(IN ParamList *pxParamList)
 	fprintf(stderr,"}\n");
 }
 
+/*  =============================================================================
+ *   Function Name 	: help_printUCIConfigData				*
+ *   Description 	: Function to traverse list and dump UCIConfigData	*
+ *  ============================================================================*/
+void help_printUCIConfigData(IN UCIConfigData *pxUCIConfigData)
+{
+	UCIConfigData *pxTempConf = NULL;
+	ParamList *pxParam = NULL;
+	ArrayList *pxArrayValueListTmp = NULL;
+
+	fprintf(stderr,"\n @@@@@@ PRINT UCIConfigData START @@@@@@\n");
+	fprintf(stderr," {\n");
+
+	FOR_EACH_CONFIG(pxUCIConfigData, pxTempConf) {
+		fprintf(stderr,"\t {\n");
+
+		if (pxTempConf->pxConfigList != NULL) {
+			FOR_EACH_PARAM_ONLY(pxTempConf->pxConfigList, pxParam) {
+				fprintf(stderr,"\t\t \"%s\" : \"%s\",\n",GET_PARAM_NAME(pxParam), GET_PARAM_VALUE(pxParam));
+			}
+		}
+
+		if (pxTempConf->pxValueList->pxParamValueList != NULL) {
+			FOR_EACH_PARAM_ONLY(pxTempConf->pxValueList->pxParamValueList, pxParam) {
+				fprintf(stderr,"\t\t \"%s\" : \"%s\",\n",GET_PARAM_NAME(pxParam), GET_PARAM_VALUE(pxParam));
+			}
+		}
+
+		if (pxTempConf->pxValueList->pxArrayValueList != NULL) {
+			FOR_EACH_ARRAYLIST(pxTempConf->pxValueList->pxArrayValueList, pxArrayValueListTmp) {
+				if (pxArrayValueListTmp->pxArrayValues != NULL) {
+					fprintf(stderr,"\t\t \"%s\": [\n", pxArrayValueListTmp->sArrayName);
+					FOR_EACH_PARAM_ONLY(pxArrayValueListTmp->pxArrayValues, pxParam) {
+						fprintf(stderr,"\t\t\t \"%s\",\n", GET_PARAM_VALUE(pxParam));
+					}
+					fprintf(stderr,"\t\t ],\n");
+				}
+			}
+		}
+		fprintf(stderr,"\t },\n");
+	}
+
+	fprintf(stderr," }\n");
+	fprintf(stderr,"\n @@@@@@ PRINT UCIConfigData END @@@@@@\n");
+
+	return;
+}
+
 /*  =============================================================================
  *   Function Name 	: help_delCurObj						*
  *   Description 	: Function to traverse list and free objects 		*
@@ -717,6 +942,7 @@ int help_delCurObj(IN void *pObj, const char * pcObjName, IN uint32_t unSubOper)
 	}
 return UGW_SUCCESS;
 }
+
 /*  =============================================================================
  *   Function Name 	: help_delObj						*
  *   Description 	: Function to traverse list and free objects 		*
@@ -799,6 +1025,80 @@ void help_delObj(IN void *pObj, IN uint32_t unSubOper,IN uint32_t unFlag)
 	}
 }
 
+
+/*  =============================================================================
+ *   Function Name 	: help_delConf						*
+ *   Description 	: Function to traverse list and free  pxUCIConfigData	*
+ *  ============================================================================*/
+void help_delConf(IN void *pxUCIConfigData)
+{
+	bool bEmptyList = 1;
+	UCIConfigData *pxTempConf = NULL;
+	ParamList *pxParamList = NULL;
+	ArrayList *pxArrayList = NULL;
+	ArrayList *pxArrayValueListTmp = NULL;
+	UCIConfigData *pxConfList = NULL;
+
+	pxConfList = pxUCIConfigData;
+	while( !list_empty(&pxConfList->xClist) )
+	{
+		bEmptyList = 0;
+		pxTempConf = list_entry(pxConfList->xClist.next, UCIConfigData, xClist);
+
+		if (pxTempConf->pxConfigList != NULL) {
+			while( !list_empty(&pxTempConf->pxConfigList->xPlist) )
+			{
+				pxParamList = list_entry(pxTempConf->pxConfigList->xPlist.next, ParamList, xPlist);
+				list_del(&pxParamList->xPlist);
+				free(pxParamList);
+				pxParamList = NULL;
+			}
+		}
+
+
+		if (pxTempConf->pxValueList->pxArrayValueList != NULL) {
+			FOR_EACH_ARRAYLIST(pxTempConf->pxValueList->pxArrayValueList, pxArrayValueListTmp) {
+				if (pxArrayValueListTmp->pxArrayValues != NULL) {
+					while( !list_empty(&pxArrayValueListTmp->pxArrayValues->xPlist) )
+					{
+						pxParamList = list_entry(pxArrayValueListTmp->pxArrayValues->xPlist.next, ParamList, xPlist);
+						list_del(&pxParamList->xPlist);
+						free(pxParamList);
+						pxParamList = NULL;
+					}
+				}
+			}
+
+			while( !list_empty(&pxTempConf->pxValueList->pxArrayValueList->xClist) )
+			{
+				pxArrayList = list_entry(pxTempConf->pxValueList->pxArrayValueList->xClist.next, ArrayList, xClist);
+				list_del(&pxArrayList->xClist);
+				free(pxArrayList);
+				pxArrayList = NULL;
+			}
+		}
+
+		if (pxTempConf->pxValueList->pxParamValueList != NULL) {
+			while( !list_empty(&pxTempConf->pxValueList->pxParamValueList->xPlist) )
+			{
+				pxParamList = list_entry(pxTempConf->pxValueList->pxParamValueList->xPlist.next, ParamList, xPlist);
+				list_del(&pxParamList->xPlist);
+				free(pxParamList);
+				pxParamList = NULL;
+			}
+		}
+
+		list_del(&pxTempConf->xClist);
+		free(pxTempConf);
+		pxTempConf = NULL;
+	}
+
+	if ((pxUCIConfigData != NULL) && (!bEmptyList))
+	{
+		free(pxUCIConfigData);
+	}
+}
+
 /*  =============================================================================
  *   Function Name 	: help_delParam						*
  *   Description 	: Function to traverse Param list and free objects 	*
@@ -916,6 +1216,12 @@ static int help_addParam(IN ParamList *pxParam, IN const char *pcParamName, IN u
 			IN const char *pcParamValue, IN uint32_t unFlag)
 {
 	ParamList *pxTmp;
+
+	if(pcParamName == NULL){
+		LOGF_LOG_CRITICAL("Invalid ParameterName can't be empty\n");
+		return UGW_FAILURE;
+	}
+
 	pxTmp = HELP_MALLOC(sizeof(ParamList));
 	if(!pxTmp) 
 	{
@@ -923,9 +1229,11 @@ static int help_addParam(IN ParamList *pxParam, IN const char *pcParamName, IN u
 		return ERR_MEMORY_ALLOC_FAILED;
 	}
 	
-	if((pcParamName != NULL) && (strlen(pcParamName) < MAX_LEN_PARAM_NAME) )
+	if((pcParamName != NULL) && (strnlen_s(pcParamName,MAX_LEN_PARAM_NAME) < MAX_LEN_PARAM_NAME) )
 	{
-		snprintf(pxTmp->sParamName, MAX_LEN_PARAM_NAME, "%s", pcParamName);
+		if (strncpy_s(pxTmp->sParamName, MAX_LEN_PARAM_NAME, pcParamName, MAX_LEN_PARAM_NAME) != EOK) {
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 	else
 	{
@@ -939,15 +1247,17 @@ static int help_addParam(IN ParamList *pxParam, IN const char *pcParamName, IN u
 	
 	pxTmp->unParamId = unParamId;
 	
-	if((pcParamValue != NULL) && (strlen(pcParamValue) < MAX_LEN_PARAM_VALUE) )
+	if((pcParamValue != NULL) && (strnlen_s(pcParamValue,MAX_LEN_PARAM_VALUE) < MAX_LEN_PARAM_VALUE) )
 	{
-		snprintf(pxTmp->sParamValue, MAX_LEN_PARAM_VALUE, "%s", pcParamValue);
+		if (strncpy_s(pxTmp->sParamValue, MAX_LEN_PARAM_VALUE, pcParamValue, MAX_LEN_PARAM_VALUE) != EOK) {
+			LOGF_LOG_CRITICAL("strncpy_s failed\n");
+		}
 	}
 	else
 	{
 		if((pcParamValue != NULL))
 		{
-			LOGF_LOG_CRITICAL("Param value Buffer OverFlow ParamName[%s] ParamValue[%s] ParamLen[%zu]\n",pcParamName, pcParamValue, strlen(pcParamValue));
+			LOGF_LOG_CRITICAL("Param value Buffer OverFlow ParamName[%s] ParamValue[%s] ParamLen[%zu]\n",pcParamName, pcParamValue, strnlen_s(pcParamValue,MAX_LEN_PARAM_VALUE));
 			HELP_FREE(pxTmp);
 			return UGW_FAILURE;
 		}
@@ -1046,11 +1356,11 @@ uint32_t help_editNode (INOUT ObjList *pxDstObjList, IN char *pcObjName, IN char
 	FOR_EACH_OBJ(pxDstObjList,pxTmpObjDst)
 	{
 		nRet = UGW_FAILURE;
-		if ( (strncmp(pxTmpObjDst->sObjName,pcObjName,strlen(pxTmpObjDst->sObjName)) == 0) && (strlen(pcObjName) == strlen(pxTmpObjDst->sObjName)) )
+		if ( (strncmp(pxTmpObjDst->sObjName,pcObjName,strnlen_s(pxTmpObjDst->sObjName,MAX_LEN_OBJNAME)) == 0) && (strnlen_s(pcObjName,MAX_LEN_OBJNAME) == strnlen_s(pxTmpObjDst->sObjName,MAX_LEN_OBJNAME)) )
                 {
 			FOR_EACH_PARAM(pxTmpObjDst,pxParam)
 			{
-				if ( (strcmp(pxParam->sParamName,pcParamName) == 0 ) && (strlen(pxParam->sParamName) == strlen(pcParamName)))
+				if ( (strcmp(pxParam->sParamName,pcParamName) == 0 ) && (strnlen_s(pxParam->sParamName,MAX_LEN_PARAM_NAME) == strnlen_s(pcParamName,MAX_LEN_PARAM_NAME)))
 				{
 					if(pcParamValue != NULL)
 					{
@@ -1060,9 +1370,11 @@ uint32_t help_editNode (INOUT ObjList *pxDstObjList, IN char *pcObjName, IN char
 							LOGF_LOG_INFO("Input and output ptrs are the same. Skipping update\n");
 							nRet = UGW_SUCCESS;
 						}
-						else if(strlen(pcParamValue) < MAX_LEN_PARAM_VALUE )
+						else if(strnlen_s(pcParamValue,MAX_LEN_PARAM_VALUE) < MAX_LEN_PARAM_VALUE )
 						{
-							snprintf(pxParam->sParamValue,MAX_LEN_PARAM_VALUE, "%s", pcParamValue);
+							if (strncpy_s(pxParam->sParamValue,MAX_LEN_PARAM_VALUE, pcParamValue, MAX_LEN_PARAM_VALUE) != EOK) {
+								LOGF_LOG_CRITICAL("strncpy_s failed\n");
+							}
 							nRet = UGW_SUCCESS;	
 						}
 						else
@@ -1096,11 +1408,11 @@ uint32_t help_editSelfNode(INOUT ObjList *pxDstObjList, IN char *pcObjName, IN c
 {
 	ParamList *pxParam;
 	uint32_t nRet = UGW_FAILURE;
-	if( (strcmp(pxDstObjList->sObjName, pcObjName) == 0) && (strlen(pxDstObjList->sObjName) == strlen(pcObjName)) )
+	if( (strcmp(pxDstObjList->sObjName, pcObjName) == 0) && (strnlen_s(pxDstObjList->sObjName,MAX_LEN_OBJNAME) == strnlen_s(pcObjName,MAX_LEN_OBJNAME)) )
 	{
 		FOR_EACH_PARAM(pxDstObjList,pxParam)
 		{
-			if ( (strcmp(pxParam->sParamName,pcParamName) == 0 ) && (strlen(pxParam->sParamName) == strlen(pcParamName)))
+			if ( (strcmp(pxParam->sParamName,pcParamName) == 0 ) && (strnlen_s(pxParam->sParamName,MAX_LEN_PARAM_NAME) == strnlen_s(pcParamName,MAX_LEN_PARAM_NAME)))
 			{
 				if(pcParamValue != NULL)
 				{
@@ -1110,9 +1422,11 @@ uint32_t help_editSelfNode(INOUT ObjList *pxDstObjList, IN char *pcObjName, IN c
 						LOGF_LOG_INFO("Input and output ptrs are the same. Skipping update\n");
 						nRet = UGW_SUCCESS;
 					}
-					else if(strlen(pcParamValue) < MAX_LEN_PARAM_VALUE)
+					else if(strnlen_s(pcParamValue,MAX_LEN_PARAM_VALUE) < MAX_LEN_PARAM_VALUE)
 					{
-						snprintf(pxParam->sParamValue,MAX_LEN_PARAM_VALUE, "%s", pcParamValue);
+						if (strncpy_s(pxParam->sParamValue,MAX_LEN_PARAM_VALUE, pcParamValue, MAX_LEN_PARAM_VALUE) != EOK) {
+							LOGF_LOG_CRITICAL("strncpy_s failed\n");
+						}
 						nRet = UGW_SUCCESS;	
 					}
 					else
@@ -1206,11 +1520,11 @@ ObjList* help_getObjPtr(ObjList *pxObj, const char *paramName, const char *param
 	{
 		FOR_EACH_PARAM(pxTmpObj,pxTmpParam)
 		{
-			if((strcmp(paramName,pxTmpParam->sParamName) == 0 ) && (strlen(paramName) == strlen(pxTmpParam->sParamName)))
+			if((strcmp(paramName,pxTmpParam->sParamName) == 0 ) && (strnlen_s(paramName,MAX_LEN_PARAM_NAME) == strnlen_s(pxTmpParam->sParamName,MAX_LEN_PARAM_NAME)))
 			{
 				if(paramValue != NULL)
 				{
-			 		if( (strcmp(paramValue,pxTmpParam->sParamValue) == 0 )  && (strlen(paramValue) == strlen(pxTmpParam->sParamValue))) 
+			 		if( (strcmp(paramValue,pxTmpParam->sParamValue) == 0 )  && (strnlen_s(paramValue,MAX_LEN_PARAM_VALUE) == strnlen_s(pxTmpParam->sParamValue,MAX_LEN_PARAM_VALUE))) 
 					{
 						return pxTmpObj;
 					}
@@ -1270,7 +1584,7 @@ int help_moveObjList(ObjList *pxDstObj, ObjList *pxSrcObj, const char * pcObjNam
 	
 	FOR_EACH_OBJ(pxSrcObj,pxTmpObj)
 	{
-		if((strcmp(GET_OBJ_NAME(pxTmpObj), pcObjName) == 0) && (strlen(GET_OBJ_NAME(pxTmpObj)) == strlen(pcObjName)))
+		if((strcmp(GET_OBJ_NAME(pxTmpObj), pcObjName) == 0) && (strnlen_s(GET_OBJ_NAME(pxTmpObj),MAX_LEN_OBJNAME) == strnlen_s(pcObjName,MAX_LEN_OBJNAME)))
 		{
 			help_copyObjList(pxDstObj, unFlag, pxTmpObj);
 			/* delete node from the src */
@@ -1334,7 +1648,9 @@ int help_getValue(IN ObjList *pxObj, IN uint32_t unOid, IN uint32_t unInstance,
 				{
 					if (pxParam->unParamId == unParamId) 
 					{
-						snprintf(pcVal, MAX_LEN_PARAM_VALUE, "%s", pxParam->sParamValue);
+						if (strncpy_s(pcVal, MAX_LEN_PARAM_VALUE, pxParam->sParamValue, MAX_LEN_PARAM_VALUE) != EOK) {
+							LOGF_LOG_CRITICAL("strncpy_s failed\n");
+						}
 						nRet = UGW_SUCCESS;
 						return nRet;
 					}
@@ -1356,7 +1672,9 @@ int help_getValue(IN ObjList *pxObj, IN uint32_t unOid, IN uint32_t unInstance,
 					{
 						if (pxParam->unParamId == unParamId) 
 						{
-							snprintf(pcVal, MAX_LEN_PARAM_VALUE, "%s", pxParam->sParamValue);
+							if (strncpy_s(pcVal, MAX_LEN_PARAM_VALUE, pxParam->sParamValue, MAX_LEN_PARAM_VALUE) != EOK) {
+								LOGF_LOG_CRITICAL("strncpy_s failed\n");
+							}		
 							nRet = UGW_SUCCESS;
 							return nRet;
 						}
@@ -1367,7 +1685,133 @@ int help_getValue(IN ObjList *pxObj, IN uint32_t unOid, IN uint32_t unInstance,
 	}
 	return nRet;
 }
- 
+
+/*  =============================================================================
+ *   Function Name 	: help_getUCIValue					*
+ *   Description 	: Function to get the value from Objlist		*
+ *  ============================================================================*/
+int help_getUCIValue(IN UCIConfigData *pxUCIConfigData, IN char *psType, IN char *psName, IN char *psOptionName, OUT char **psValue, char *psValueType)
+{
+	int nRet = UGW_SUCCESS;
+	int nLen = 0;
+	int nOldLen = 0;
+	bool bNextConfigSec = 0;
+	bool bValFound = 0;
+	char *psTemp = NULL;
+	ParamList *pxParam = NULL;
+	ParamList *pxParam1 = NULL;
+	UCIConfigData *pxConfig = NULL;
+	UCIConfigData *pxSectionHead = NULL;
+	ArrayList *pxArrayValueListTmp = NULL;
+
+	LOGF_LOG_DEBUG("Trying to find Config Parameter:%s (%s Type) of Config Type:%s in Config Section:%s ...\n", psOptionName, psValueType, psType, psName);
+
+	if ((psType == NULL) || (psName  == NULL)) {
+		LOGF_LOG_ERROR("Config Type and Config Section is not mandatory to get config value.\n");
+		return UGW_FAILURE;
+	}
+
+	*psValue = NULL;
+
+	FOR_EACH_CONFIG(pxUCIConfigData, pxConfig) {
+		bNextConfigSec = 0;
+		if (pxConfig->pxConfigList != NULL) {
+			FOR_EACH_PARAM_ONLY(pxConfig->pxConfigList, pxParam) {
+				LOGF_LOG_DEBUG("pxParam->sParamName:|%s| Section Name |%s| pxParam->sParamValue:|%s| \n", pxParam->sParamName, psName, pxParam->sParamValue);
+				if (strcmp(pxParam->sParamName, ".name") == 0) {
+					if (strcmp(pxParam->sParamValue, psName) == 0) { /* Section Name Matched */
+						FOR_EACH_PARAM_ONLY(pxConfig->pxConfigList, pxParam1) {
+							LOGF_LOG_DEBUG("pxParam->sParamName:|%s| Section Type: |%s| pxParam->sParamValue:|%s|\n", pxParam1->sParamName, psType, pxParam1->sParamValue);
+							if (strcmp(pxParam1->sParamName, ".type") == 0) {
+								if (strcmp(pxParam1->sParamValue, psType) == 0) { /* Section Type Matched */
+									LOGF_LOG_DEBUG("Section found.\n");
+									pxSectionHead =  pxConfig;
+									goto sectionfound;
+								} else {
+									bNextConfigSec = 1;
+								}
+							}
+							if (bNextConfigSec == 1)
+								break;
+						}
+					} else {
+						bNextConfigSec = 1;
+					}
+				}
+
+				if (bNextConfigSec == 1)
+					break;
+			}
+		}
+	}
+
+sectionfound:
+	if (pxSectionHead != NULL) {
+		if (strcmp(psValueType, "Option") == 0) { /* UCI Option Value */
+			if (pxConfig->pxValueList != NULL) {
+				FOR_EACH_PARAM_ONLY(pxConfig->pxValueList->pxParamValueList, pxParam) {
+					LOGF_LOG_DEBUG("pxParam->sParamName:|%s| psOptionName: |%s| pxParam->sParamValue:|%s|\n", pxParam->sParamName, psOptionName, pxParam->sParamValue);
+					if (strcmp(pxParam->sParamName, psOptionName) == 0) {
+						LOGF_LOG_ERROR("Config Parameter:|%s| of Config Type:|%s| in Config Section:|%s| is found: |%s|\n", psOptionName, psType, psName, pxParam->sParamValue);
+						*psValue = HELP_MALLOC(MAX_LEN_PARAM_VALUE * sizeof(char));
+						if (*psValue != NULL) {
+							if (strncpy_s(*psValue, (MAX_LEN_PARAM_VALUE * sizeof(char)), pxParam->sParamValue, (MAX_LEN_PARAM_VALUE * sizeof(char))) != EOK) {
+								LOGF_LOG_CRITICAL("strncpy_s failed\n");
+							}
+							bValFound = 1;
+						} else {
+							LOGF_LOG_CRITICAL("MALLOC Failed.\n");
+						}
+						goto end;
+					}
+				}
+			}
+		} else { /* UCI List Value */
+			if ((pxConfig->pxValueList != NULL) && (pxConfig->pxValueList->pxArrayValueList != NULL)) {
+				FOR_EACH_ARRAYLIST(pxConfig->pxValueList->pxArrayValueList, pxArrayValueListTmp) {
+					LOGF_LOG_ERROR("pxArrayValueListTmp->sArrayName:|%s| List Name:|%s|\n", pxArrayValueListTmp->sArrayName, psOptionName);
+					if (strcmp(pxArrayValueListTmp->sArrayName, psOptionName) == 0) { /* List Found */
+						FOR_EACH_PARAM_ONLY(pxArrayValueListTmp->pxArrayValues, pxParam) {
+							LOGF_LOG_DEBUG("List Param:|%s| List Val:|%s| nLen:|%d|\n", psOptionName, pxParam->sParamValue, nLen);
+							nOldLen = nLen;
+							nLen = nLen + strnlen_s(pxParam->sParamValue, sizeof(pxParam->sParamValue));
+
+							psTemp = realloc((*psValue), ((nLen+1) * sizeof(char)));
+							if (psTemp != NULL) {
+								if (nOldLen == 0) {
+									*psValue = psTemp;
+									if (strncpy_s((*psValue), ((strnlen_s(pxParam->sParamValue, sizeof(pxParam->sParamValue))+1) * sizeof(char)), pxParam->sParamValue, ((strnlen_s(pxParam->sParamValue, sizeof(pxParam->sParamValue))+1) * sizeof(char))) != EOK) {
+										LOGF_LOG_CRITICAL("strncpy_s failed\n");
+				}
+								} else {
+									if (sprintf_s((*psValue+nOldLen), ((strnlen_s(pxParam->sParamValue, sizeof(pxParam->sParamValue))+2) * sizeof(char)), ",%s", pxParam->sParamValue) <= 0) {
+										LOGF_LOG_CRITICAL("sprintf_s failed\n");
+									}
+								}
+							} else {
+								LOGF_LOG_CRITICAL("realloc failure\n");
+							}
+						}
+						bValFound = 1;
+						goto end;
+					}
+				}
+			}
+		}
+	}
+
+end:
+	if (bValFound == 0) {
+		LOGF_LOG_ERROR("Config Parameter:%s of Config Type:%s in Config Section:%s not found !!!\n", psOptionName, psType, psName);
+		nRet = UGW_FAILURE;
+	} else {
+		LOGF_LOG_DEBUG("Config Parameter:%s of Config Type:%s in Config Section:%s found: |%s| \n", psOptionName, psType, psName, *psValue);
+		nRet = UGW_SUCCESS;
+	}
+
+	return nRet;
+}
+
 /*  =============================================================================
  *   Function Name 	: help_getValueNameBased				*
  *   Description 	: Function to get the value from Objlist thru 		*
@@ -1394,7 +1838,9 @@ int help_getValueNameBased(IN ObjList *pxObj, IN char *pcObjName, IN uint32_t un
 			{
 				if (strcmp(pxParam->sParamName,pcParamName) == 0)
 				{
-					snprintf(pcVal, MAX_LEN_PARAM_VALUE, "%s", pxParam->sParamValue);
+					if (strncpy_s(pcVal, MAX_LEN_PARAM_VALUE, pxParam->sParamValue, MAX_LEN_PARAM_VALUE) != EOK) {
+						LOGF_LOG_CRITICAL("strncpy_s failed\n");
+					}
 					nRet = UGW_SUCCESS;
 					return nRet;
 				}
@@ -1427,9 +1873,11 @@ int help_setValue(IN ObjList *pxObj, IN uint32_t unOid, IN uint32_t unInstance,
 					{
 						if(pcVal != NULL)
 						{
-							if( strlen(pcVal) < MAX_LEN_PARAM_VALUE)
+							if( strnlen_s(pcVal,MAX_LEN_PARAM_VALUE) < MAX_LEN_PARAM_VALUE)
 							{
-								snprintf(pxParam->sParamValue, MAX_LEN_PARAM_VALUE, "%s", pcVal);
+								if (strncpy_s(pxParam->sParamValue, MAX_LEN_PARAM_VALUE, pcVal, MAX_LEN_PARAM_VALUE) != EOK) {
+									LOGF_LOG_CRITICAL("strncpy_s failed\n");
+								}
 								nRet=UGW_SUCCESS;
 							}
 							else
@@ -1460,9 +1908,11 @@ int help_setValue(IN ObjList *pxObj, IN uint32_t unOid, IN uint32_t unInstance,
 						{
 							if(pcVal != NULL)
 							{
-								if(strlen(pcVal) < MAX_LEN_PARAM_VALUE)
+								if(strnlen_s(pcVal,MAX_LEN_PARAM_VALUE) < MAX_LEN_PARAM_VALUE)
 								{
-									snprintf(pxParam->sParamValue, MAX_LEN_PARAM_VALUE, "%s", pcVal);
+									if (strncpy_s(pxParam->sParamValue, MAX_LEN_PARAM_VALUE, pcVal, MAX_LEN_PARAM_VALUE) != EOK) {
+										LOGF_LOG_CRITICAL("strncpy_s failed\n");
+									}
 									nRet = UGW_SUCCESS;
 								}
 								else
@@ -1510,9 +1960,11 @@ int help_setValueNameBased(IN ObjList *pxObj, IN char *pcObjName, IN uint32_t un
 				{
 					if(pcVal != NULL)
 					{
-						if( strlen(pcVal) < MAX_LEN_PARAM_VALUE)
+						if( strnlen_s(pcVal,MAX_LEN_PARAM_VALUE) < MAX_LEN_PARAM_VALUE)
 						{
-							snprintf(pxParam->sParamValue, MAX_LEN_PARAM_VALUE, "%s", pcVal);
+							if (strncpy_s(pxParam->sParamValue, MAX_LEN_PARAM_VALUE, pcVal, MAX_LEN_PARAM_VALUE) != EOK) {
+								LOGF_LOG_CRITICAL("strncpy_s failed\n");
+							}
 							nRet = UGW_SUCCESS;
 						}
 						else
@@ -1537,7 +1989,7 @@ static int indexFromString(char *s) {
 		return -1;
 	}
 
-	i = strlen(s) - 1;
+	i = strnlen_s(s,1024) - 1;
 	while ((i > 0) && (s[i] != '_')) {
 		i--;
 	}
diff --git a/include/help_defs.h b/include/help_defs.h
index 6fca61e..93d5244 100755
--- a/include/help_defs.h
+++ b/include/help_defs.h
@@ -142,6 +142,10 @@
 	\brief 
 */
 #define IS_OWN_OTHER(bit) (bit & OWN_OTHER) /*!< Macro to check other owner bit set */
+/*! 
+	\brief 
+*/
+#define IS_OWN_VOIP(bit) (bit & OWN_VOIP) /*!< Macro to check voip owner bit set */
 
 /*! 
 	\brief 
diff --git a/include/help_enums.h b/include/help_enums.h
index ae7de3f..094fc2e 100755
--- a/include/help_enums.h
+++ b/include/help_enums.h
@@ -81,7 +81,8 @@ typedef enum
    OWN_SERVD = 0x4,/*!< SERVD */
    OWN_CLI = 0x8,/*!< CLI  */
    OWN_POLLD = 0x10,/*!< POLLD  */
-   OWN_OTHER = 0x20/*!< OTHER */
+   OWN_OTHER = 0x20,/*!< OTHER */
+   OWN_VOIP = 0x40/*!< VOIP */
 }Owner;
 
 
diff --git a/include/help_error.h b/include/help_error.h
index 5b1e05d..602d3af 100755
--- a/include/help_error.h
+++ b/include/help_error.h
@@ -79,7 +79,8 @@ typedef enum {
 	ERR_ALIAS_REPLACEMENT_FAILED = -236,	/*!< Invalid parameter value request */
 	ERR_UBUS_TIME_OUT = -237,	/*!< Response not received for GET/SET Request */
 	ERR_SL_TIME_OUT = -238,	/*!< SL failed to complete the operation or timed out */
-	ERR_EXPECTED_NUM = -239	/*!< Strings are not allowed, Only numbers are allowed */
+	ERR_EXPECTED_NUM = -239,	/*!< Strings are not allowed, Only numbers are allowed */
+	ERR_INPUT_VALIDATION_FAILED = -240 /*!< Input validation failed for the request */
 } FrameWorkErrCode;
 
 /*! \enum SLErrCode
@@ -108,7 +109,12 @@ typedef enum {
 	ERR_PRIMARY_BRIDGE_DELETE = -259, /*!< Deletion of Primary LAN Bridge (br-lan) is not Allowed */
 	ERR_DEFAULT_STATIC_ROUTE = -260, /*!< Adding static route against 0.0.0.0 network is not allowed */
 	ERR_BRIDGE_WITOUT_LANPORT = -261, /*!< Bridge (br-lan) should have atleast one lan port */
-	ERR_MACADDRESS_POOL_EXHAUSTED = -262 /*!< MAC Address pool exhausted. Rejecting WAN connection */
+	ERR_MACADDRESS_POOL_EXHAUSTED = -262, /*!< MAC Address pool exhausted. Rejecting WAN connection */
+	ERR_MACADDRESS_INTERFACE_NOT_UP = -263, /*!< MAC Address Validation(ifconfig command failure)failed, Rejecting WAN connection */
+	ERR_MACADDRESS_DEFAULT_FILE_OPER_FAILED = -264, /*!< MAC Address default file(nextmac.conf,resv-mac.conf file operations) failed, Rejecting WAN connection */
+	ERR_MACADDRESS_GET_BASE_MAC_FAILED = -265, /*!< Base Mac Address Fetch failure, Rejecting WAN connection */
+	ERR_MACADDRESS_GLOB_FETCH_FAILED = -266, /*!< MAC Address Glob fetch failure */
+	ERR_FTP_NOT_ALLOWED_FOR_ADMIN = -267 /*!< FTP operation is not allowed for admin user */
 } SLErrCode;
 
 /*! \enum MEErrCode (Management Entity)
@@ -116,7 +122,12 @@ typedef enum {
      Buffer error code -281 to -320
 */
 typedef enum {
-	ERR_402_NOT_FOUND = -281	/*!< ME Error */
+	ERR_402_NOT_FOUND = -281,	/*!< ME Error */
+	ERR_INVALID_PARAM_OPTION = -282, /*!< Error invalid parameter name */
+	ERR_REACHED_MAX_NUMBER_OF_CHARACTER = -283, /*!< Upto 128 characters are allowed to set the value */
+	ERR_REACHED_MAX_NUMBER_OF_OBJECT = -284, /*!< Max limit crossed for objects */
+	ERR_REACHED_MAX_NUMBER_OF_PARAM = -285,	/*!< Max limit crossed for parameters */
+	ERR_JSON_BUFFER_CONSTRUCT_FAILED = -286	/*!< JSON Buffer Construction failed */
 } MEErrCode;
 
 #endif				//#ifndef _HELP_ERROR_H
diff --git a/include/help_objlist.h b/include/help_objlist.h
index a3c2616..0478f54 100755
--- a/include/help_objlist.h
+++ b/include/help_objlist.h
@@ -138,6 +138,29 @@ static inline void * HELP_CREATE_OBJ(IN uint32_t unSubOper)
 	}
 }
 
+static inline void * HELP_CREATE_CONFIG(void); 
+
+/*!
+	\brief Macro to create object list based on the sub-operation type
+	\param[in] unSubOper Differentiates the objlist type
+	\return Void ptr(it can be either objlist, objattrlist, objacslist) returned
+*/
+static inline void * HELP_CREATE_CONFIG(void)
+{
+	UCIConfigData *__pxTmpConf;
+
+	__pxTmpConf = HELP_MALLOC(sizeof(UCIConfigData));
+	if(!__pxTmpConf)
+	{
+		LOGF_LOG_CRITICAL(" malloc failed\n");
+		return NULL;
+	}
+
+	INIT_LIST_HEAD(&(__pxTmpConf->xClist));
+
+	return (void*)__pxTmpConf;
+}
+
 /*!
 	\brief Macro to delete object list based on the sub-operation type
 	\param[in] pxObj Msg head ptr
@@ -146,9 +169,19 @@ static inline void * HELP_CREATE_OBJ(IN uint32_t unSubOper)
 	\return 
 */
 #define HELP_DELETE_OBJ(pxObj, unSubOper, unFlag) \
-					help_delObj(pxObj,unSubOper,unFlag);\
+					help_delObj(pxObj,unSubOper,unFlag); \
 					if(unFlag == FREE_OBJLIST) \
-						pxObj = NULL; 
+						pxObj = NULL;
+
+/*!
+	\brief Macro to delete config list based on the sub-operation type
+	\param[in] pxObj Msg head ptr
+	\param[in] unSubOper Identify the objlist structure.
+	\param[in] unFlag 0-empty objlist for re-use 1-free objlist completely
+	\return 
+*/
+#define HELP_DELETE_CONFIG(pxUCIConfigData) \
+		help_delConf(pxUCIConfigData);\
 
 /*!
 	\brief Macro to delete current object list based on the sub-operation type
@@ -295,6 +328,18 @@ static inline void * HELP_OBJECT_SET(IN void *pxObj, IN const char *pcObjName, I
 
 }	
 
+/*!
+	\brief Fills objlist for set request on objects
+	\param[in] UCIConfigData void ptr
+	\return Void ptr which is used to create paramlist
+*/
+static inline void * HELP_CONFIG_SET(IN UCIConfigData *pxUCIConfigData)
+{
+	return help_addUCIConfigData(pxUCIConfigData);
+
+}	
+
+
 /*!
 	\brief Fills paramlist for get request on parameters
 	\param[in] pxObj Void ptr
@@ -463,6 +508,34 @@ static inline int HELP_SL_GET (IN ObjList *pxObj, IN uint32_t unOid, IN uint32_t
 }
 
 /*! 
+        \brief Macro to get the values from the given UCIConfigData structure
+	\param[in] pxUCIConfigData UCIConfigData ptr
+	\param[in] psType char pointer specifying config type
+	\param[in] psName char pointer specifying config name
+	\param[in] psOptionName char pointer specifying option name
+	\param[out] psValue char pointer specifying value
+*/
+static inline int HELP_UCI_GET (IN UCIConfigData *pxUCIConfigData, IN char *psType, IN char *psName, IN char *psOptionName, OUT char **psValue)
+{
+	return help_getUCIValue(pxUCIConfigData, psType, psName, psOptionName, psValue, "Option");
+}
+
+/*!
+        \brief Macro to get the values from the given UCIConfigData structure
+	\param[in] pxUCIConfigData UCIConfigData ptr
+	\param[in] psType char pointer specifying config type
+	\param[in] psName char pointer specifying config name
+	\param[in] psListName char pointer specifying list name
+	\param[out] psValue char pointer specifying value
+*/
+
+static inline int HELP_UCI_GETLIST (IN UCIConfigData *pxUCIConfigData, IN char *psType, IN char *psName, IN char *psListName, OUT char **psValue)
+{
+	return help_getUCIValue(pxUCIConfigData, psType, psName, psListName, psValue, "List");
+}
+
+
+/*!
         \brief Macro to get value of specfic parameter from the given objlist structure through object/parameter name match
 	\param[in] pxObj Objlist ptr
 	\param[in] pcObjName Object name
@@ -611,6 +684,27 @@ static inline int HELP_DELOBJPTR(INOUT ObjList *pxHeadObj, IN ObjList *pxObj)
 #define  FOR_EACH_PARAM_ONLY(__pxSrc,__pxParam)\
 		list_for_each_entry(__pxParam,&(__pxSrc->xPlist),xPlist) \
 
+/*! 
+        \brief Macro to loop through UCI Array list to get array node information
+	\param[in] __pxSrc ArrayList structure pointer
+	\param[in] __pxArrayValueList ArrayList structure pointer used to copy the actual config values
+*/
+#define FOR_EACH_ARRAYLIST(__pxSrc,__pxArrayValueList) \
+		ArrayList *LIST; \
+		LIST = __pxSrc; \
+		list_for_each_entry(__pxArrayValueList,&(LIST->xClist),xClist) \
+
+
+/*!
+        \brief Macro to loop through UCi config list to get config node information
+	\param[in] __pxUCIConf UCIConfigData structure pointer
+	\param[in] __pxConf UCIConfigData structure pointer used to copy the actual config values
+*/
+#define FOR_EACH_CONFIG(__pxUCIConf,__pxConf) \
+		UCIConfigData *CONF; \
+		CONF = __pxUCIConf; \
+		list_for_each_entry(__pxConf,&(CONF->xClist),xClist) \
+
 /*! 
         \brief Function to get objname from objlist 
 	\param[in] __pxObjName Objnode ptr
diff --git a/include/help_proto.h b/include/help_proto.h
index 8702997..a6b3c61 100755
--- a/include/help_proto.h
+++ b/include/help_proto.h
@@ -65,6 +65,13 @@ ObjList *  help_addObjList(IN ObjList *pxObjList,
 							IN uint32_t unSubOper,
 							IN uint32_t unObjFlag);
 
+/*!  \brief  API to add an add object node to the head node
+  \param[in] UCIConfigData Pointer to the List head UCIConfigData node
+  \return  
+*/
+
+UCIConfigData * help_addUCIConfigData(IN UCIConfigData *pxUCIConfigData);
+
 /*!  \brief  API to add a add param node to Objlist node
   \param[in] pxObjList Pointer to the List head object node
   \param[in] pcParamName Name of the Parameter
@@ -93,6 +100,12 @@ void help_printObj(IN void *pxObj,
 */
 void help_printParamList(IN ParamList *pxParamList);
 
+/*!  \brief  API to print UCIConfigData information
+  \param[in] pxUCIConfigData UCIConfigData node ptr
+  \return
+*/
+void help_printUCIConfigData(IN UCIConfigData *pxUCIConfigData);
+
 /*!  \brief  API to free the object info from the Object List structure
   \param[in] pObj Pointer to the List head object node
   \param[in] unSubOper  Suboperation to identify object type
@@ -103,6 +116,12 @@ void help_delObj(IN void *pObj,
 				IN uint32_t unSubOper,
 				IN uint32_t unFlag);
 
+/*!  \brief  API to free the object info from the Object List structure
+  \param[in] pxUCIConfigData Pointer to the List head object node
+  \return  
+*/
+void help_delConf(IN void *pxUCIConfigData);
+
 /*!  \brief  API to free the object info from the Object List structure
   \param[in] pObj Pointer to the List head object node
   \param[in] pcObjName Object name
@@ -298,6 +317,17 @@ void help_copyParamList(OUT ParamList *pxDst,
 int help_getValue (IN ObjList *pxObj, IN uint32_t unOid, IN uint32_t unInstance, IN uint32_t unParamId, OUT char *pcVal);
 
 /*! 
+        \brief API to get the values from the given objlist structure
+	\param[in] pxObj Objlist ptr
+	\param[in] unOid ObjectId
+	\param[in] unInstance Instance number
+	\param[in] unParamId Parameter ID
+	\param[in] pcVal Parameter value
+	\return Pcval Value of the parameter on successful / failure
+*/
+int help_getUCIValue(IN UCIConfigData *pxUCIConfigData, IN char *psType, IN char *psName, IN char *psOptionName, OUT char **psValue, OUT char *psValueType);
+
+/*!
         \brief API to get value of specfic parameter from the given objlist structure through object/parameter name match
 	\param[in] pxObj Objlist ptr
 	\param[in] pcObjName Object name
@@ -308,7 +338,7 @@ int help_getValue (IN ObjList *pxObj, IN uint32_t unOid, IN uint32_t unInstance,
 */
 int help_getValueNameBased(IN ObjList *pxObj, IN char *pcObjName, IN uint32_t unInstance, IN char *pcParamName, OUT char *pcVal);
 
-/*! 
+/*!
         \brief Macro to set the values in the given objlist structure 
 	\param[in] pxObj Objlist ptr
 	\param[in] unOid ObjectId
diff --git a/include/help_structs.h b/include/help_structs.h
index be46b9a..57e9eb2 100755
--- a/include/help_structs.h
+++ b/include/help_structs.h
@@ -25,6 +25,10 @@
 #ifndef _HELP_STRUCTS_H
 #define _HELP_STRUCTS_H
 
+#include <stddef.h>
+#include "libsafec/safe_str_lib.h"
+#include "libsafec/safe_lib.h"
+#include "libsafec/safe_mem_lib.h"
 #include "help_enums.h"
 #include "help_defs.h"
 #include "list.h"
@@ -107,17 +111,49 @@ typedef struct
 {
 	char sObjName[MAX_LEN_OBJNAME];	/*!< Object Name */ 
 	uint16_t unSid;	  		/*!< Corresponding Service Id */
-	uint16_t unOid; 			/*!< Object Id */
+	uint16_t unOid; 		/*!< Object Id */
 	uint32_t unObjOper; 		/*!< Object Operation ADD, DELETE, MODIFY, etc */ 
 	uint32_t unObjFlag; 		/*!< Object flag for access, dynamic, etc */
 	ParamList xParamList;		/*!< Name Value Pair */
 	ListHead xOlist; 		/*!< Traverse List */
 }ObjList;
 
+typedef struct
+{
+	char sArrayName[MAX_LEN_PARAM_NAME];
+	ParamList *pxArrayValues;
+	ListHead xClist; 		/*!< Traverse List */
+}ArrayList;
 
-/* @} */
+typedef struct
+{
+	ParamList *pxParamValueList;	/*!< List Values */
+	ArrayList *pxArrayValueList;	/*!< Array Values */
+}ValueList;
 
-#endif //#ifndef _HELP_STRUCTS_H
+/*! 
+  \brief Contains the (UCI Operation, Config Paramlist and dData Paramlist which is being used for writin config fies using uci. 
+  */
+typedef struct
+{
+	uint8_t unOper; 		/* UCI_GET/UCI_SET/UCI_ADD/UCI_DELETE */
+	ParamList *pxConfigList;	/*!< Name-Value Pair */
+	ValueList *pxValueList;		/*!< Name-Value Pair */
+	ListHead xClist; 		/*!< Traverse List */
+}UCIConfigData;
 
+/*! 
+  \brief Contains the ENUM for UCI Operations
+  */
+enum UciOper
+{
+	UCI_ADD,
+	UCI_SET,
+	UCI_DELETE,
+	UCI_ORDER,
+	UCI_GET
+};
 
+/* @} */
 
+#endif //#ifndef _HELP_STRUCTS_H
-- 
GitLab