// Delete a DataVault Key eEsifError EsifConfigDelete( EsifDataPtr nameSpace, EsifDataPtr path ) { EsifData null_value = { 0 }; return EsifConfigSet(nameSpace, path, ESIF_SERVICE_CONFIG_DELETE, &null_value); }
static eEsifError ESIF_CALLCONV ActionConfigSet( esif_context_t actCtx, EsifUpPtr upPtr, const EsifFpcPrimitivePtr primitivePtr, const EsifFpcActionPtr fpcActionPtr, EsifDataPtr requestPtr ) { eEsifError rc = ESIF_OK; esif_flags_t flags = ESIF_SERVICE_CONFIG_PERSIST; EsifData params[3] = {0}; EsifString replacedStrs[2] = {0}; EsifString replacedStr = NULL; UInt8 i; UInt8 nparams = 2; UNREFERENCED_PARAMETER(actCtx); ESIF_ASSERT(NULL != requestPtr); ESIF_ASSERT(NULL != requestPtr->buf_ptr); /* Optional 3rd Parameter = Config Flags */ if (fpcActionPtr->param_valid[2]) { nparams++; } rc = EsifFpcAction_GetParams(fpcActionPtr, params, nparams); if (ESIF_OK != rc) { goto exit; } /* Extract Optional EsifConfigSet flags */ if (nparams > 2 && params[2].type == ESIF_DATA_UINT32) { flags = *(UInt32 *)(params[2].buf_ptr); } for (i = 0; i < sizeof(replacedStrs) / sizeof(*replacedStrs); i++) { replacedStr = EsifUp_CreateTokenReplacedParamString(upPtr, primitivePtr, params[i].buf_ptr); if (replacedStr != NULL) { params[i].buf_ptr = replacedStr; replacedStrs[i] = replacedStr; } } ESIF_ASSERT(NULL != params[0].buf_ptr); ESIF_ASSERT(ESIF_DATA_STRING == params[0].type); rc = EsifConfigSet(¶ms[0], ¶ms[1], flags, requestPtr); /* * Ignore DataVault I/O Errors so DSP Overrides can be written to or cleared * from DataCache even if DV file system is read-only */ switch (rc) { case ESIF_E_IO_ERROR: case ESIF_E_IO_OPEN_FAILED: case ESIF_E_IO_DELETE_FAILED: rc = ESIF_OK; break; default: break; } if (ESIF_OK == rc) { ActionConfigSignalChangeEvents(upPtr, primitivePtr->tuple, requestPtr); } exit: for (i = 0; i < sizeof(replacedStrs) / sizeof(*replacedStrs); i++) { esif_ccb_free(replacedStrs[i]); } return rc; }
/* Copy/Merge Keys from one NameSpace to Another */ eEsifError EsifConfigCopy( EsifDataPtr nameSpaceFrom, // Source DV EsifDataPtr nameSpaceTo, // Target DV EsifDataPtr keyspecs, // Tab-separated Keyspec List (wildcards OK) esif_flags_t flags, // Item Flags Bool replaceKeys, // TRUE=COPY Keys (Replace if exists), FALSE=MERGE Keys (Do Not Replace) UInt32 *keycount) // Optional pointer to variable to hold Key Count copied/merged { eEsifError rc = ESIF_OK; EsifConfigFindContext context = NULL; EsifDataPtr data_key = NULL; EsifDataPtr data_value = NULL; esif_string keylist = NULL; esif_string keyspec = NULL; esif_string keyspec_context = NULL; char **keyset = NULL; size_t keyset_count = 0; UInt32 exported = 0; esif_context_t qsort_ctx = 0; size_t key = 0; ESIF_ASSERT(nameSpaceFrom && nameSpaceTo && keyspecs && nameSpaceFrom->buf_ptr && nameSpaceTo->buf_ptr && keyspecs->buf_ptr); // Parse Key List (optionally Tab-separated) keylist = esif_ccb_strdup((esif_string)keyspecs->buf_ptr); if (keylist == NULL) { rc = ESIF_E_NO_MEMORY; goto exit; } // Create sorted keyset with exclude keyspecs ("!keyspec") listed first keyspec = esif_ccb_strtok(keylist, "\t", &keyspec_context); while (keyspec != NULL) { char **new_keyset = (char **)esif_ccb_realloc(keyset, sizeof(char *) * (keyset_count + 1)); if (new_keyset == NULL) { rc = ESIF_E_NO_MEMORY; goto exit; } keyset = new_keyset; keyset[keyset_count++] = keyspec; keyspec = esif_ccb_strtok(NULL, "\t", &keyspec_context); } esif_ccb_qsort(keyset, keyset_count, sizeof(char *), esif_ccb_qsort_stricmp, qsort_ctx); // Enumerate Each Matching keyspec for (key = 0; (rc == ESIF_OK && key < keyset_count); key++) { // Skip excludes for now so we can compare to each maching keyspec later if (keyset[key][0] == '!') { continue; } EsifData_Destroy(data_key); data_key = EsifData_CreateAs(ESIF_DATA_STRING, keyset[key], 0, ESIFAUTOLEN); if (data_key == NULL) { rc = ESIF_E_NO_MEMORY; goto exit; } if ((rc = EsifConfigFindFirst(nameSpaceFrom, data_key, NULL, &context)) == ESIF_OK) { do { // Skip if matching key matches any exclude keyspecs Bool skip_key = ESIF_FALSE; size_t ex = 0; for (ex = 0; (ex < key && keyset[ex][0] == '!'); ex++) { if (esif_ccb_strmatch((esif_string)data_key->buf_ptr, &keyset[ex][1])) { skip_key = ESIF_TRUE; break; } } // copy = always replace existing key in target if it already exists // merge = never replace existing key in target if it already exists if ((skip_key == ESIF_FALSE) && (replaceKeys == ESIF_TRUE || DataBank_KeyExists(g_DataBankMgr, (esif_string)nameSpaceTo->buf_ptr, (esif_string)data_key->buf_ptr) == ESIF_FALSE)) { EsifData_Destroy(data_value); data_value = EsifData_CreateAs(ESIF_DATA_AUTO, NULL, ESIF_DATA_ALLOCATE, 0); if (data_value == NULL) { rc = ESIF_E_NO_MEMORY; break; } rc = EsifConfigGet(nameSpaceFrom, data_key, data_value); if (rc != ESIF_OK) { break; } rc = EsifConfigSet(nameSpaceTo, data_key, flags, data_value); if (rc != ESIF_OK) { break; } ESIF_TRACE_DEBUG("DV %s: @%s => @%s [%s] {%s, %u bytes}\n", (replaceKeys ? "Copy" : "Merge"), (esif_string)nameSpaceFrom->buf_ptr, (esif_string)nameSpaceTo->buf_ptr, (esif_string)data_key->buf_ptr, esif_data_type_str(data_value->type), data_value->data_len); exported++; } // Reset Key for next search EsifData_Set(data_key, ESIF_DATA_STRING, keyset[key], 0, ESIFAUTOLEN); } while ((rc = EsifConfigFindNext(nameSpaceFrom, data_key, NULL, &context)) == ESIF_OK); EsifConfigFindClose(&context); } if (rc == ESIF_E_ITERATION_DONE || rc == ESIF_E_NOT_FOUND) { rc = ESIF_OK; } } exit: if (rc == ESIF_OK && keycount != NULL) { *keycount = exported; } EsifData_Destroy(data_key); EsifData_Destroy(data_value); esif_ccb_free(keylist); esif_ccb_free(keyset); return rc; }