system/fastboot: Add support for fastboot oem shell

To support executing custom commands.

Usage

  fastboot oem shell <command>

Tests

  # Configuration "esp32s3-devkit:fastboot" with `SYSTEM_FASTBOOTD_SHELL` enabled

  $ fastboot --version
  fastboot version 35.0.2-12147458

  $ fastboot oem shell ls /FILE_NOT_EXISTS
  FAILED (remote: 'error detected 0xff00 4')
  fastboot: error: Command failed

  $ fastboot oem shell ps
    PID GROUP PRI POLICY   TYPE    NPX STATE    EVENT     SIGMASK            STACK COMMAND
      0     0   0 FIFO     Kthread   - Ready              0000000000000000 0003056 Idle_Task
      1     0 224 RR       Kthread   - Waiting  Semaphore 0000000000000000 0001976 hpwork 0x3fc8bd50 0x3fc8bd80
      2     2 100 RR       Task      - Waiting  Semaphore 0000000000000000 0004048 nsh_main
      3     3 100 RR       Task      - Ready              0000000000000000 0001992 fastbootd
      4     4 100 RR       Task      - Running            0000000000000000 0001992 popen -c ps
  OKAY [  0.010s]
  Finished. Total time: 0.010s

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
This commit is contained in:
wangjianyu3 2025-02-20 11:28:10 +08:00 committed by Alin Jerpelea
parent 89c784188e
commit 536e2ccac6
2 changed files with 50 additions and 1 deletions

View file

@ -32,4 +32,14 @@ config SYSTEM_FASTBOOTD_USB_BOARDCTL
---help---
Connect usbdev before running fastboot daemon.
config SYSTEM_FASTBOOTD_SHELL
bool "Execute custom commands"
default n
depends on SCHED_CHILD_STATUS
depends on SYSTEM_POPEN
---help---
Enable to support executing custom commands.
e.g. fastboot oem shell ps
e.g. fastboot oem shell "mkrd -m 10 -s 512 640"
endif # SYSTEM_FASTBOOTD

View file

@ -46,6 +46,7 @@
#include <sys/statfs.h>
#include <sys/types.h>
#include <sys/poll.h>
#include <sys/wait.h>
/****************************************************************************
* Pre-processor Definitions
@ -180,6 +181,10 @@ static void fastboot_memdump(FAR struct fastboot_ctx_s *context,
FAR const char *arg);
static void fastboot_filedump(FAR struct fastboot_ctx_s *context,
FAR const char *arg);
#ifdef CONFIG_SYSTEM_FASTBOOTD_SHELL
static void fastboot_shell(FAR struct fastboot_ctx_s *context,
FAR const char *arg);
#endif
/****************************************************************************
* Private Data
@ -200,7 +205,10 @@ static const struct fastboot_cmd_s g_fast_cmd[] =
static const struct fastboot_cmd_s g_oem_cmd[] =
{
{ "filedump", fastboot_filedump },
{ "memdump", fastboot_memdump }
{ "memdump", fastboot_memdump },
#ifdef CONFIG_SYSTEM_FASTBOOTD_SHELL
{ "shell", fastboot_shell },
#endif
};
/****************************************************************************
@ -776,6 +784,37 @@ static void fastboot_filedump(FAR struct fastboot_ctx_s *context,
fastboot_okay(context, "");
}
#ifdef CONFIG_SYSTEM_FASTBOOTD_SHELL
static void fastboot_shell(FAR struct fastboot_ctx_s *context,
FAR const char *arg)
{
char response[FASTBOOT_MSG_LEN - 4];
FILE *fp;
int ret;
fp = popen(arg, "r");
if (fp == NULL)
{
fastboot_fail(context, "popen() fails %d", errno);
return;
}
while (fgets(response, sizeof(response), fp))
{
fastboot_ack(context, "TEXT", response);
}
ret = pclose(fp);
if (WIFEXITED(ret) && WEXITSTATUS(ret) == 0)
{
fastboot_okay(context, "");
return;
}
fastboot_fail(context, "error detected 0x%x %d", ret, errno);
}
#endif
static void fastboot_upload(FAR struct fastboot_ctx_s *context,
FAR const char *arg)
{