/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2015-09-25 Bernard the first verion for FinSH */ #include #include #include "msh.h" #if defined(FINSH_USING_MSH) && defined(RT_USING_DFS) #include static int msh_readline(int fd, char *line_buf, int size) { char ch; int index = 0; do { if (read(fd, &ch, 1) != 1) { /* nothing in this file */ return 0; } } while (ch == '\n' || ch == '\r'); /* set the first character */ line_buf[index ++] = ch; while (index < size) { if (read(fd, &ch, 1) == 1) { if (ch == '\n' || ch == '\r') { line_buf[index] = '\0'; break; } line_buf[index++] = ch; } else { line_buf[index] = '\0'; break; } } return index; } int msh_exec_script(const char *cmd_line, int size) { int ret; int fd = -1; char *pg_name; int length, cmd_length = 0; if (size == 0) return -RT_ERROR; /* get the length of command0 */ while ((cmd_line[cmd_length] != ' ' && cmd_line[cmd_length] != '\t') && cmd_length < size) cmd_length ++; /* get name length */ length = cmd_length + 32; /* allocate program name memory */ pg_name = (char *) rt_malloc(length); if (pg_name == RT_NULL) return -RT_ENOMEM; /* copy command0 */ memcpy(pg_name, cmd_line, cmd_length); pg_name[cmd_length] = '\0'; if (strstr(pg_name, ".sh") != RT_NULL || strstr(pg_name, ".SH") != RT_NULL) { /* try to open program */ fd = open(pg_name, O_RDONLY, 0); /* search in /bin path */ if (fd < 0) { rt_snprintf(pg_name, length - 1, "/bin/%.*s", cmd_length, cmd_line); fd = open(pg_name, O_RDONLY, 0); } } rt_free(pg_name); if (fd >= 0) { /* found script */ char *line_buf; int length; line_buf = (char *) rt_malloc(RT_CONSOLEBUF_SIZE); /* read line by line and then exec it */ do { length = msh_readline(fd, line_buf, RT_CONSOLEBUF_SIZE); if (length > 0) { char ch = '\0'; int index; for (index = 0; index < length; index ++) { ch = line_buf[index]; if (ch == ' ' || ch == '\t') continue; else break; } if (ch != '#') /* not a comment */ msh_exec(line_buf, length); } } while (length > 0); close(fd); rt_free(line_buf); ret = 0; } else { ret = -1; } return ret; } #endif