| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "netsvc.h" |
| |
| #include <stdio.h> |
| |
| #include <lib/fdio/io.h> |
| #include <lib/fdio/spawn.h> |
| #include <zircon/processargs.h> |
| #include <zircon/syscalls.h> |
| |
| static void run_program(const char* progname, const char** argv, zx_handle_t h) { |
| zx_handle_t logger = ZX_HANDLE_INVALID; |
| zx_debuglog_create(ZX_HANDLE_INVALID, 0, &logger); |
| |
| fdio_spawn_action_t actions[] = { |
| {.action = FDIO_SPAWN_ACTION_SET_NAME, .name = {.data = progname}}, |
| {.action = FDIO_SPAWN_ACTION_ADD_HANDLE, |
| .h = {.id = PA_HND(PA_FD, 0 | FDIO_FLAG_USE_FOR_STDIO), .handle = logger}}, |
| {.action = FDIO_SPAWN_ACTION_ADD_HANDLE, .h = {.id = PA_HND(PA_USER0, 0), .handle = h}}, |
| }; |
| |
| size_t action_count = (h == ZX_HANDLE_INVALID) ? 2 : 3; |
| uint32_t flags = FDIO_SPAWN_CLONE_ALL & ~FDIO_SPAWN_CLONE_STDIO; |
| char err_msg[FDIO_SPAWN_ERR_MSG_MAX_LENGTH]; |
| |
| zx_status_t status = fdio_spawn_etc(ZX_HANDLE_INVALID, flags, argv[0], argv, NULL, action_count, |
| actions, NULL, err_msg); |
| |
| if (status != ZX_OK) { |
| printf("netsvc: cannot launch %s: %d: %s\n", argv[0], status, err_msg); |
| } |
| } |
| |
| void netboot_run_cmd(const char* cmd) { |
| const char* argv[] = {"/boot/bin/sh", "-c", cmd, NULL}; |
| printf("net cmd: %s\n", cmd); |
| run_program("net:sh", argv, ZX_HANDLE_INVALID); |
| } |