forked from KolibriOS/kolibrios
Compare commits
1 Commits
main
...
shell-impr
| Author | SHA1 | Date | |
|---|---|---|---|
| bb075099b6 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -9,3 +9,4 @@ ehthumbs_vista.db
|
|||||||
._*
|
._*
|
||||||
programs/cmm/cmm.code-workspace
|
programs/cmm/cmm.code-workspace
|
||||||
programs/cmm/menu/.gitignore
|
programs/cmm/menu/.gitignore
|
||||||
|
.vscode
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ int cmd_kfetch(char param[]) {
|
|||||||
char str_resolution[24];
|
char str_resolution[24];
|
||||||
ksys_pos_t resol = _ksys_screen_size();
|
ksys_pos_t resol = _ksys_screen_size();
|
||||||
sprintf(str_resolution, "%u x %u", resol.x + 1, resol.y + 1);
|
sprintf(str_resolution, "%u x %u", resol.x + 1, resol.y + 1);
|
||||||
char str_cpu_info[16];
|
char str_cpu_info[50];
|
||||||
get_str_cpu_info(str_cpu_info);
|
get_cpu_brand_string(str_cpu_info);
|
||||||
char str_meminfo[24];
|
char str_meminfo[24];
|
||||||
get_str_meminfo(str_meminfo);
|
get_str_meminfo(str_meminfo);
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ int cmd_kfetch(char param[]) {
|
|||||||
"\033[0;34;40m \033[0;31;40m \033[0;32;40mS\033[0;34;40m@\033[0;5;34;40mX\033[0;1;35;45m.\033[0;1;34;44m8\033[0;5;35;45m \033[0;5;34;44m \033[0;1;30;45m8\033[0;5;35;44m:\033[0;5;37;45m@\033[0;1;30;40m8\033[0;31;40m.\033[0;34;40m \033[0;31;40m \033[0;34;40m \033[0m\n\r"
|
"\033[0;34;40m \033[0;31;40m \033[0;32;40mS\033[0;34;40m@\033[0;5;34;40mX\033[0;1;35;45m.\033[0;1;34;44m8\033[0;5;35;45m \033[0;5;34;44m \033[0;1;30;45m8\033[0;5;35;44m:\033[0;5;37;45m@\033[0;1;30;40m8\033[0;31;40m.\033[0;34;40m \033[0;31;40m \033[0;34;40m \033[0m\n\r"
|
||||||
"\033[0;34;40m \033[0;31;40m \033[0;32;40m \033[0;31;40m.\033[0;32;40m;\033[0;34;40m;8\033[0;32;40m%%\033[0;5;34;40m8\033[0;34;40m8\033[0;1;30;44m8\033[0;1;30;40m8\033[0;34;40m;.\033[0;31;40m \033[0;34;40m \033[0;31;40m \033[0;34;40m \033[0m\n\r"
|
"\033[0;34;40m \033[0;31;40m \033[0;32;40m \033[0;31;40m.\033[0;32;40m;\033[0;34;40m;8\033[0;32;40m%%\033[0;5;34;40m8\033[0;34;40m8\033[0;1;30;44m8\033[0;1;30;40m8\033[0;34;40m;.\033[0;31;40m \033[0;34;40m \033[0;31;40m \033[0;34;40m \033[0m\n\r"
|
||||||
"\033[0;34;40m \033[0;32;40m \033[0;31;40m \033[0;32;40m.\033[0;31;40m.\033[0;32;40m.\033[0;31;40m.\033[0;32;40m.\033[0;31;40m:. \033[0;32;40m. \033[0;34;40m \033[0;31;40m \033[0;34;40m \033[0m\n\r",
|
"\033[0;34;40m \033[0;32;40m \033[0;31;40m \033[0;32;40m.\033[0;31;40m.\033[0;32;40m.\033[0;31;40m.\033[0;32;40m.\033[0;31;40m:. \033[0;32;40m. \033[0;34;40m \033[0;31;40m \033[0;34;40m \033[0m\n\r",
|
||||||
|
|
||||||
"\033[0;36mOS\033[0m: KolibriOS ", str_os_rel_offset_dbgtag, "\033[0;36mKernel\033[0m: ", str_krn_abi_cmtid, "\033[0;36mUptime\033[0m: ", str_uptime, "\033[0;36mResolution\033[0m: ", str_resolution, "\033[0;36mCPU\033[0m: ", str_cpu_info, "\033[0;36mMemory\033[0m: ", str_meminfo
|
"\033[0;36mOS\033[0m: KolibriOS ", str_os_rel_offset_dbgtag, "\033[0;36mKernel\033[0m: ", str_krn_abi_cmtid, "\033[0;36mUptime\033[0m: ", str_uptime, "\033[0;36mResolution\033[0m: ", str_resolution, "\033[0;36mCPU\033[0m: ", str_cpu_info, "\033[0;36mMemory\033[0m: ", str_meminfo
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,65 +1,72 @@
|
|||||||
#include "../system/kolibri.h"
|
#include "../system/kolibri.h"
|
||||||
|
|
||||||
void get_str_kernel_version(char *str, const char *fmt) {
|
void get_str_kernel_version(char *str, const char *fmt) {
|
||||||
struct kernel_version kv;
|
struct kernel_version kv;
|
||||||
|
|
||||||
kol_get_kernel_ver(&kv);
|
kol_get_kernel_ver(&kv);
|
||||||
char str_offset[8] = {'\0'};
|
char str_offset[8] = {'\0'};
|
||||||
if (kv.offset)
|
if (kv.offset)
|
||||||
sprintf(str_offset, "+%u", kv.offset);
|
sprintf(str_offset, "+%u", kv.offset);
|
||||||
char str_dbgtag[4] = {'\0'};
|
char str_dbgtag[4] = {'\0'};
|
||||||
if (kv.dbgtag)
|
if (kv.dbgtag)
|
||||||
sprintf(str_dbgtag, "-%c", kv.dbgtag);
|
sprintf(str_dbgtag, "-%c", kv.dbgtag);
|
||||||
char str_cmtid[16] = {'\0'};
|
char str_cmtid[16] = {'\0'};
|
||||||
if (kv.cmtid)
|
if (kv.cmtid)
|
||||||
sprintf(str_cmtid, " (%08x)", kv.cmtid);
|
sprintf(str_cmtid, " (%08x)", kv.cmtid);
|
||||||
|
|
||||||
sprintf(str, fmt, kv.osrel[0], kv.osrel[1], kv.osrel[2], kv.osrel[3],
|
sprintf(str, fmt, kv.osrel[0], kv.osrel[1], kv.osrel[2], kv.osrel[3],
|
||||||
str_offset, str_dbgtag, str_cmtid, kv.abimaj, kv.abimin);
|
str_offset, str_dbgtag, str_cmtid, kv.abimaj, kv.abimin);
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_str_cpu_info(char *str) {
|
// Retrieves the CPU Brand String and writes it to the provided buffer.
|
||||||
unsigned a, b, c, d;
|
// out_buffer: A buffer of at least 49 bytes (48 for string + 1 for null)
|
||||||
|
void get_cpu_brand_string(char *out_buffer) {
|
||||||
asm ("cpuid" :
|
if (!out_buffer) return;
|
||||||
"=a" (a),
|
|
||||||
"=b" (b),
|
uint32_t regs[4];
|
||||||
"=c" (c),
|
|
||||||
"=d" (d):
|
// 1. Check maximum extended function support
|
||||||
"a"(0));
|
__asm__ (
|
||||||
|
"cpuid"
|
||||||
str[0] = (b&0x000000ff) >> 0;
|
: "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3])
|
||||||
str[1] = (b&0x0000ff00) >> 8;
|
: "a" (0x80000000)
|
||||||
str[2] = (b&0x00ff0000) >> 16;
|
);
|
||||||
str[3] = (b&0xff000000) >> 24;
|
|
||||||
|
if (regs[0] < 0x80000004) {
|
||||||
str[4] = (d&0x000000ff) >> 0;
|
strcpy(out_buffer, "Brand String Not Supported");
|
||||||
str[5] = (d&0x0000ff00) >> 8;
|
return;
|
||||||
str[6] = (d&0x00ff0000) >> 16;
|
}
|
||||||
str[7] = (d&0xff000000) >> 24;
|
|
||||||
|
// 2. Extract brand string from leaves 0x80000002 to 0x80000004
|
||||||
str[8] = (c&0x000000ff) >> 0;
|
for (uint32_t leaf = 0x80000002; leaf <= 0x80000004; leaf++) {
|
||||||
str[9] = (c&0x0000ff00) >> 8;
|
__asm__ (
|
||||||
str[10] = (c&0x00ff0000) >> 16;
|
"cpuid"
|
||||||
str[11] = (c&0xff000000) >> 24;
|
: "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3])
|
||||||
str[12] = '\0';
|
: "a" (leaf)
|
||||||
}
|
);
|
||||||
|
|
||||||
int cmd_ver(char param[]) {
|
// Copy the 16 bytes (4 registers * 4 bytes) from this leaf into the buffer
|
||||||
if (!strcmp(param, "kernel")) {
|
memcpy(out_buffer + (leaf - 0x80000002) * 16, regs, 16);
|
||||||
get_str_kernel_version(tmpstr, CMD_VER_FMT1);
|
}
|
||||||
printf(tmpstr);
|
|
||||||
return TRUE;
|
out_buffer[48] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strcmp(param, "cpu")) {
|
int cmd_ver(char param[]) {
|
||||||
char str[13];
|
if (!strcmp(param, "kernel")) {
|
||||||
get_str_cpu_info(str);
|
get_str_kernel_version(tmpstr, CMD_VER_FMT1);
|
||||||
printf("%s\n\r", str);
|
printf(tmpstr);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf (" Shell v%s\n\r", SHELL_VERSION);
|
if (!strcmp(param, "cpu")) {
|
||||||
return TRUE;
|
char str[49];
|
||||||
}
|
get_cpu_brand_string(str);
|
||||||
|
printf("%s\n\r", str);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf (" Shell v%s\n\r", SHELL_VERSION);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,170 +1,170 @@
|
|||||||
|
|
||||||
#include "all.h"
|
#include "all.h"
|
||||||
|
|
||||||
int dir_check(char dir[])
|
int dir_check(char dir[])
|
||||||
/// just checks, if dir[] is really a directory
|
/// just checks, if dir[] is really a directory
|
||||||
{
|
{
|
||||||
kol_struct70 k70;
|
kol_struct70 k70;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
k70.p00 = 1;
|
k70.p00 = 1;
|
||||||
k70.p04 = 0;
|
k70.p04 = 0;
|
||||||
//k70.p08 = 0;
|
//k70.p08 = 0;
|
||||||
k70.p12 = 2; // enough to read . & ..
|
k70.p12 = 2; // enough to read . & ..
|
||||||
k70.p16 = (unsigned)malloc(32+k70.p12*560);
|
k70.p16 = (unsigned)malloc(32+k70.p12*560);
|
||||||
k70.p20 = 0;
|
k70.p20 = 0;
|
||||||
k70.p21 = dir;
|
k70.p21 = dir;
|
||||||
|
|
||||||
result = kol_file_70(&k70);
|
result = kol_file_70(&k70);
|
||||||
|
|
||||||
free((void*)k70.p16);
|
free((void*)k70.p16);
|
||||||
|
|
||||||
if ( (0 == result)||(6 == result) ) // 6 is possible ???
|
if ( (0 == result)||(6 == result) ) // 6 is possible ???
|
||||||
return TRUE;
|
return TRUE;
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void dir_truncate(char dir[])
|
void dir_truncate(char dir[])
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
i = strlen(dir)-1;
|
i = strlen(dir)-1;
|
||||||
for (;;i--)
|
for (;;i--)
|
||||||
if ('/' == dir[i])
|
if ('/' == dir[i])
|
||||||
{
|
{
|
||||||
dir[i+1] = 0;
|
dir[i+1] = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_file_dir_loc(char *filepath, char *dir_path)
|
void get_file_dir_loc(char *filepath, char *dir_path)
|
||||||
{
|
{
|
||||||
char *res = strrchr(filepath, '/');
|
char *res = strrchr(filepath, '/');
|
||||||
if (res == 0)
|
if (res == 0)
|
||||||
{
|
{
|
||||||
dir_path = '\0';
|
dir_path = '\0';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
size_t pos = res - filepath;
|
size_t pos = res - filepath;
|
||||||
strncpy(dir_path, filepath, pos);
|
strncpy(dir_path, filepath, pos);
|
||||||
dir_path[pos] = '\0';
|
dir_path[pos] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int file_check(char file[])
|
int file_check(char file[])
|
||||||
{
|
{
|
||||||
kol_struct70 k70;
|
kol_struct70 k70;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
k70.p00 = 0;
|
k70.p00 = 0;
|
||||||
k70.p04 = 0;
|
k70.p04 = 0;
|
||||||
//k70.p08 = 0;
|
//k70.p08 = 0;
|
||||||
k70.p12 = 0;
|
k70.p12 = 0;
|
||||||
k70.p16 = 0;
|
k70.p16 = 0;
|
||||||
k70.p20 = 0;
|
k70.p20 = 0;
|
||||||
k70.p21 = file;
|
k70.p21 = file;
|
||||||
|
|
||||||
result = kol_file_70(&k70);
|
result = kol_file_70(&k70);
|
||||||
|
|
||||||
if (0 == result)
|
if (0 == result)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void file_not_found(char file[]) {
|
void file_not_found(char file[]) {
|
||||||
printf (FILE_NOT_FOUND_ERROR, file);
|
printf (FILE_NOT_FOUND_ERROR, file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int iswhite(char c) {return ((' ' == c) || ('\t' == c) || (13 == c) || (10 == c)); }
|
int iswhite(char c) {return ((' ' == c) || ('\t' == c) || (13 == c) || (10 == c)); }
|
||||||
|
|
||||||
void trim(char string[])
|
void trim(char string[])
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
for (i=0; ;i++)
|
for (i=0; ;i++)
|
||||||
if ( !iswhite(string[i]) )
|
if ( !iswhite(string[i]) )
|
||||||
break;
|
break;
|
||||||
j = 0;
|
j = 0;
|
||||||
for (;;i++, j++)
|
for (;;i++, j++)
|
||||||
{
|
{
|
||||||
string[j] = string[i];
|
string[j] = string[i];
|
||||||
if ('\0' == string[i] )
|
if ('\0' == string[i] )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; ;i++)
|
for (i=0; ;i++)
|
||||||
if ('\0' == string[i])
|
if ('\0' == string[i])
|
||||||
break;
|
break;
|
||||||
i--;
|
i--;
|
||||||
for (;i>0;--i)
|
for (;i>0;--i)
|
||||||
if ( iswhite(string[i]) )
|
if ( iswhite(string[i]) )
|
||||||
string[i] = '\0';
|
string[i] = '\0';
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// entry point
|
// entry point
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i; for (i = 1; i < argc; i++) {
|
int i; for (i = 1; i < argc; i++) {
|
||||||
strcat(cmdline, argv[i]);
|
strcat(cmdline, argv[i]);
|
||||||
if (i != argc - 1) {
|
if (i != argc - 1) {
|
||||||
strcat(cmdline, " ");
|
strcat(cmdline, " ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NUM_OF_CMD = sizeof(COMMANDS)/sizeof(COMMANDS[0]);
|
NUM_OF_CMD = sizeof(COMMANDS)/sizeof(COMMANDS[0]);
|
||||||
strcpy(title, "SHELL ");
|
strcpy(title, "SHELL ");
|
||||||
strcat(title, SHELL_VERSION);
|
strcat(title, SHELL_VERSION);
|
||||||
con_init_opt(-1, -1, -1, -1, title);
|
con_init_opt(-1, -1, -1, -1, title);
|
||||||
|
|
||||||
//printf("argc = %d\ncmdline = '%s'\n", argc, cmdline);
|
//printf("argc = %d\ncmdline = '%s'\n", argc, cmdline);
|
||||||
|
|
||||||
if (sizeof (kol_struct70) != 25) {
|
if (sizeof (kol_struct70) != 25) {
|
||||||
printf("Invalid struct align kol_struct70, need to fix compile options\n\r");
|
printf("Invalid struct align kol_struct70, need to fix compile options\n\r");
|
||||||
kol_exit();
|
kol_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
//strcpy(cur_dir, PATH);
|
//strcpy(cur_dir, PATH);
|
||||||
//dir_truncate(cur_dir);
|
//dir_truncate(cur_dir);
|
||||||
getcwd(cur_dir, sizeof cur_dir);
|
getcwd(cur_dir, sizeof cur_dir);
|
||||||
//printf("curdir %s\n", cur_dir);
|
//printf("curdir %s\n", cur_dir);
|
||||||
|
|
||||||
con_set_cursor_height(con_get_font_height()-1);
|
con_set_cursor_height(con_get_font_height()-1);
|
||||||
|
|
||||||
ALIASES = malloc(128*1024);
|
ALIASES = malloc(128*1024);
|
||||||
|
|
||||||
if (!cmdline || cmdline[0] == 0) {
|
if (!cmdline || cmdline[0] == 0) {
|
||||||
strcpy(CMD, argv[0]);
|
strcpy(CMD, argv[0]);
|
||||||
dir_truncate(CMD);
|
dir_truncate(CMD);
|
||||||
strcat(CMD, ".shell");
|
strcat(CMD, ".shell");
|
||||||
if ( !file_check(CMD) )
|
if ( !file_check(CMD) )
|
||||||
strcpy(CMD, "/sys/settings/.shell");
|
strcpy(CMD, "/sys/settings/.shell");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (cmdline[0] == '/')
|
if (cmdline[0] == '/')
|
||||||
{
|
{
|
||||||
strcpy(cur_dir, cmdline);
|
strcpy(cur_dir, cmdline);
|
||||||
*(strrchr(cur_dir, '/')+1)=0;
|
*(strrchr(cur_dir, '/')+1)=0;
|
||||||
}
|
}
|
||||||
strcpy(CMD, cmdline);
|
strcpy(CMD, cmdline);
|
||||||
}
|
}
|
||||||
|
|
||||||
command_execute();
|
command_execute();
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
//printf("\033[32;1m");
|
//printf("\033[32;1m");
|
||||||
printf ("# ");
|
printf ("# ");
|
||||||
//printf("\033[0m");
|
//printf("\033[0m");
|
||||||
command_get();
|
command_get();
|
||||||
command_execute();
|
command_execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
con_exit(0);
|
con_exit(0);
|
||||||
kol_exit();
|
kol_exit();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user