aos/usr/shelly/shelly_cmd.c
2022-06-01 17:01:45 +02:00

105 lines
2.9 KiB
C

#include <stdlib.h>
#include "shelly.h"
__attribute__((__used__))
static void parse_cmd_line(char * line, int * argc, char ** argv) {
*argc = 0;
char *token = strtok(line, " ");
while (token != NULL) {
argv[*argc] = token;
token = strtok(NULL, " ");
*argc += 1;
}
}
static errval_t shelly_cmd_help(char * line) {
errval_t err;
err = shelly_write_str("commands implemented:\n\r");
if (err_is_fail(err)) return err;
err = shelly_write_str("- echo\n\r");
if (err_is_fail(err)) return err;
err = shelly_write_str("- run\n\r");
if (err_is_fail(err)) return err;
err = shelly_write_str("- ps\n\r");
if (err_is_fail(err)) return err;
err = shelly_write_str("- help\n\r");
if (err_is_fail(err)) return err;
return SYS_ERR_OK;
}
static errval_t shelly_cmd_echo(char * line) {
errval_t err;
err = shelly_write_str(line);
if (err_is_fail(err)) return err;
return SYS_ERR_OK;
}
static errval_t shelly_cmd_run(char * line) {
errval_t err;
SHELLY_DEBUG("[shelly_cmd_run] line=%s\n", line);
// start process
domainid_t pid;
struct aos_rpc * rpc = aos_rpc_get_process_channel();
err = aos_rpc_process_spawn(rpc, line, 0, &pid);
if (err == SPAWN_ERR_FIND_MODULE) {
err = shelly_write_str("[run]:couldn't find module:\n\r");
if (err_is_fail(err)) return err;
err = shelly_write_str(line);
if (err_is_fail(err)) return err;
err = shelly_write_str("\n\r");
if (err_is_fail(err)) return err;
} else if (err_is_fail(err)) return err_push(err, SHELLY_ERR_SPAWN_RPC);
return SYS_ERR_OK;
}
static errval_t shelly_cmd_ps(char * line) {
errval_t err;
domainid_t *pids;
size_t pid_count;
struct aos_rpc * rpc = aos_rpc_get_process_channel();
err = aos_rpc_process_get_all_pids(rpc, &pids, &pid_count);
if (err_is_fail(err)) return err_push(err, SHELLY_ERR_PS_RPC);
shelly_write_str("PIDs:\n\r");
char buf[256];
for(size_t i = 0; i < pid_count; ++i) {
snprintf(buf, 256, " %lu\n\r", pids[i]);
shelly_write_str(buf);
}
return SYS_ERR_OK;
}
static errval_t handle_shelly_cmd(char* line, size_t len) {
// SHELLY_DEBUG("[handle_shelly_cmd] len=%d\n", len);
if (len <= 1) {
return SYS_ERR_OK;
}
char * cmd = strtok(line, " ");
char * remaining_line = line + strlen(cmd) + 1;
// debug_printf("remaining_line = %s\n", remaining_line);
if (strcmp(cmd, "echo") == 0) {
return shelly_cmd_echo(remaining_line);
} else if (strcmp(cmd, "run") == 0) {
return shelly_cmd_run(remaining_line);
} else if (strcmp(cmd, "ps") == 0) {
return shelly_cmd_ps(remaining_line);
} else if (strcmp(cmd, "help") == 0) {
return shelly_cmd_help(remaining_line);
} else {
char buf[256];
snprintf(buf, 256, "unknown command \"%s\"\n\r", cmd);
shelly_write_str(buf);
}
return SYS_ERR_OK;
}