osaf/libs/saf/include/saLog.h          |    8 +-
 osaf/services/saf/logsv/lgs/lgs_imm.c  |  806 +++++++++++++++++++++++++++-----
 osaf/services/saf/logsv/lgs/lgs_util.c |    2 +-
 3 files changed, 667 insertions(+), 149 deletions(-)


Fix incorrect existing validation and add missing validation
when a stream configuration object is created or modified

diff --git a/osaf/libs/saf/include/saLog.h b/osaf/libs/saf/include/saLog.h
--- a/osaf/libs/saf/include/saLog.h
+++ b/osaf/libs/saf/include/saLog.h
@@ -170,9 +170,11 @@ extern "C" {
 /* Log file full actions */
 
        typedef enum {
-               SA_LOG_FILE_FULL_ACTION_WRAP = 1,
-               SA_LOG_FILE_FULL_ACTION_HALT = 2,
-               SA_LOG_FILE_FULL_ACTION_ROTATE = 3
+               SA_LOG_FULL_ACTION_BEGIN = 0,
+               SA_LOG_FILE_FULL_ACTION_WRAP = 1, /* Not supported */
+               SA_LOG_FILE_FULL_ACTION_HALT = 2, /* Not supported */
+               SA_LOG_FILE_FULL_ACTION_ROTATE = 3,
+               SA_LOG_FULL_ACTION_END
        } SaLogFileFullActionT;
 
 /* Log file creation attributes */
diff --git a/osaf/services/saf/logsv/lgs/lgs_imm.c 
b/osaf/services/saf/logsv/lgs/lgs_imm.c
--- a/osaf/services/saf/logsv/lgs/lgs_imm.c
+++ b/osaf/services/saf/logsv/lgs/lgs_imm.c
@@ -938,8 +938,325 @@ static SaAisErrorT config_ccb_completed(
        return rc;
 }
 
+/**********************************************
+ * Help functions for check_attr_validity(...)
+ **********************************************/
+
+typedef struct {
+       /* Store default values for the stream config class. The values are 
fetched
+        * using saImmOmClassDescriptionGet(...)
+        * Note: Only values relevant for validity checks are stored.
+        */
+       SaUint64T saLogStreamMaxLogFileSize;
+       SaUint32T saLogStreamFixedLogRecordSize;
+} lgs_stream_defval_t;
+
+static bool lgs_stream_defval_updated_flag = false;
+static lgs_stream_defval_t lgs_stream_defval;
+
 /**
- * Verify that attribute values are reasonable.
+ * Return a stream config class default values. Fetched using imm om interface
+ * 
+ * @return  struct of type lgs_stream_defval_t
+ */
+static lgs_stream_defval_t *get_SaLogStreamConfig_default(void)
+{
+       SaImmHandleT om_handle = 0;
+       SaAisErrorT rc = SA_AIS_OK;
+       SaImmClassCategoryT cc;
+       SaImmAttrDefinitionT_2 **attributes = NULL;
+       SaImmAttrDefinitionT_2 *attribute = NULL;
+       int i = 0;
+       
+       TRACE_ENTER2("448");
+       if (lgs_stream_defval_updated_flag == false) {
+               /* Get class defaults for SaLogStreamConfig class from IMM
+                * We are only interested in saLogStreamMaxLogFileSize and
+                * saLogStreamFixedLogRecordSize
+                */
+               int iu_setting = immutilWrapperProfile.errorsAreFatal;
+               immutilWrapperProfile.errorsAreFatal = 0;
+               
+               rc = immutil_saImmOmInitialize(&om_handle, NULL, &immVersion);
+               if (rc != SA_AIS_OK) {
+                       TRACE("\t448 immutil_saImmOmInitialize fail rc=%d", rc);
+               }
+               if (rc == SA_AIS_OK) {
+                       rc = immutil_saImmOmClassDescriptionGet_2(om_handle, 
"SaLogStreamConfig",
+                                       &cc, &attributes);
+               }
+               
+               if (rc == SA_AIS_OK) {
+                       while ((attribute = attributes[i++]) != NULL) {
+                               if (!strcmp(attribute->attrName, 
"saLogStreamMaxLogFileSize")) {
+                                       TRACE("\t448 Got 
saLogStreamMaxLogFileSize");
+                                       
lgs_stream_defval.saLogStreamMaxLogFileSize =
+                                                       *((SaUint64T *) 
attribute->attrDefaultValue);
+                                       TRACE("\t448 value = %lld",
+                                                       
lgs_stream_defval.saLogStreamMaxLogFileSize);
+                               } else if (!strcmp(attribute->attrName, 
"saLogStreamFixedLogRecordSize")) {
+                                       TRACE("\t448 Got 
saLogStreamFixedLogRecordSize");
+                                       
lgs_stream_defval.saLogStreamFixedLogRecordSize =
+                                                       *((SaUint32T *) 
attribute->attrDefaultValue);
+                                       TRACE("\t448 value = %d",
+                                                       
lgs_stream_defval.saLogStreamFixedLogRecordSize);
+                               }
+                       }
+                       
+                       rc = 
immutil_saImmOmClassDescriptionMemoryFree_2(om_handle, attributes);
+                       if (rc != SA_AIS_OK) {
+                               LOG_ER("448 %s: Failed to free class 
description memory rc=%d",
+                                       __FUNCTION__, rc);
+                               osafassert(0);
+                       }
+                       lgs_stream_defval_updated_flag = true;
+               } else {
+                       /* Default values are not fetched. Temporary use hard 
coded values.
+                        */
+                       TRACE("\t448 saImmOmClassDescriptionGet_2 failed 
rc=%d", rc);
+                       lgs_stream_defval.saLogStreamMaxLogFileSize = 5000000;
+                       lgs_stream_defval.saLogStreamFixedLogRecordSize = 150;
+               }
+               
+               rc = immutil_saImmOmFinalize(om_handle);
+               if (rc != SA_AIS_OK) {
+                       TRACE("\t448 immutil_saImmOmFinalize fail rc=%d", rc);
+               }
+                               
+               immutilWrapperProfile.errorsAreFatal = iu_setting;
+       } else {
+               TRACE("\t448 Defaults are already fetched");
+               TRACE("\t448 saLogStreamMaxLogFileSize=%lld",
+                               lgs_stream_defval.saLogStreamMaxLogFileSize);
+               TRACE("\t448 saLogStreamFixedLogRecordSize=%d",
+                               
lgs_stream_defval.saLogStreamFixedLogRecordSize);
+       }
+       
+       
+       TRACE_LEAVE2("448");
+       return &lgs_stream_defval;
+}
+
+/**
+ * Check if a stream with the same file name and relative path already
+ * exist
+ * 
+ * @param immOiHandle
+ * @param fileName
+ * @param pathName
+ * @param stream
+ * @param operationType
+ * @return true if exists
+*/
+bool chk_filepath_stream_exist(
+               char *fileName,
+               char *pathName,
+               log_stream_t *stream,
+               enum CcbUtilOperationType operationType)
+{
+       log_stream_t *i_stream = NULL;
+       char *i_fileName = NULL;
+       char *i_pathName = NULL;
+       bool rc = false;
+       
+       TRACE_ENTER2("448");
+       TRACE("\t448 fileName \"%s\", pathName \"%s\"", fileName, pathName);
+       
+       /* If a stream is modified only the name may be modified. The path name
+        * must be fetched from the stream.
+        */
+       if (operationType == CCBUTIL_MODIFY) {
+               TRACE("\t448 MODIFY");
+               if (stream == NULL) {
+                       /* No stream to modify. Should never happen */
+                       osafassert(0);
+               }
+               if ((fileName == NULL) && (pathName == NULL)) {
+                       /* Nothing has changed */
+                       TRACE("\t448 Nothing has changed");
+                       return false;
+               }
+               if (fileName == NULL) {
+                       i_fileName = stream->fileName;
+                       TRACE("\t448 From stream: fileName \"%s\"", i_fileName);
+               } else {
+                       i_fileName = fileName;
+               }
+               if (pathName == NULL) {
+                       i_pathName = stream->pathName;
+                       TRACE("\t448 From stream: pathName \"%s\"", i_pathName);
+               } else {
+                       i_pathName = pathName;
+               }
+       } else if (operationType == CCBUTIL_CREATE) {
+               TRACE("\t448 CREATE");
+               if ((fileName == NULL) || (pathName == NULL)) {
+                       /* Should never happen
+                        * A valid fileName and pathName is always given at 
create */
+                       LOG_ER("448 fileName or pathName is not a string");
+                       osafassert(0);
+               }
+               
+               i_fileName = fileName;
+               i_pathName = pathName;
+       } else {
+               /* Unknown operationType. Should never happen */
+                       osafassert(0);
+       }
+       
+       /* Check if any stream has given filename and path */
+       TRACE("\t448 Check if any stream has given filename and path");
+       i_stream = log_stream_getnext_by_name(NULL);
+       while (i_stream != NULL) {
+               TRACE("\t448 Check stream \"%s\"", i_stream->name);
+               if ((strncmp(i_stream->fileName, i_fileName, NAME_MAX) == 0) &&
+                       (strncmp(i_stream->pathName, i_pathName, 
SA_MAX_NAME_LENGTH) == 0)) {
+                       rc = true;
+                       break;
+               }
+               i_stream = log_stream_getnext_by_name(i_stream->name);
+       }
+       
+       TRACE_LEAVE2("448 rc = %d", rc);
+       return rc;
+}
+
+/**
+ * Verify fixedLogRecordSize and maxLogFileSize.
+ * Rules:
+ *  - fixedLogRecordSize must be less than maxLogFileSize
+ *  - fixedLogRecordSize must be less than or equal to logMaxLogrecsize
+ *  - fixedLogRecordSize can be 0. Means variable record size
+ *  - maxLogFileSize must be bigger than 0. No limit is not supported
+ *  - maxLogFileSize must be bigger than logMaxLogrecsize
+ * 
+ * The ..._flag variable == true means that the corresponding attribute is
+ * changed.
+ * 
+ * @param immOiHandle
+ * @param maxLogFileSize
+ * @param maxLogFileSize_flag
+ * @param fixedLogRecordSize
+ * @param fixedLogRecordSize_flag
+ * @param stream
+ * @param operationType
+ * @return false if error
+ */
+static bool chk_max_filesize_recordsize_compatible(SaImmOiHandleT immOiHandle,
+               SaUint64T maxLogFileSize,
+               bool maxLogFileSize_mod,
+               SaUint32T fixedLogRecordSize,
+               bool fixedLogRecordSize_mod,
+               log_stream_t *stream,
+               enum CcbUtilOperationType operationType,
+               SaImmOiCcbIdT ccbId)
+{
+       SaUint64T i_maxLogFileSize = 0;
+       SaUint32T i_fixedLogRecordSize = 0;
+       SaUint32T i_logMaxLogrecsize = 0;
+       lgs_stream_defval_t *stream_default;
+       
+       bool rc = true;
+       
+       TRACE_ENTER2("448");
+       
+       /** Get all parameters **/
+       
+       /* Get logMaxLogrecsize from configuration parameters */
+       i_logMaxLogrecsize = *(SaUint32T *) lgs_imm_logconf_get(
+                       LGS_IMM_LOG_MAX_LOGRECSIZE, NULL);
+       TRACE("\t448 i_logMaxLogrecsize = %d", i_logMaxLogrecsize);
+       /* Get stream default settings */
+       stream_default = get_SaLogStreamConfig_default();
+       
+       if (operationType == CCBUTIL_MODIFY) {
+               TRACE("\t448 operationType == CCBUTIL_MODIFY");
+               /* The stream exists. 
+                */
+               if (stream == NULL) {
+                       /* Should never happen */
+                       LOG_ER("448 %s stream == NULL", __FUNCTION__);
+                       osafassert(0);
+               }
+               if (fixedLogRecordSize_mod == false) {
+                       /* fixedLogRecordSize is not given. Get from stream */
+                       i_fixedLogRecordSize = stream->fixedLogRecordSize;
+                       TRACE("\t448 Get from stream, fixedLogRecordSize = %d",
+                                       i_fixedLogRecordSize);
+               } else {
+                       i_fixedLogRecordSize = fixedLogRecordSize;
+               }
+               
+               if (maxLogFileSize_mod == false) {
+                       /* maxLogFileSize is not given. Get from stream */
+                       i_maxLogFileSize = stream->maxLogFileSize;
+                       TRACE("\t448 Get from stream, maxLogFileSize = %lld",
+                                       i_maxLogFileSize);
+               } else {
+                       i_maxLogFileSize = maxLogFileSize;
+                       TRACE("\t448 Modified maxLogFileSize = %lld", 
i_maxLogFileSize);
+               }
+       } else if (operationType == CCBUTIL_CREATE) {
+               TRACE("\t448 operationType == CCBUTIL_CREATE");
+               /* The stream does not yet exist
+                */
+               if (fixedLogRecordSize_mod == false) {
+                       /* fixedLogRecordSize is not given. Use default */
+                       i_fixedLogRecordSize = 
stream_default->saLogStreamFixedLogRecordSize;
+                       TRACE("\t448 Get default, fixedLogRecordSize = %d",
+                                       i_fixedLogRecordSize);
+               } else {
+                       i_fixedLogRecordSize = fixedLogRecordSize;
+               }
+               
+               if (maxLogFileSize_mod == false) {
+                       /* maxLogFileSize is not given. Use default */
+                       i_maxLogFileSize = 
stream_default->saLogStreamMaxLogFileSize;
+                       TRACE("\t448 Get default, maxLogFileSize = %lld",
+                                       i_maxLogFileSize);
+               } else {
+                       i_maxLogFileSize = maxLogFileSize;
+               }               
+       } else {
+               /* Unknown operationType */
+               LOG_ER("%s Unknown operationType", __FUNCTION__);
+               osafassert(0);
+       }
+       
+       /** Do the verification **/
+       if (i_maxLogFileSize <= i_logMaxLogrecsize) {
+               /* maxLogFileSize must be bigger than logMaxLogrecsize */
+               report_oi_error(immOiHandle, ccbId,
+                                       "maxLogFileSize out of range");
+               TRACE("\t448 i_maxLogFileSize (%lld) <= i_logMaxLogrecsize 
(%d)",
+                               i_maxLogFileSize, i_logMaxLogrecsize);
+               rc = false;
+       } else if (i_fixedLogRecordSize == 0) {
+               /* fixedLogRecordSize can be 0. Means variable record size */
+               TRACE("\t448 fixedLogRecordSize = 0");
+               rc = true;
+       } else if (i_fixedLogRecordSize >= i_maxLogFileSize) {
+               /* fixedLogRecordSize must be less than maxLogFileSize */
+               report_oi_error(immOiHandle, ccbId,
+                               "fixedLogRecordSize out of range");
+               TRACE("\t448 i_fixedLogRecordSize >= i_maxLogFileSize");
+               rc = false;
+       } else if (i_fixedLogRecordSize > i_logMaxLogrecsize) {
+               /* fixedLogRecordSize must be less than maxLogFileSize */
+               report_oi_error(immOiHandle, ccbId,
+                               "fixedLogRecordSize out of range");
+               TRACE("\t448 i_fixedLogRecordSize > i_logMaxLogrecsize");
+               rc = false;
+       }
+       
+       TRACE_LEAVE2("448 rc = %d", rc);
+       return rc;
+}
+
+/**
+ * Validate input parameters creation and modify of a persistent stream
+ * i.e. a stream that has a configuration object.
+ * 
  * @param ccbUtilOperationData
  *
  * @return SaAisErrorT
@@ -948,161 +1265,360 @@ static SaAisErrorT check_attr_validity(S
                const struct CcbUtilOperationData *opdata)
 {
        SaAisErrorT rc = SA_AIS_OK;
-       void *value;
-       int n = 0;
-       const SaImmAttrValuesT_2 *attribute;
-       log_stream_t *stream = (opdata->operationType == CCBUTIL_CREATE) ? NULL
-                       : log_stream_get_by_name((char *) 
opdata->param.modify.objectName->value);
+       void *value = NULL;
+       int aindex = 0;
+       const SaImmAttrValuesT_2 *attribute = NULL;
+       log_stream_t *stream = NULL;
+       
+       /* Attribute values to be checked
+        */
+       /* Mandatory if create. Can be modified */
+       char *i_fileName = NULL;
+       bool i_fileName_mod = false;
+       /* Mandatory if create. Cannot be changed (handled in class definition) 
*/
+       char *i_pathName = NULL;
+       bool i_pathName_mod = false;
+       /* Modification flag -> true if modified */
+       SaUint32T i_fixedLogRecordSize = 0;
+       bool i_fixedLogRecordSize_mod = false;
+       SaUint64T i_maxLogFileSize = 0;
+       bool i_maxLogFileSize_mod = false;
+       SaUint32T i_logFullAction = 0;
+       bool i_logFullAction_mod = false;
+       char *i_logFileFormat = NULL;
+       bool i_logFileFormat_mod = false;
+       SaUint32T i_logFullHaltThreshold = 0;
+       bool i_logFullHaltThreshold_mod = false;
+       SaUint32T i_maxFilesRotated = 0;
+       bool i_maxFilesRotated_mod = false;
+       SaUint32T i_severityFilter = 0;
+       bool i_severityFilter_mod = false;
+       
+       TRACE_ENTER2("448");
+       
+       /* Get first attribute if any and fill in name and path if the stream
+        * exist (modify)
+        */
+       if (opdata->operationType == CCBUTIL_MODIFY) {
+               TRACE("\t448 Validate for MODIFY");
+               stream = log_stream_get_by_name(
+                               (char *) 
opdata->param.modify.objectName->value);
+               if (stream == NULL) {
+                       /* No stream to modify */
+                       report_oi_error(immOiHandle, opdata->ccbId,
+                                       "Stream does not exist");
+                       TRACE("\t448 Stream does not exist");
+                       rc = SA_AIS_ERR_BAD_OPERATION;
+                       goto done;
+               } else {
+                       /* Get first attribute */
+                       if (opdata->param.modify.attrMods[aindex] != NULL) {
+                               attribute = 
&opdata->param.modify.attrMods[aindex]->modAttr;
+                               aindex++;
+                               TRACE("\t448 First attribute \"%s\" fetched",
+                                               attribute->attrName);
+                       } else {
+                               TRACE("\t448 No attributes found");
+                       }
+                       /* Get relative path and file name from stream.
+                        * Name may be modified
+                        */
+                       i_pathName = stream->pathName;
+                       i_fileName = stream->fileName;
+                       TRACE("\t448 From stream: pathName \"%s\", fileName 
\"%s\"",
+                                       i_pathName, i_fileName);
+               }
+       } else if (opdata->operationType == CCBUTIL_CREATE){
+               TRACE("\t448 Validate for CREATE");
+               /* Check if stream already exist after parameters are saved.
+                * Parameter value for fileName is needed.
+                */
+               /* Get first attribute */
+               attribute = opdata->param.create.attrValues[aindex];
+               aindex++;
+               TRACE("\t448 First attribute \"%s\" fetched", 
attribute->attrName);
+       } else {
+               /* Invalid operation type */
+               LOG_ER("%s Invalid operation type", __FUNCTION__);
+               osafassert(0);
+       }
+       
 
-       TRACE_ENTER();
-
-       int i = 0;
-       while (rc == SA_AIS_OK) {
+       while ((attribute != NULL) && (rc == SA_AIS_OK)){
+               /* Save all changed/given attribute values
+                */
+               
+               /* Get the value */
+               if (attribute->attrValuesNumber > 0) {
+                       value = attribute->attrValues[0];
+               } else if (opdata->operationType == CCBUTIL_MODIFY) {
+                       /* An attribute without a value is never valid if 
modify */
+                       report_oi_error(immOiHandle, opdata->ccbId,
+                                       "Attribute %s has no 
value",attribute->attrName);
+                       TRACE("\t448 Modify: Attribute %s has no 
value",attribute->attrName);
+                       rc = SA_AIS_ERR_BAD_OPERATION;
+                       goto done;
+               } else {
+                       /* If create all attributes will be present also the 
ones without
+                        * any value.
+                        */
+                       TRACE("\t448 Create: Attribute %s has no 
value",attribute->attrName);
+                       goto next;
+               }
+               
+               /* Save attributes with a value */
+               if (!strcmp(attribute->attrName, "saLogStreamFileName")) {
+                       /* Save filename. Check later together with path name */
+                       i_fileName = *((char **) value);
+                       i_fileName_mod = true;
+                       TRACE("\t448 Saved attribute \"%s\"", 
attribute->attrName);
+                       
+               } else if (!strcmp(attribute->attrName, "saLogStreamPathName")) 
{
+                       /* Save path name. Check later together with filename */
+                       i_pathName = *((char **) value);
+                       i_pathName_mod = true;
+                       TRACE("\t448 Saved attribute \"%s\"", 
attribute->attrName);
+                       
+               } else if (!strcmp(attribute->attrName, 
"saLogStreamMaxLogFileSize")) {
+                       /* Save and compare with FixedLogRecordSize after all 
attributes
+                        * are read. Must be bigger than FixedLogRecordSize
+                        */
+                       i_maxLogFileSize = *((SaUint64T *) value);
+                       i_maxLogFileSize_mod = true;
+                       TRACE("\t448 Saved attribute \"%s\"", 
attribute->attrName);
+                       
+               } else if (!strcmp(attribute->attrName, 
"saLogStreamFixedLogRecordSize")) {
+                       /* Save and compare with MaxLogFileSize after all 
attributes
+                        * are read. Must be smaller than MaxLogFileSize
+                        */
+                       i_fixedLogRecordSize = *((SaUint64T *) value);
+                       i_fixedLogRecordSize_mod = true;
+                       TRACE("\t448 Saved attribute \"%s\"", 
attribute->attrName);
+                       
+               } else if (!strcmp(attribute->attrName, 
"saLogStreamLogFullAction")) {
+                       i_logFullAction = *((SaUint32T *) value);
+                       i_logFullAction_mod = true;
+                       TRACE("\t448 Saved attribute \"%s\"", 
attribute->attrName);
+                       
+               } else if (!strcmp(attribute->attrName, 
"saLogStreamLogFileFormat")) {
+                       i_logFileFormat = *((char **) value);
+                       i_logFileFormat_mod = true;
+                       TRACE("\t448 Saved attribute \"%s\"", 
attribute->attrName);
+                       
+               } else if (!strcmp(attribute->attrName, 
"saLogStreamLogFullHaltThreshold")) {
+                       i_logFullHaltThreshold = *((SaUint32T *) value);
+                       i_logFullHaltThreshold_mod = true;
+                       TRACE("\t448 Saved attribute \"%s\"", 
attribute->attrName);
+                       
+               } else if (!strcmp(attribute->attrName, 
"saLogStreamMaxFilesRotated")) {
+                       i_maxFilesRotated = *((SaUint32T *) value);
+                       i_maxFilesRotated_mod = true;
+                       TRACE("\t448 Saved attribute \"%s\"", 
attribute->attrName);
+                       
+               } else if (!strcmp(attribute->attrName, 
"saLogStreamSeverityFilter")) {
+                       i_severityFilter = *((SaUint32T *) value);
+                       i_severityFilter_mod = true;
+                       TRACE("\t448 Saved attribute \"%s\" = %d", 
attribute->attrName,
+                                       i_severityFilter);
+                       
+               }
+               
+               /* Get next attribute or detect no more attributes */
+       next:
                if (opdata->operationType == CCBUTIL_CREATE) {
-                       attribute = opdata->param.create.attrValues[i];
-                       value = (attribute != NULL && 
attribute->attrValuesNumber > 0) ?
-                                       attribute->attrValues[0] : NULL;
+                       attribute = opdata->param.create.attrValues[aindex];
                } else {
-                       // CCBUTIL_MODIFY
-                       attribute = (opdata->param.modify.attrMods[i] != NULL) ?
-                                       
&opdata->param.modify.attrMods[i]->modAttr : NULL;
-                       value = (attribute != NULL && 
attribute->attrValuesNumber > 0) ?
-                                       attribute->attrValues[0] : NULL;
+                       /* CCBUTIL_MODIFY */
+                       if (opdata->param.modify.attrMods[aindex] != NULL) {
+                               attribute = 
&opdata->param.modify.attrMods[aindex]->modAttr;
+                       } else {
+                               attribute = NULL;
+                       }
+               }
+               aindex++;
+       }
+       
+       /* Check all attributes:
+        * Attributes must be within limits
+        * Note: Mandatory attributes are flagged SA_INITIALIZED meaning that
+        * IMM will reject create if these attributes are not defined. Therefore
+        * this is not checked here.
+        */
+       if (rc == SA_AIS_OK) {
+               /* saLogStreamPathName
+                * Must be valid and not outside of root path
+                */
+               if (i_pathName_mod) {
+                       TRACE("\t448 Checking saLogStreamPathName");
+                       if (i_pathName == NULL) {
+                               /* Must point to a string */
+                               rc = SA_AIS_ERR_BAD_OPERATION;
+                               report_oi_error(immOiHandle, opdata->ccbId,
+                                               "NULL pointer to 
saLogStreamPathName");
+                               TRACE("\t448 NULL pointer to 
saLogStreamPathName");
+                               goto done;
+                       }
+                       
+                       if (lgs_relative_path_check_ts(i_pathName) == true) {
+                               report_oi_error(immOiHandle, opdata->ccbId,
+                                                       "Path %s not valid", 
i_pathName);
+                               rc = SA_AIS_ERR_BAD_OPERATION;
+                               TRACE("\t448 Path %s not valid", i_pathName);
+                               goto done;
+                       }
+               }
+               
+               /* saLogStreamFileName
+                * Must be a name. A stream with this name and relative path 
must not
+                * already exist.
+                */
+               if (i_fileName_mod) {
+                       TRACE("\t448 Checking saLogStreamFileName");
+                       if (i_fileName == NULL) {
+                               /* Must point to a string */
+                               rc = SA_AIS_ERR_BAD_OPERATION;
+                               report_oi_error(immOiHandle, opdata->ccbId,
+                                               "NULL pointer to 
saLogStreamFileName");
+                               TRACE("\t448 NULL pointer to 
saLogStreamFileName");
+                               goto done;
+                       }
+                       
+                       if (chk_filepath_stream_exist(i_fileName, i_pathName,
+                                       stream, opdata->operationType)) {
+                               report_oi_error(immOiHandle, opdata->ccbId,
+                                               "Path/file %s/%s already 
exist", i_pathName, i_fileName);
+                               rc = SA_AIS_ERR_BAD_OPERATION;
+                               TRACE("\t448 Path/file %s/%s already exist",
+                                               i_pathName, i_fileName);
+                               goto done;
+                       }
+               }
+               
+               /* saLogStreamMaxLogFileSize or saLogStreamFixedLogRecordSize
+                * See chk_max_filesize_recordsize_compatible() for rules
+                */
+               if (i_maxLogFileSize_mod || i_fixedLogRecordSize_mod) {
+                       TRACE("\t448 Check saLogStreamMaxLogFileSize,"
+                                       " saLogStreamFixedLogRecordSize");
+                       if (chk_max_filesize_recordsize_compatible(immOiHandle,
+                                       i_maxLogFileSize,
+                                       i_maxLogFileSize_mod,
+                                       i_fixedLogRecordSize,
+                                       i_fixedLogRecordSize_mod,
+                                       stream,
+                                       opdata->operationType,
+                                       opdata->ccbId) == false) {
+                               /* report_oi_error is done within check 
function */
+                               rc = SA_AIS_ERR_BAD_OPERATION;
+                               TRACE("\t448 
chk_max_filesize_recordsize_compatible Fail");
+                               goto done;
+                       }
+               }
+               
+               /* saLogStreamLogFullAction
+                * 1, 2 and 3 are valid according to AIS but only action rotate 
(3)
+                * is supported.
+                */
+               if (i_logFullAction_mod) {
+                       TRACE("\t448 Check saLogStreamLogFullAction");
+                       /* If this attribute is changed an oi error report is 
written
+                        * and the value is changed (backwards compatible) but 
this will
+                        * not affect change action
+                        */
+                       if ((i_logFullAction < SA_LOG_FILE_FULL_ACTION_WRAP) ||
+                                       (i_logFullAction > 
SA_LOG_FILE_FULL_ACTION_ROTATE)) {
+                               report_oi_error(immOiHandle, opdata->ccbId,
+                                               "logFullAction out of range");
+                               rc = SA_AIS_ERR_BAD_OPERATION;
+                               TRACE("\t448 logFullAction out of range");
+                               goto done;
+                       }
+                       if ((i_logFullAction == SA_LOG_FILE_FULL_ACTION_WRAP) ||
+                                       (i_logFullAction == 
SA_LOG_FILE_FULL_ACTION_HALT)) {
+                               report_oi_error(immOiHandle, opdata->ccbId,
+                                               "logFullAction:Current 
Implementation doesn't support Wrap and halt");
+                               rc = SA_AIS_ERR_BAD_OPERATION;
+                               TRACE("\t448 logFullAction: Not supported");
+                               goto done;
+                       }
                }
 
-               if (attribute != NULL && value != NULL) {
-                       TRACE("attribute %s", attribute->attrName);
-
-                       if (!strcmp(attribute->attrName, 
"saLogStreamFileName")) {
-                               char *fileName = *((char **) value);
-                               if (fileName == NULL) {
-                                       rc = SA_AIS_ERR_INVALID_PARAM;
+               /* saLogStreamLogFileFormat
+                * If create the only possible stream type is application and 
no stream
+                * is yet created. All streams can be modified.
+                */
+               if (i_logFileFormat_mod) {
+                       SaBoolT dummy;
+                       if (opdata->operationType == CCBUTIL_CREATE) {
+                               if 
(!lgs_is_valid_format_expression(i_logFileFormat, STREAM_TYPE_APPLICATION, 
&dummy)) {
                                        report_oi_error(immOiHandle, 
opdata->ccbId,
-                                                       "NULL pointer to 
saLogStreamFileName");
-                               } else if (lgs_check_path_exists_h(fileName) == 
0) {
+                                                       "Invalid logFileFormat: 
%s", i_logFileFormat);
+                                       rc = SA_AIS_ERR_BAD_OPERATION;
+                                       TRACE("\t448 Create: Invalid 
logFileFormat: %s",
+                                                       i_logFileFormat);
+                                       goto done;
+                               }
+                       }
+                       else {
+                               if 
(!lgs_is_valid_format_expression(i_logFileFormat, stream->streamType, &dummy)) {
                                        report_oi_error(immOiHandle, 
opdata->ccbId,
-                                                       "File %s already 
exist", fileName);
-                                       rc = SA_AIS_ERR_EXIST;
-                                       TRACE("fileName: %s", fileName);
+                                                       "Invalid logFileFormat: 
%s", i_logFileFormat);
+                                       rc = SA_AIS_ERR_BAD_OPERATION;
+                                       TRACE("\t448 Modify: Invalid 
logFileFormat: %s",
+                                                       i_logFileFormat);
+                                       goto done;
                                }
-                       } else if (!strcmp(attribute->attrName, 
"saLogStreamPathName")) {
-                               char stream_path[PATH_MAX];
-                               n = snprintf(stream_path, PATH_MAX, "%s//%s//.",
-                                               lgs_cb->logsv_root_dir,
-                                               *((char **) value));
-                               if (n >= PATH_MAX) {
-                                       report_oi_error(immOiHandle, 
opdata->ccbId,
-                                                       "Path > PATH_MAX");
-                                       rc = SA_AIS_ERR_BAD_OPERATION;
-                               } else if 
(lgs_relative_path_check_ts(stream_path)) {
-                                       report_oi_error(immOiHandle, 
opdata->ccbId,
-                                                       "Path %s not valid", 
stream_path);
-                                       rc = SA_AIS_ERR_INVALID_PARAM;
-                               } else if 
(lgs_check_path_exists_h(lgs_cb->logsv_root_dir) != 0) {
-                                       report_oi_error(immOiHandle, 
opdata->ccbId,
-                                                       "Path %s does not 
exist", stream_path);
-                                       rc = SA_AIS_ERR_BAD_OPERATION;
-                               }
-                               TRACE("Stream path: %s", stream_path);
-                       } else if (!strcmp(attribute->attrName, 
"saLogStreamMaxLogFileSize")) {
-                               SaUint64T maxLogFileSize = *((SaUint64T *) 
value);
-                               // maxLogFileSize == 0 is interpreted as 
"infinite" size.
-                               if (maxLogFileSize > 0 &&
-                                               stream != NULL &&
-                                               maxLogFileSize < 
stream->fixedLogRecordSize) {
-                                       report_oi_error(immOiHandle, 
opdata->ccbId,
-                                                       "maxLogFileSize out of 
range");
-                                       rc = SA_AIS_ERR_BAD_OPERATION;
-                               }
-                               TRACE("maxLogFileSize: %llu", maxLogFileSize);
-                       } else if (!strcmp(attribute->attrName, 
"saLogStreamFixedLogRecordSize")) {
-                               SaUint32T fixedLogRecordSize = *((SaUint32T *) 
value);
-                               if (stream != NULL &&
-                                               stream->maxLogFileSize > 0 &&
-                                               fixedLogRecordSize > 
stream->maxLogFileSize) {
-                                       report_oi_error(immOiHandle, 
opdata->ccbId,
-                                                       "fixedLogRecordSize out 
of range");
-                                       rc = SA_AIS_ERR_BAD_OPERATION;
-                               }
-                               TRACE("fixedLogRecordSize: %u", 
fixedLogRecordSize);
-                       } else if (!strcmp(attribute->attrName, 
"saLogStreamLogFullAction")) {
-                               SaLogFileFullActionT logFullAction = 
*((SaUint32T *) value);
-                               if ((logFullAction < 
SA_LOG_FILE_FULL_ACTION_WRAP) ||
-                                               (logFullAction > 
SA_LOG_FILE_FULL_ACTION_ROTATE)) {
-                                       report_oi_error(immOiHandle, 
opdata->ccbId,
-                                                       "logFullAction out of 
range");
-                                       rc = SA_AIS_ERR_BAD_OPERATION;
-                               }
-                               if ((logFullAction == 
SA_LOG_FILE_FULL_ACTION_WRAP) ||
-                                               (logFullAction == 
SA_LOG_FILE_FULL_ACTION_HALT)) {
-                                       report_oi_error(immOiHandle, 
opdata->ccbId,
-                                                       "logFullAction:Current 
Implementation doesn't support Wrap and halt");
-                                       rc = SA_AIS_ERR_NOT_SUPPORTED;
-                               }
-                               TRACE("logFullAction: %u", logFullAction);
-                       } else if (!strcmp(attribute->attrName, 
"saLogStreamLogFullHaltThreshold")) {
-                               SaUint32T logFullHaltThreshold = *((SaUint32T 
*) value);
-                               if (logFullHaltThreshold >= 100) {
-                                       report_oi_error(immOiHandle, 
opdata->ccbId,
-                                                       "logFullHaltThreshold 
out of range");
-                                       rc = SA_AIS_ERR_BAD_OPERATION;
-                               }
-                               TRACE("logFullHaltThreshold: %u", 
logFullHaltThreshold);
-                       } else if (!strcmp(attribute->attrName, 
"saLogStreamMaxFilesRotated")) {
-                               SaUint32T maxFilesRotated = *((SaUint32T *) 
value);
-                               if (maxFilesRotated < 1 || maxFilesRotated > 
128) {
-                                       report_oi_error(immOiHandle, 
opdata->ccbId,
-                                                       "maxFilesRotated out of 
range (min 1, max 127): %u",
-                                                       maxFilesRotated);
-                                       rc = SA_AIS_ERR_BAD_OPERATION;
-                               }
-                               TRACE("maxFilesRotated: %u", maxFilesRotated);
-                       } else if (!strcmp(attribute->attrName, 
"saLogStreamLogFileFormat")) {
-                               SaBoolT dummy;
-                               char *logFileFormat = *((char **) value);
-                               TRACE("logFileFormat: %s", logFileFormat);
-
-                               if (opdata->operationType == CCBUTIL_CREATE) {
-                                       if 
(!lgs_is_valid_format_expression(logFileFormat, STREAM_TYPE_APPLICATION, 
&dummy)) {
-                                               report_oi_error(immOiHandle, 
opdata->ccbId,
-                                                               "Invalid 
logFileFormat: %s", logFileFormat);
-                                               rc = SA_AIS_ERR_BAD_OPERATION;
-                                       }
-                               }
-                               else {
-                                       if 
(!lgs_is_valid_format_expression(logFileFormat, stream->streamType, &dummy)) {
-                                               report_oi_error(immOiHandle, 
opdata->ccbId,
-                                                               "Invalid 
logFileFormat: %s", logFileFormat);
-                                               rc = SA_AIS_ERR_BAD_OPERATION;
-                                       }
-                               }
-                       } else if (!strcmp(attribute->attrName, 
"saLogStreamSeverityFilter")) {
-                               SaUint32T severityFilter = *((SaUint32T *) 
value);
-                               if (severityFilter > 0x7f) {
-                                       report_oi_error(immOiHandle, 
opdata->ccbId,
-                                                       "Invalid severity: %x", 
severityFilter);
-                                       rc = SA_AIS_ERR_BAD_OPERATION;
-                               }
-                               TRACE("severityFilter: %u", severityFilter);
-                       } else if (!strncmp(attribute->attrName, "SaImm", 5) ||
-                                       !strncmp(attribute->attrName, "safLg", 
5)) {
-                               ;
-                       } else {
-                               report_oi_error(immOiHandle, opdata->ccbId,
-                                               "invalid attribute %s", 
attribute->attrName);
-                               rc = SA_AIS_ERR_BAD_OPERATION;
-                       }
-               } else {
-                       TRACE("i: %d, attribute: %d, value: %d", i, attribute 
== NULL ? 0 : 1
-                                       , value == NULL ? 0 : 1);
-                       if (attribute == NULL) {
-                               break;
                        }
                }
-               i++;
+
+               /* saLogStreamLogFullHaltThreshold
+                * Not supported and not used. For backwards compatibility the
+                * value can still be set/changed between 0 and 99 (percent)
+                */
+               if (i_logFullHaltThreshold_mod) {
+                       TRACE("\t448 Checking saLogStreamLogFullHaltThreshold");
+                       if (i_logFullHaltThreshold >= 100) {
+                               report_oi_error(immOiHandle, opdata->ccbId,
+                                               "logFullHaltThreshold out of 
range");
+                               rc = SA_AIS_ERR_BAD_OPERATION;
+                               goto done;
+                       }
+               }
+               
+               /* saLogStreamMaxFilesRotated
+                * < 127
+                */
+               if (i_maxFilesRotated_mod) {
+                       TRACE("\t448 Checking saLogStreamMaxFilesRotated");
+                       if ((i_maxFilesRotated < 1) || (i_maxFilesRotated > 
127)) {
+                               report_oi_error(immOiHandle, opdata->ccbId,
+                                               "maxFilesRotated out of range 
(min 1, max 127): %u",
+                                               i_maxFilesRotated);
+                               rc = SA_AIS_ERR_BAD_OPERATION;
+                               TRACE("\t448 maxFilesRotated out of range "
+                                               "(min 1, max 127): %u", 
i_maxFilesRotated);
+                               goto done;
+                       }
+               }
+               
+               /* saLogStreamSeverityFilter
+                *     < 0x7f
+                */
+               if (i_severityFilter_mod) {
+                       TRACE("\t448 Checking saLogStreamSeverityFilter");
+                       if (i_severityFilter >= 0x7f) {
+                               report_oi_error(immOiHandle, opdata->ccbId,
+                                       "Invalid severity: %x", 
i_severityFilter);
+                               rc = SA_AIS_ERR_BAD_OPERATION;
+                               TRACE("\t448 Invalid severity: %x", 
i_severityFilter);
+                               goto done;
+                       }
+               }
        }
-       TRACE_LEAVE2();
-       return rc;
+       
+       done:
+               TRACE_LEAVE2("448 rc = %d", rc);
+               return rc;
 }
 
 /**
diff --git a/osaf/services/saf/logsv/lgs/lgs_util.c 
b/osaf/services/saf/logsv/lgs/lgs_util.c
--- a/osaf/services/saf/logsv/lgs/lgs_util.c
+++ b/osaf/services/saf/logsv/lgs/lgs_util.c
@@ -427,7 +427,7 @@ void lgs_free_write_log(const lgsv_write
  * Note: This function must be thread safe
  * 
  * @param path
- * @return true if path is allowed
+ * @return true if path is not allowed
  */
 bool lgs_relative_path_check_ts(const char* path)
 {

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to