This is an automated email from the ASF dual-hosted git repository.

pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git

commit 29374c96c35162861eab99bf88e667198a31aef7
Author: Xiang Xiao <xiaoxi...@xiaomi.com>
AuthorDate: Sun Jan 23 16:04:06 2022 +0800

    system/adb: Replace NuttX special shell service with microADB builtin one
    
    since the new libuv porting support uv_proccess_t now
    
    Signed-off-by: Xiang Xiao <xiaoxi...@xiaomi.com>
---
 system/adb/Kconfig         |  33 ++++--
 system/adb/Makefile        |   3 +-
 system/adb/shell_pipe.c    | 259 ---------------------------------------------
 system/adb/shell_pipe.h    |  56 ----------
 system/adb/shell_service.c | 212 -------------------------------------
 5 files changed, 26 insertions(+), 537 deletions(-)

diff --git a/system/adb/Kconfig b/system/adb/Kconfig
index 2fe73b4..92511e3 100644
--- a/system/adb/Kconfig
+++ b/system/adb/Kconfig
@@ -59,7 +59,7 @@ config ADBD_RESET_BOOTLOADER
        default 2
 endif # BOARDCTL_RESET
 
-if ! BOARDCTL_UNIQUEID
+if !BOARDCTL_UNIQUEID
 config ADBD_DEVICE_ID
        string "Default adb device id"
        default ""
@@ -136,20 +136,37 @@ config ADBD_FILE_SERVICE
        ---help---
                Enable "adb ls/push/pull" feature.
 
- config ADBD_SHELL_SERVICE
-       bool "ADB shell support"
-       depends on NSH_CONSOLE
-       default n
-       ---help---
-               Enable "adb shell" feature.
-
 config ADBD_FILE_SYMLINK
        bool "File service symlink support"
        default n
+       depends on ADBD_FILE_SERVICE
        depends on PSEUDOFS_SOFTLINKS
        ---help---
                Enable fs symlink support.
 
+config ADBD_SHELL_SERVICE
+       bool "ADB shell support"
+       depends on SYSTEM_NSH
+       select LIBC_EXECFUNCS
+       select PSEUDOTERM
+       default n
+       ---help---
+               Enable "adb shell" feature.
+
+config ADBD_SHELL_SERVICE_CMD
+       string "ADB shell command"
+       depends on ADBD_SHELL_SERVICE
+       default "sh"
+       ---help---
+               The shell command name.
+
+config ADBD_SHELL_SERVICE_PATH
+       string "ADB shell path"
+       depends on ADBD_SHELL_SERVICE
+       default "/bin/sh"
+       ---help---
+               The path to the shell executable.
+
 config ADBD_BOARD_INIT
        bool "Board initialization"
        depends on BOARDCTL
diff --git a/system/adb/Makefile b/system/adb/Makefile
index 2280d79..f13fff9 100644
--- a/system/adb/Makefile
+++ b/system/adb/Makefile
@@ -76,8 +76,7 @@ CSRCS += logcat_service.c
 endif
 
 ifeq ($(CONFIG_ADBD_SHELL_SERVICE),y)
-CSRCS += shell_service.c
-CSRCS += shell_pipe.c
+CSRCS += $(ADB_UNPACKNAME)/hal/shell_service_uv.c
 endif
 
 context:: $(ADB_UNPACKDIR)
diff --git a/system/adb/shell_pipe.c b/system/adb/shell_pipe.c
deleted file mode 100644
index a3dc6b1..0000000
--- a/system/adb/shell_pipe.c
+++ /dev/null
@@ -1,259 +0,0 @@
-/****************************************************************************
- * apps/system/adb/shell_pipe.c
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.  The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <uv.h>
-#include <unistd.h>
-#include "adb.h"
-#include "shell_pipe.h"
-#include "hal/hal_uv_priv.h"
-
-#include <nshlib/nshlib.h>
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-static void shell_on_data_available(uv_poll_t * handle,
-                                    int status, int events)
-{
-  int ret;
-  apacket_uv_t *ap;
-  shell_pipe_t *pipe = container_of(handle, shell_pipe_t, handle);
-
-  adb_client_t *client = (adb_client_t *)pipe->handle.data;
-
-  if (status)
-    {
-      adb_log("status error %d\n", status);
-
-      /* FIXME missing logic here */
-
-      pipe->on_data_cb(pipe, NULL);
-      return;
-    }
-
-  ap = adb_uv_packet_allocate((adb_client_uv_t *)client, 0);
-  if (ap == NULL)
-    {
-      /* frame allocation failed. Try again later */
-
-      uv_poll_stop(&pipe->handle);
-      return;
-    }
-
-  int nread = 0;
-  do
-    {
-      ret = read(handle->io_watcher.fd, &ap->p.data[nread], 1);
-
-      if (ret == 0)
-        {
-          /* EOF */
-
-          break;
-        }
-
-      if (ret < 0)
-        {
-          /* Revisit. EAGAIN should not happen but it happens a lot */
-
-          if (errno == EAGAIN)
-            {
-              if (nread <= 0)
-                {
-                  adb_hal_apacket_release(
-                    (adb_client_t *)pipe->handle.data, &ap->p);
-                  return;
-                }
-              break;
-            }
-
-          /* Release packet and forward error */
-
-          adb_hal_apacket_release((adb_client_t *)pipe->handle.data, &ap->p);
-          pipe->on_data_cb(pipe, NULL);
-          return;
-        }
-
-      /* FIXME CR LF conversion */
-
-      if (ap->p.data[nread++] == '\n')
-        {
-          ap->p.data[nread++] = '\r';
-        }
-    }
-  while (nread < CONFIG_ADBD_PAYLOAD_SIZE - 1);
-
-  ap->p.msg.data_length = nread;
-  pipe->on_data_cb(pipe, &ap->p);
-}
-
-static void shell_pipe_close_callback(uv_handle_t *handle)
-{
-  shell_pipe_t *pipe = container_of(handle, shell_pipe_t, handle);
-
-  /* Close stdout pipe */
-
-  close(pipe->write_fd);
-
-  /* Notify caller pipe is closed */
-
-  pipe->close_cb(pipe);
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-int shell_pipe_setup(adb_client_t *client, shell_pipe_t *apipe)
-{
-  apipe->handle.data = client;
-  return 0;
-}
-
-void shell_pipe_destroy(shell_pipe_t *pipe, void (*close_cb)(shell_pipe_t *))
-{
-  pipe->close_cb = close_cb;
-  close(pipe->write_fd);
-
-  if (uv_fileno((const uv_handle_t *)&pipe->handle, &pipe->write_fd))
-    {
-      pipe->write_fd = -1;
-    }
-
-  uv_close((uv_handle_t *)&pipe->handle, shell_pipe_close_callback);
-}
-
-int shell_pipe_write(shell_pipe_t *pipe, const void *buf, size_t count)
-{
-  /* TODO revisit */
-
-  return write(pipe->write_fd, buf, count);
-}
-
-int shell_pipe_start(shell_pipe_t *pipe,
-                     void (*on_data_cb)(shell_pipe_t *, apacket *))
-{
-  pipe->on_data_cb = on_data_cb;
-  return uv_poll_start(&pipe->handle, UV_READABLE, shell_on_data_available);
-}
-
-int shell_pipe_exec(char * const argv[], shell_pipe_t *apipe,
-                    void (*on_data_cb)(shell_pipe_t *, apacket *))
-{
-  int ret;
-  int in_fds[2];
-  int out_fds[2];
-
-  adb_client_uv_t *client = (adb_client_uv_t *)apipe->handle.data;
-
-  /* Create pipe for stdin */
-
-  if ((ret = pipe(in_fds)))
-    {
-      adb_log("failed to open in pipe %d\n", errno);
-      goto exit_fail;
-    }
-
-  if ((ret = pipe(out_fds)))
-    {
-      adb_log("failed to open out pipe %d\n", errno);
-      goto exit_close_pipe_in;
-    }
-
-  apipe->write_fd = in_fds[1];
-
-  /* Setup stdout (read: adb, write: child) */
-
-  ret = dup2(out_fds[1], 1);
-  assert(ret == 1);
-
-  ret = close(out_fds[1]);
-  assert(ret == 0);
-
-  ret = fcntl(out_fds[0], F_GETFD);
-  assert(ret >= 0);
-  ret = fcntl(out_fds[0], F_SETFD, ret | FD_CLOEXEC);
-  assert(ret == 0);
-  ret = fcntl(out_fds[0], F_GETFL);
-  assert(ret >= 0);
-  ret = fcntl(out_fds[0], F_SETFL, ret | O_NONBLOCK);
-  assert(ret >= 0);
-
-  /* Setup stdin */
-
-  ret = dup2(in_fds[0], 0);
-  assert(ret == 0);
-
-  ret = close(in_fds[0]);
-  assert(ret == 0);
-
-  ret = fcntl(in_fds[1], F_GETFD);
-  assert(ret >= 0);
-  ret = fcntl(in_fds[1], F_SETFD, ret | FD_CLOEXEC);
-  assert(ret == 0);
-  ret = fcntl(in_fds[1], F_GETFL);
-  assert(ret >= 0);
-  ret = fcntl(in_fds[1], F_SETFL, ret | O_NONBLOCK);
-  assert(ret == 0);
-
-  ret = uv_poll_init(
-      adb_uv_get_client_handle(client)->loop,
-      &apipe->handle, out_fds[0]);
-
-  /* TODO check return code */
-
-  assert(ret == 0);
-
-  /* Create shell process */
-
-  ret = task_create("ADB shell", CONFIG_SYSTEM_NSH_PRIORITY,
-                    CONFIG_SYSTEM_NSH_STACKSIZE,
-                    argv ? nsh_system : nsh_consolemain,
-                    argv);
-
-  /* Close stdin and stdout */
-
-  dup2(2, 0);
-  dup2(2, 1);
-
-  /* TODO check return code */
-
-  assert(ret >= 0);
-
-  /* Start listening shell process stdout */
-
-  ret = shell_pipe_start(apipe, on_data_cb);
-
-  /* TODO check return code */
-
-  assert(ret == 0);
-  return 0;
-
-exit_close_pipe_in:
-  close(in_fds[0]);
-  close(in_fds[1]);
-exit_fail:
-  return ret;
-}
diff --git a/system/adb/shell_pipe.h b/system/adb/shell_pipe.h
deleted file mode 100644
index 0450091..0000000
--- a/system/adb/shell_pipe.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/****************************************************************************
- * apps/system/adb/shell_pipe.h
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.  The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <uv.h>
-#include "adb.h"
-
-/****************************************************************************
- * Private types
- ****************************************************************************/
-
-struct shell_pipe_s
-{
-  uv_poll_t handle;
-  int write_fd;
-  void (*close_cb)(struct shell_pipe_s *);
-  void (*on_data_cb)(struct shell_pipe_s *, struct apacket_s *);
-};
-
-typedef struct shell_pipe_s shell_pipe_t;
-
-/****************************************************************************
- * Public Function Prototypes
- ****************************************************************************/
-
-int shell_pipe_setup(adb_client_t *client, shell_pipe_t *pipe);
-int shell_pipe_start(shell_pipe_t *pipe,
-                     void (*on_data_cb)(shell_pipe_t *, apacket *));
-void shell_pipe_destroy(shell_pipe_t *pipe,
-                        void (*close_cb)(shell_pipe_t *));
-int shell_pipe_write(shell_pipe_t *pipe, const void *buf, size_t count);
-
-int shell_pipe_exec(char * const argv[], shell_pipe_t *pipe,
-                    void (*on_data_cb)(shell_pipe_t *, apacket *));
-int shell_exec_builtin(const char *appname, FAR char *const *argv,
-                       shell_pipe_t *apipe);
diff --git a/system/adb/shell_service.c b/system/adb/shell_service.c
deleted file mode 100644
index 5b306f8..0000000
--- a/system/adb/shell_service.c
+++ /dev/null
@@ -1,212 +0,0 @@
-/****************************************************************************
- * apps/system/adb/shell_service.c
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.  The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <stdlib.h>
-
-#include "adb.h"
-#include "shell_service.h"
-#include "shell_pipe.h"
-
-/****************************************************************************
- * Private types
- ****************************************************************************/
-
-typedef struct ash_service_s
-{
-  adb_service_t service;
-  shell_pipe_t pipe;
-  adb_client_t *client;
-} ash_service_t;
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-static void exec_on_data_available(shell_pipe_t * pipe, apacket * p);
-
-static int shell_ack(adb_service_t *service, apacket *p);
-static int shell_write(adb_service_t *service, apacket *p);
-static void shell_close(struct adb_service_s *service);
-static void shell_kick(adb_service_t *service);
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-static void exec_on_data_available(shell_pipe_t * pipe, apacket * p)
-{
-  ash_service_t *service = container_of(pipe, ash_service_t, pipe);
-
-  if (p->msg.data_length <= 0)
-    {
-      /* Got EOF */
-
-      adb_service_close(service->client, &service->service, p);
-      return;
-    }
-
-  p->write_len = p->msg.data_length;
-  p->msg.arg0 = service->service.id;
-  p->msg.arg1 = service->service.peer_id;
-  adb_send_data_frame(service->client, p);
-}
-
-static int shell_write(adb_service_t *service, apacket *p)
-{
-  int ret;
-  ash_service_t *svc = container_of(service, ash_service_t, service);
-  UNUSED(svc);
-
-  if (p->msg.data_length <= 0)
-    {
-      return -1;
-    }
-
-  ret = shell_pipe_write(&svc->pipe, p->data, p->msg.data_length);
-
-  if (ret < 0)
-    {
-      /* Shell process terminated, close service */
-
-      return -1;
-    }
-
-  assert(ret == p->msg.data_length);
-  return 0;
-}
-
-static int shell_ack(adb_service_t *service, apacket *p)
-{
-  UNUSED(service);
-  UNUSED(p);
-  return 0;
-}
-
-static void shell_kick(adb_service_t *service)
-{
-  int ret;
-  ash_service_t *svc = container_of(service, ash_service_t, service);
-  ret = shell_pipe_start(&svc->pipe, exec_on_data_available);
-
-  /* TODO handle return code */
-
-  assert(ret == 0);
-}
-
-static void shell_on_close(shell_pipe_t *pipe)
-{
-  ash_service_t *svc = container_of(pipe, ash_service_t, pipe);
-  free(svc);
-}
-
-static void shell_close(adb_service_t *service)
-{
-  ash_service_t *svc = container_of(service, ash_service_t, service);
-
-  /* FIXME missing logic here if shell process is still running */
-
-  shell_pipe_destroy(&svc->pipe, shell_on_close);
-}
-
-static const adb_service_ops_t shell_ops =
-{
-  .on_write_frame = shell_write,
-  .on_ack_frame   = shell_ack,
-  .on_kick        = shell_kick,
-  .close          = shell_close
-};
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-adb_service_t * shell_service(adb_client_t *client, const char *params)
-{
-  UNUSED(params);
-  UNUSED(client);
-
-  int ret;
-  char **argv;
-  const char *target;
-  ash_service_t *service =
-      (ash_service_t *)malloc(sizeof(ash_service_t));
-
-  if (service == NULL)
-    {
-      return NULL;
-    }
-
-  service->client = client;
-  service->service.ops = &shell_ops;
-
-  ret = shell_pipe_setup(client, &service->pipe);
-
-  /* TODO check return code */
-
-  assert(ret == 0);
-
-  /* Check parameters after "shell:" */
-
-  target = &params[6];
-
-  if (target[0] != 0)
-    {
-      /* Build argv: <nsh -c "command">
-       * argv[0] => "-c"
-       * argv[1] => command
-       * argv[2] => NULL
-       *
-       * malloc content:
-       * - x3 argv pointers
-       * - 3 characters: "-c\0"
-       * - space for command string
-       */
-
-      argv = malloc(sizeof(char *) * 3 + 3 + (strlen(target)+1));
-
-      argv[0] = (char *)&argv[3];
-      argv[1] = &((char *)&argv[3])[3];
-      argv[2] = NULL;
-      strcpy(argv[0], "-c");
-      strcpy(argv[1], target);
-    }
-  else
-    {
-      argv = NULL;
-    }
-
-  ret = shell_pipe_exec(argv, &service->pipe,
-                        exec_on_data_available);
-
-  free(argv);
-
-  if (ret)
-    {
-      adb_log("failed to setup shell pipe %d\n", ret);
-      free(service);
-      return NULL;
-    }
-
-  return &service->service;
-}

Reply via email to