Fix set_bootbank status

This commit is contained in:
Vivek Kumar Dutta 2025-10-28 12:30:47 +05:30
parent 8d150fae12
commit 71d433a55f
No known key found for this signature in database
GPG key ID: 4E09F5AD8265FD4C
3 changed files with 49 additions and 85 deletions

View file

@ -120,9 +120,7 @@ static void fwbank_copy_config(void)
static bool fwbank_set_bootbank(const char *bank_id)
{
int res = sysmngr_fwbank_set_bootbank((uint32_t)DM_STRTOUL(bank_id), NULL);
return !res ? true : false;
return sysmngr_fwbank_set_bootbank((uint32_t)DM_STRTOUL(bank_id));
}
static bool fwbank_upgrade(const char *path, bool activate, const char *bank_id, const char *keep_settings)

View file

@ -485,73 +485,6 @@ struct blob_buf *sysmngr_fwbank_dump(void)
return &g_fwbank_dump.output;
}
static void fwbank_set_bootbank_finish_callback(struct ubus_context *ctx, struct ubus_request_data *req, int *pipe_fds, uint32_t bank_id)
{
BBFDM_DEBUG("Task finished Line=%d && func=%s", __LINE__, __func__);
close(pipe_fds[1]); // Close unused write end
char buffer[1024] = {0};
ssize_t bytes_read;
BBFDM_DEBUG("Reading script output...");
// Read the output from the script
while ((bytes_read = read(pipe_fds[0], buffer, sizeof(buffer) - 1)) > 0) {
buffer[bytes_read] = '\0'; // Null-terminate the buffer
BBFDM_DEBUG("Script output: %s", buffer);
}
close(pipe_fds[0]); // Close read end
if (bytes_read < 0) {
BBFDM_ERR("Failed to read from pipe");
return;
}
struct blob_buf setbootbank_bb = {0};
memset(&setbootbank_bb, 0, sizeof(struct blob_buf));
blob_buf_init(&setbootbank_bb, 0);
if (!blobmsg_add_json_from_string(&setbootbank_bb, buffer)) {
BBFDM_ERR("Failed to create blob buf");
blob_buf_free(&setbootbank_bb);
return;
}
bool is_success = is_set_bootbank_success(&setbootbank_bb);
if (ctx && req) {
BBFDM_DEBUG("Send ubus output");
ubus_send_reply(ctx, req, setbootbank_bb.head);
}
blob_buf_free(&setbootbank_bb);
if (is_success) {
// Update fwbank dump output
init_global_fwbank_dump();
}
return;
}
int sysmngr_fwbank_set_bootbank(uint32_t bank_id, struct ubus_request_data *req)
{
char cmd[128] = {0};
snprintf(cmd, sizeof(cmd), "echo '{\"bank\":%u}' | %s 2>/dev/null", bank_id, FWBANK_SET_BOOTBANK_CMD);
int res = sysmngr_task_fork(fwbank_set_bootbank_finish_callback, cmd, 10, req, 0);
if (res) {
BBFDM_ERR("Failed to start task for fwbank set bootbank command");
return -1;
}
return 0;
}
static void fwbank_upgrade_finish_callback(struct ubus_context *ctx, struct ubus_request_data *req, int *pipe_fds, uint32_t bank_id)
{
BBFDM_DEBUG("Task finished Line=%d && func=%s", __LINE__, __func__);
@ -629,6 +562,38 @@ static int dump_handler(struct ubus_context *ctx, struct ubus_object *obj,
return 0;
}
bool sysmngr_fwbank_set_bootbank(uint32_t bank_id)
{
char cmd[128] = {0};
char output[256] = {0};
struct blob_buf bb = {0};
bool res = false;
snprintf(cmd, sizeof(cmd), "echo '{\"bank\":%u}' | %s 2>/dev/null", bank_id, FWBANK_SET_BOOTBANK_CMD);
res = run_cmd(cmd, output, sizeof(output));
if (res || (DM_STRLEN(output) == 0)) {
BBFDM_ERR("Failed to run [%s], ret[%d], output[%s]", cmd, res, output);
return false;
}
memset(&bb, 0, sizeof(struct blob_buf));
blob_buf_init(&bb, 0);
if (!blobmsg_add_json_from_string(&bb, output)) {
BBFDM_ERR("Failed to create blob, from json str[%s]", output);
blob_buf_free(&bb);
return false;
}
res = is_set_bootbank_success(&bb);
if (res == true) {
init_global_fwbank_dump();
}
blob_buf_free(&bb);
return res;
}
enum {
SET_BOOT_BANK,
__SET_BOOT_MAX
@ -643,30 +608,31 @@ static int set_bootbank_handler(struct ubus_context *ctx, struct ubus_object *ob
struct blob_attr *msg)
{
struct blob_attr *tb[__SET_BOOT_MAX];
uint32_t band_id = 0;
uint32_t bank_id = 0;
int res = 0;
struct blob_buf bb = {0};
if (blobmsg_parse(set_bootbank_policy, __SET_BOOT_MAX, tb, blob_data(msg), blob_len(msg))) {
BBFDM_ERR("Failed to parse the 'set_bootbank' message");
return UBUS_STATUS_UNKNOWN_ERROR;
}
if (tb[SET_BOOT_BANK])
band_id = blobmsg_get_u32(tb[SET_BOOT_BANK]);
memset(&bb, 0, sizeof(struct blob_buf));
blob_buf_init(&bb, 0);
res = sysmngr_fwbank_set_bootbank(band_id, req);
if (res) {
struct blob_buf bb = {0};
memset(&bb, 0, sizeof(struct blob_buf));
blob_buf_init(&bb, 0);
blobmsg_add_u8(&bb, "status", false);
ubus_send_reply(ctx, req, bb.head);
blob_buf_free(&bb);
if (tb[SET_BOOT_BANK]) {
bank_id = blobmsg_get_u32(tb[SET_BOOT_BANK]);
}
return 0;
if (sysmngr_fwbank_set_bootbank(bank_id)) {
blobmsg_add_u8(&bb, "status", true);
} else {
blobmsg_add_u8(&bb, "status", false);
}
ubus_send_reply(ctx, req, bb.head);
blob_buf_free(&bb);
return res;
}
enum {

View file

@ -16,7 +16,7 @@ extern struct blobmsg_policy sysmngr_dump_policy[];
extern struct blobmsg_policy sysmngr_bank_policy[];
struct blob_buf *sysmngr_fwbank_dump(void);
int sysmngr_fwbank_set_bootbank(uint32_t bank_id, struct ubus_request_data *req);
bool sysmngr_fwbank_set_bootbank(uint32_t bank_id);
int sysmngr_fwbank_upgrade(const char *path, bool auto_activate, uint32_t bank_id, bool keep_settings, struct ubus_request_data *req);
void sysmngr_fwbank_refresh_global_dump(void);