void v_loadWarningLevels( v_kernel kernel, v_configuration config) { c_iter iter; v_cfData elementData = NULL; c_value value; v_cfElement root; assert(kernel != NULL); assert(C_TYPECHECK(kernel,v_kernel)); assert(config != NULL); assert(C_TYPECHECK(config,v_configuration)); root = v_configurationGetRoot(config); /* load max samples warn level */ iter = v_cfElementXPath(root, "Domain/ResourceLimits/MaxSamples/WarnAt/#text"); while(c_iterLength(iter) > 0) { elementData = v_cfData(c_iterTakeFirst(iter)); } if(iter) { c_iterFree(iter); } if(elementData)/* aka the last one from the previous while loop */ { value = v_cfDataValue(elementData); sscanf(value.is.String, "%u", &kernel->maxSamplesWarnLevel); if(kernel->maxSamplesWarnLevel < V_KERNEL_MAX_SAMPLES_WARN_LEVEL_MIN) { kernel->maxSamplesWarnLevel = V_KERNEL_MAX_SAMPLES_WARN_LEVEL_MIN; } } elementData = NULL; /* load max instances warn level */ iter = v_cfElementXPath(root, "Domain/ResourceLimits/MaxInstances/WarnAt/#text"); while(c_iterLength(iter) > 0) { elementData = v_cfData(c_iterTakeFirst(iter)); } if(iter) { c_iterFree(iter); } if(elementData)/* aka the last one from the previous while loop */ { value = v_cfDataValue(elementData); sscanf(value.is.String, "%u", &kernel->maxInstancesWarnLevel); if(kernel->maxInstancesWarnLevel < V_KERNEL_MAX_INSTANCES_WARN_LEVEL_MIN) { kernel->maxInstancesWarnLevel = V_KERNEL_MAX_INSTANCES_WARN_LEVEL_MIN; } } elementData = NULL; /* load max samples per instances warn level */ iter = v_cfElementXPath(root, "Domain/ResourceLimits/MaxSamplesPerInstance/WarnAt/#text"); while(c_iterLength(iter) > 0) { elementData = v_cfData(c_iterTakeFirst(iter)); } if(iter) { c_iterFree(iter); } if(elementData)/* aka the last one from the previous while loop */ { value = v_cfDataValue(elementData); sscanf(value.is.String, "%u", &kernel->maxSamplesPerInstanceWarnLevel); if(kernel->maxSamplesPerInstanceWarnLevel < V_KERNEL_MAX_SAMPLES_PER_INSTANCES_WARN_LEVEL_MIN) { kernel->maxSamplesPerInstanceWarnLevel = V_KERNEL_MAX_SAMPLES_PER_INSTANCES_WARN_LEVEL_MIN; } } }
static int lockPages( v_kernel k, const c_char *name) { v_configuration cfg; v_cfElement root; v_cfElement service; v_cfData data; int lock; c_char *path; c_iter iter; int iterLength; c_value value; assert(k); lock = 0; cfg = v_getConfiguration(k); if (cfg != NULL) { root = v_configurationGetRoot(cfg); if (root != NULL) { path = (c_char *)os_malloc(strlen(SERVICE_PATH) + strlen(name)); /* NULL terminator is covered by '%s' in SERVICE_PATH constant */ os_sprintf(path, SERVICE_PATH, name); iter = v_cfElementXPath(root, path); iterLength = c_iterLength(iter); os_free(path); if (iterLength == 1) { service = v_cfElement(c_iterTakeFirst(iter)); c_iterFree(iter); iter = v_cfElementXPath(service, "Locking/#text"); iterLength = c_iterLength(iter); if (iterLength == 1) { data = v_cfData(c_iterTakeFirst(iter)); if (u_cfValueScan(v_cfDataValue(data), V_BOOLEAN, &value)) { if (value.is.Boolean) { lock = 1; OS_REPORT_1(OS_INFO,"lockPages", 0, "service '%s': Locking enabled", name); } } else { OS_REPORT_1(OS_WARNING,"lockPages", 0, "Failed to retrieve Locking for service '%s': Locking disabled", name); } } } else if (iterLength > 1) { OS_REPORT_2(OS_WARNING,"lockPages", 0, "Multiple configuration found for service '%s' (too many: %d): Locking disabled", name, iterLength); } else { OS_REPORT_1(OS_WARNING,"lockPages", 0, "Could not get configuration for service '%s' (non-existent): Locking disabled", name); } c_iterFree(iter); c_free(root); } } return lock; }
/* * ES, dds1576: This method consults the configuration info stored in the kernel * to determine the access policy for this partition */ v_accessMode v_kernelPartitionAccessMode( v_kernel _this, v_partitionPolicy partition) { v_configuration config; v_cfElement root; v_cfElement element; c_iter iter; v_accessMode retVal = V_ACCESS_MODE_UNDEFINED; c_value expression; c_value accessMode; c_iter partitionsSplit; c_char* partitionName; config = v_getConfiguration(_this); if(config) { root = v_configurationGetRoot(config); /* Iterate over all partitionAccess elements */ iter = v_cfElementXPath(root, "Domain/PartitionAccess"); while(c_iterLength(iter) > 0) { element = v_cfElement(c_iterTakeFirst(iter)); /* Get the partition expression value, it should be a string */ expression = v_cfElementAttributeValue(element, "partition_expression"); if(expression.kind == V_STRING) { /* iterate over partitions, if one matches, exit and return */ partitionsSplit = v_partitionPolicySplit(partition); while(c_iterLength(partitionsSplit) > 0) { partitionName = (c_char*)c_iterTakeFirst(partitionsSplit); if(v_partitionStringMatchesExpression(partitionName, expression.is.String)) { /* The partition matches the expression.*/ accessMode = v_cfElementAttributeValue(element, "access_mode"); if(accessMode.kind == V_STRING) { /* A correct solution space can be realized between multiple * expressions having an AND relationship by specifying the * following rules R&W=RW, R&N=N, W&N=N, RW&N=N. */ switch(retVal) { case V_ACCESS_MODE_UNDEFINED: /* start state */ if(strcmp(accessMode.is.String, "none") == 0) { retVal = V_ACCESS_MODE_NONE; } else if(strcmp(accessMode.is.String, "write") == 0) { retVal = V_ACCESS_MODE_WRITE; } else if(strcmp(accessMode.is.String, "read") == 0) { retVal = V_ACCESS_MODE_READ; } else if(strcmp(accessMode.is.String, "readwrite") == 0) { retVal = V_ACCESS_MODE_READ_WRITE; } break; case V_ACCESS_MODE_WRITE: if(strcmp(accessMode.is.String, "read") == 0 || strcmp(accessMode.is.String, "readwrite") == 0) { retVal = V_ACCESS_MODE_READ_WRITE; } else if(strcmp(accessMode.is.String, "none") == 0) { retVal = V_ACCESS_MODE_NONE; } break; case V_ACCESS_MODE_READ: if(strcmp(accessMode.is.String, "write") == 0 || strcmp(accessMode.is.String, "readwrite") == 0) { retVal = V_ACCESS_MODE_READ_WRITE; } else if(strcmp(accessMode.is.String, "none") == 0) { retVal = V_ACCESS_MODE_NONE; } break; case V_ACCESS_MODE_READ_WRITE: if(strcmp(accessMode.is.String, "none") == 0) { retVal = V_ACCESS_MODE_NONE; } break; default: /* case V_ACCESS_MODE_NONE > none always remains none */ break; } } } os_free(partitionName); } c_iterFree(partitionsSplit); } } if(iter) { c_iterFree(iter); } if(root) { c_free(root); } } if(retVal == V_ACCESS_MODE_UNDEFINED) { /* No specific rights defined, fall back to default */ retVal = V_ACCESS_MODE_READ_WRITE; } return retVal; }