| 1994 | } |
| 1995 | |
| 1996 | static int cbm_upsert_json_named_mcp(const char *binary_path, const char *config_path, |
| 1997 | const char *const *object_path, size_t path_len, |
| 1998 | cbm_json_mcp_schema_t schema, const char *entry_name, |
| 1999 | const char *argument) { |
| 2000 | if (!binary_path || !config_path || !object_path || !entry_name || !entry_name[0]) { |
| 2001 | return CLI_ERR; |
| 2002 | } |
| 2003 | char *document = NULL; |
| 2004 | size_t document_length = 0U; |
| 2005 | int read_result = cbm_json_like_read_document(config_path, &document, &document_length); |
| 2006 | if (read_result < 0) { |
| 2007 | return CLI_ERR; |
| 2008 | } |
| 2009 | if (read_result == 0) { |
| 2010 | int ownership = cbm_json_mcp_snapshot_ownership( |
| 2011 | document, document_length, object_path, path_len, schema, entry_name, argument, |
| 2012 | binary_path, g_previous_managed_mcp_command); |
| 2013 | /* STALE (our exact shape, dead binary path) is repairable — that is |
| 2014 | * the update contract. Only a genuinely foreign shape refuses. */ |
| 2015 | if (ownership != CBM_JSON_LIKE_OBJECT_MATCH && ownership != CBM_JSON_LIKE_OBJECT_MISSING && |
| 2016 | ownership != CBM_JSON_MCP_OWNERSHIP_STALE) { |
| 2017 | free(document); |
| 2018 | return CLI_ERR; |
| 2019 | } |
| 2020 | } |
| 2021 | |
| 2022 | char *entry = cbm_build_json_mcp_entry(binary_path, schema, argument); |
| 2023 | if (!entry) { |
| 2024 | free(document); |
| 2025 | return CLI_ERR; |
| 2026 | } |
| 2027 | int edit_result = cbm_json_like_upsert_entry_if_unchanged( |
| 2028 | config_path, object_path, path_len, entry_name, entry, read_result == 1 ? NULL : document, |
| 2029 | document_length); |
| 2030 | free(entry); |
| 2031 | free(document); |
| 2032 | return edit_result == 0 ? CLI_OK : CLI_ERR; |
| 2033 | } |
| 2034 | |
| 2035 | static int cbm_upsert_json_mcp(const char *binary_path, const char *config_path, |
| 2036 | const char *const *object_path, size_t path_len, |
no test coverage detected