forked from KolibriOS/kolibrios
Shell 0.4 from Albom
git-svn-id: svn://kolibrios.org@959 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
aef7c5284b
commit
939f824d96
5
programs/system/shell/.shell
Normal file
5
programs/system/shell/.shell
Normal file
@ -0,0 +1,5 @@
|
||||
#SHS
|
||||
|
||||
about
|
||||
echo Type 'help' for help
|
||||
echo
|
39
programs/system/shell/all.h
Normal file
39
programs/system/shell/all.h
Normal file
@ -0,0 +1,39 @@
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
#include "kolibri.h"
|
||||
#include "stdlib.h"
|
||||
#include "string.h"
|
||||
|
||||
#include "globals.h"
|
||||
#include "prototypes.h"
|
||||
|
||||
#include "console.c"
|
||||
|
||||
#include "cmd_about.c"
|
||||
#include "cmd_help.c"
|
||||
#include "cmd_ver.c"
|
||||
#include "cmd_pwd.c"
|
||||
#include "cmd_ls.c"
|
||||
#include "cmd_ps.c"
|
||||
#include "cmd_kill.c"
|
||||
#include "cmd_echo.c"
|
||||
#include "cmd_date.c"
|
||||
#include "cmd_exit.c"
|
||||
#include "cmd_cd.c"
|
||||
#include "cmd_free.c"
|
||||
#include "cmd_reboot.c"
|
||||
#include "cmd_mkdir.c"
|
||||
#include "cmd_rmdir.c"
|
||||
#include "cmd_rm.c"
|
||||
#include "cmd_touch.c"
|
||||
#include "cmd_alias.c"
|
||||
#include "cmd_more.c"
|
||||
|
||||
#include "module_command.c"
|
||||
#include "module_program.c"
|
||||
#include "module_script.c"
|
||||
#include "module_executable.c"
|
||||
#include "module_alias.c"
|
||||
|
||||
/// ===========================================================
|
9
programs/system/shell/cmd_about.c
Normal file
9
programs/system/shell/cmd_about.c
Normal file
@ -0,0 +1,9 @@
|
||||
|
||||
void cmd_about()
|
||||
{
|
||||
printf("\n\rShell for KolibriOS\n\r");
|
||||
printf(" version %s\n\r", SHELL_VERSION);
|
||||
printf("\n\r author: Oleksandr Bogomaz aka Albom");
|
||||
printf("\n\r e-mail: albom85@yandex.ru");
|
||||
printf("\n\r site: http://albom06.boom.ru/\n\r\n\r");
|
||||
}
|
17
programs/system/shell/cmd_alias.c
Normal file
17
programs/system/shell/cmd_alias.c
Normal file
@ -0,0 +1,17 @@
|
||||
|
||||
void cmd_alias(char arg[])
|
||||
{
|
||||
|
||||
int result;
|
||||
|
||||
if (NULL == arg)
|
||||
{
|
||||
alias_list();
|
||||
return;
|
||||
}
|
||||
|
||||
result = alias_check(arg);
|
||||
if ( ( 0 != result ) && ( -1 != result ) )
|
||||
alias_add(arg);
|
||||
|
||||
}
|
47
programs/system/shell/cmd_cd.c
Normal file
47
programs/system/shell/cmd_cd.c
Normal file
@ -0,0 +1,47 @@
|
||||
|
||||
int cmd_cd(char dir[])
|
||||
{
|
||||
|
||||
char temp[256];
|
||||
unsigned result;
|
||||
|
||||
if (NULL == dir)
|
||||
{
|
||||
printf(" cd directory\n\r");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( 0 == strcmp(dir, ".") )
|
||||
return FALSE;
|
||||
|
||||
if ( ( 0 == strcmp(dir, "..") ) && ( 0 != strcmp(cur_dir, "/")) )
|
||||
{
|
||||
cur_dir[strlen(cur_dir)-1]='\0';
|
||||
dir_truncate(cur_dir);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( '/' == dir[0])
|
||||
{
|
||||
if ( dir_check(dir) )
|
||||
{
|
||||
strcpy(cur_dir, dir);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(temp, cur_dir);
|
||||
strcat(temp, dir);
|
||||
|
||||
if ( dir_check(temp) )
|
||||
{
|
||||
strcpy(cur_dir, temp);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
}
|
22
programs/system/shell/cmd_date.c
Normal file
22
programs/system/shell/cmd_date.c
Normal file
@ -0,0 +1,22 @@
|
||||
|
||||
|
||||
void cmd_date()
|
||||
{
|
||||
unsigned date;
|
||||
unsigned time;
|
||||
|
||||
date = kol_system_date_get();
|
||||
printf(" date [dd.mm.yy]: %x%x.%x%x.%x%x",
|
||||
(date&0xf00000)>>20, (date&0xf0000)>>16, // day
|
||||
(date&0xf000)>>12, (date&0xf00)>>8, //month
|
||||
(date&0xf0)>>4, (date&0xf) ); // year
|
||||
|
||||
|
||||
time = kol_system_time_get();
|
||||
|
||||
printf("\n\r time [hh:mm:ss]: %x%x:%x%x:%x%x\n\r",
|
||||
(time&0xf0)>>4, (time&0xf), // hours
|
||||
(time&0xf000)>>12, (time&0xf00)>>8, // minutes
|
||||
(time&0xf00000)>>20, (time&0xf0000)>>16 ); // seconds
|
||||
|
||||
}
|
6
programs/system/shell/cmd_echo.c
Normal file
6
programs/system/shell/cmd_echo.c
Normal file
@ -0,0 +1,6 @@
|
||||
|
||||
|
||||
void cmd_echo(char text[])
|
||||
{
|
||||
printf("%s\n\r", text);
|
||||
}
|
7
programs/system/shell/cmd_exit.c
Normal file
7
programs/system/shell/cmd_exit.c
Normal file
@ -0,0 +1,7 @@
|
||||
|
||||
void cmd_exit()
|
||||
{
|
||||
free(ALIASES);
|
||||
_exit(1);
|
||||
kol_exit();
|
||||
}
|
12
programs/system/shell/cmd_free.c
Normal file
12
programs/system/shell/cmd_free.c
Normal file
@ -0,0 +1,12 @@
|
||||
|
||||
void cmd_free()
|
||||
{
|
||||
unsigned total, free, used;
|
||||
|
||||
total = kol_system_mem();
|
||||
free = kol_system_memfree();
|
||||
used = total - free;
|
||||
|
||||
printf (" total [kB / MB / %%]: %-7d / %-5d / 100\n\r free [kB / MB / %%]: %-7d / %-5d / %d\n\r used [kB / MB / %%]: %-7d / %-5d / %d\n\r",
|
||||
total, total/1024, free, free/1024, (free*100)/total, used, total/1024-free/1024, 100-(free*100)/total );
|
||||
}
|
31
programs/system/shell/cmd_help.c
Normal file
31
programs/system/shell/cmd_help.c
Normal file
@ -0,0 +1,31 @@
|
||||
|
||||
int cmd_help(char cmd[])
|
||||
{
|
||||
|
||||
int i;
|
||||
|
||||
char available[]={" %d commands available:\n\r"};
|
||||
|
||||
if (NULL == cmd)
|
||||
{
|
||||
printf (available, NUM_OF_CMD);
|
||||
for (i = 0; i < NUM_OF_CMD; i++)
|
||||
printf(" %s\n\r", HELP_COMMANDS[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i=0; i<NUM_OF_CMD; i++)
|
||||
if ( !strcmp(cmd, HELP_COMMANDS[i]) )
|
||||
{
|
||||
printf(HELP_DESC[i]);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
printf (" Command \'%s\' not found.\n\r", cmd);
|
||||
printf (available, NUM_OF_CMD);
|
||||
for (i = 0; i < NUM_OF_CMD; i++)
|
||||
printf(" %s\n\r", HELP_COMMANDS[i]);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
43
programs/system/shell/cmd_kill.c
Normal file
43
programs/system/shell/cmd_kill.c
Normal file
@ -0,0 +1,43 @@
|
||||
|
||||
|
||||
int _atoi ( char *s )
|
||||
{
|
||||
int i, n;
|
||||
|
||||
n = 0;
|
||||
for ( i = 0; s[i]!= '\0'; ++i)
|
||||
if ((s[i]<'0') || (s[i]>'9'))
|
||||
return 0;
|
||||
else
|
||||
n = 10 * n + s[i] - '0';
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int cmd_kill(char process[])
|
||||
{
|
||||
|
||||
unsigned proc;
|
||||
int result;
|
||||
|
||||
if (NULL == process)
|
||||
{
|
||||
printf(" kill PID\n\r");
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
proc = _atoi(process);
|
||||
if ( 0 != proc )
|
||||
{
|
||||
result = kol_process_kill_pid(proc);
|
||||
if (result < 0)
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
41
programs/system/shell/cmd_ls.c
Normal file
41
programs/system/shell/cmd_ls.c
Normal file
@ -0,0 +1,41 @@
|
||||
|
||||
int cmd_ls(char dir[])
|
||||
{
|
||||
|
||||
kol_struct70 k70;
|
||||
unsigned *n;
|
||||
unsigned num_of_file;
|
||||
unsigned *t;
|
||||
unsigned type_of_file;
|
||||
int i;
|
||||
|
||||
k70.p00 = 1;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 2*1024*1024; // 2 MB
|
||||
k70.p16 = malloc(2*1024*1024);
|
||||
k70.p20 = 0;
|
||||
k70.p21 = dir;
|
||||
|
||||
if ( !kol_file_70(&k70) ) // ïðîâåðÿåì ñóùåñòâîâàíèå êàòàëîãà
|
||||
{
|
||||
free(k70.p16);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
n = k70.p16+8;
|
||||
num_of_file = *n; // ÷èñëî ôàéëîâ â êàòàëîãå
|
||||
|
||||
for (i = 0; i < num_of_file; i++)
|
||||
{
|
||||
printf (" %s", k70.p16+32+40+(264+40)*i);
|
||||
t = k70.p16+32+(264+40)*i;
|
||||
type_of_file = *t;
|
||||
if ( (0x10 == (type_of_file&0x10)) || (8 == (type_of_file&8)) )
|
||||
printf ("/");
|
||||
printf ("\n\r");
|
||||
}
|
||||
|
||||
free(k70.p16);
|
||||
return TRUE;
|
||||
}
|
44
programs/system/shell/cmd_mkdir.c
Normal file
44
programs/system/shell/cmd_mkdir.c
Normal file
@ -0,0 +1,44 @@
|
||||
|
||||
int cmd_mkdir(char dir[])
|
||||
{
|
||||
|
||||
char temp[256];
|
||||
kol_struct70 k70;
|
||||
unsigned result;
|
||||
|
||||
if (NULL == dir)
|
||||
{
|
||||
printf(" mkdir directory\n\r");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
if ( 0 == strcmp(dir, ".") || ( 0 == strcmp(dir, "..") ) || ( 0 == strcmp(cur_dir, "/")) )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
k70.p00 = 9;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
|
||||
if ( '/' == dir[0])
|
||||
k70.p21 = dir;
|
||||
else
|
||||
{
|
||||
strcpy(temp, cur_dir);
|
||||
strcat(temp, dir);
|
||||
k70.p21 = temp;
|
||||
}
|
||||
|
||||
result = kol_file_70(&k70);
|
||||
|
||||
if (0 == result)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
|
||||
}
|
87
programs/system/shell/cmd_more.c
Normal file
87
programs/system/shell/cmd_more.c
Normal file
@ -0,0 +1,87 @@
|
||||
|
||||
int cmd_more(char file[])
|
||||
{
|
||||
|
||||
kol_struct70 k70;
|
||||
kol_struct_BDVK bdvk;
|
||||
unsigned result, filesize, pos, i;
|
||||
char buf[81]; //áóôåð
|
||||
char temp[256];
|
||||
unsigned flags;
|
||||
|
||||
if (NULL == file)
|
||||
{
|
||||
printf (" less filename\n\r");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( '/' == file[0])
|
||||
{
|
||||
strcpy(temp, file);
|
||||
|
||||
if ( !file_check(temp) )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(temp, cur_dir);
|
||||
strcat(temp, file);
|
||||
|
||||
if ( !file_check(temp) )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
k70.p00 = 5;
|
||||
k70.p04 = k70.p08 = k70.p12 = 0;
|
||||
k70.p16 = &bdvk;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = temp;
|
||||
|
||||
result = kol_file_70(&k70); // ïîëó÷àåì èíôîðìàöèþ î ôàéëå
|
||||
if ( 0 != result )
|
||||
return FALSE;
|
||||
|
||||
filesize = bdvk.p32[0]; // ïîëó÷àåì ðàçìåð ôàéëà
|
||||
|
||||
buf[80]=0;
|
||||
flags = con_get_flags();
|
||||
|
||||
for (pos=0;pos<filesize;pos+=80)
|
||||
{
|
||||
|
||||
memset(buf, 0, 80);
|
||||
|
||||
k70.p00 = 0;
|
||||
k70.p04 = pos;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 80;
|
||||
k70.p16 = buf;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = temp;
|
||||
|
||||
result = kol_file_70(&k70); // ÷òåíèå 80 ñèìâîëîâ
|
||||
for (i=0; i<80; i++)
|
||||
{
|
||||
|
||||
if (27 == buf[i])
|
||||
con_set_flags(flags|0x100);
|
||||
else con_set_flags(flags);
|
||||
|
||||
printf ("%c", buf[i]);
|
||||
}
|
||||
if ( 0 != result )
|
||||
{
|
||||
con_set_flags(flags);
|
||||
printf ("\n\r");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
}
|
||||
con_set_flags(flags);
|
||||
printf ("\n\r");
|
||||
return TRUE;
|
||||
}
|
32
programs/system/shell/cmd_ps.c
Normal file
32
programs/system/shell/cmd_ps.c
Normal file
@ -0,0 +1,32 @@
|
||||
|
||||
int cmd_ps()
|
||||
{
|
||||
|
||||
int i, n;
|
||||
char *buf1k;
|
||||
unsigned PID;
|
||||
unsigned *p;
|
||||
short *s;
|
||||
short STATE;
|
||||
|
||||
buf1k = malloc(1024);
|
||||
if (NULL == buf1k)
|
||||
return FALSE;
|
||||
|
||||
for (i = 1;;i++)
|
||||
{
|
||||
n = kol_process_info(i, buf1k);
|
||||
p = buf1k+30;
|
||||
PID = *p;
|
||||
s = buf1k+50;
|
||||
STATE = *s;
|
||||
if ( 9 != STATE)
|
||||
printf (" %7d %s\n\r", PID, buf1k+10);
|
||||
if (i == n)
|
||||
break;
|
||||
}
|
||||
|
||||
free(buf1k);
|
||||
return TRUE;
|
||||
|
||||
}
|
5
programs/system/shell/cmd_pwd.c
Normal file
5
programs/system/shell/cmd_pwd.c
Normal file
@ -0,0 +1,5 @@
|
||||
|
||||
void cmd_pwd()
|
||||
{
|
||||
printf (" %s\n\r", cur_dir);
|
||||
}
|
5
programs/system/shell/cmd_reboot.c
Normal file
5
programs/system/shell/cmd_reboot.c
Normal file
@ -0,0 +1,5 @@
|
||||
|
||||
void cmd_reboot()
|
||||
{
|
||||
kol_system_end(3);
|
||||
}
|
50
programs/system/shell/cmd_rm.c
Normal file
50
programs/system/shell/cmd_rm.c
Normal file
@ -0,0 +1,50 @@
|
||||
|
||||
int cmd_rm(char file[])
|
||||
{
|
||||
|
||||
kol_struct70 k70;
|
||||
char temp[256];
|
||||
unsigned result;
|
||||
|
||||
if (NULL == file)
|
||||
{
|
||||
printf (" rm filename\n\r");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( '/' == file[0])
|
||||
{
|
||||
strcpy(temp, file);
|
||||
|
||||
if ( !file_check(temp) )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(temp, cur_dir);
|
||||
strcat(temp, file);
|
||||
|
||||
if ( !file_check(temp) )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
k70.p00 = 8;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = temp;
|
||||
|
||||
result = kol_file_70(&k70);
|
||||
|
||||
if (0 == result)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
|
||||
}
|
46
programs/system/shell/cmd_rmdir.c
Normal file
46
programs/system/shell/cmd_rmdir.c
Normal file
@ -0,0 +1,46 @@
|
||||
|
||||
int cmd_rmdir(char dir[])
|
||||
{
|
||||
|
||||
char temp[256];
|
||||
kol_struct70 k70;
|
||||
unsigned result;
|
||||
|
||||
if (NULL == dir)
|
||||
{
|
||||
printf(" rmdir directory\n\r");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( ( 0 == strcmp(dir, ".") ) || ( 0 == strcmp(dir, "..") ) || ( 0 == strcmp(cur_dir, "/")) )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
k70.p00 = 8;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
|
||||
if ( '/' == dir[0])
|
||||
k70.p21 = dir;
|
||||
else
|
||||
{
|
||||
strcpy(temp, cur_dir);
|
||||
strcat(temp, dir);
|
||||
k70.p21 = temp;
|
||||
}
|
||||
|
||||
if ( !dir_check(temp) )
|
||||
return FALSE;
|
||||
|
||||
result = kol_file_70(&k70);
|
||||
|
||||
if (0 == result)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
|
||||
}
|
54
programs/system/shell/cmd_touch.c
Normal file
54
programs/system/shell/cmd_touch.c
Normal file
@ -0,0 +1,54 @@
|
||||
|
||||
int cmd_touch(char file[])
|
||||
{
|
||||
|
||||
kol_struct70 k70;
|
||||
char temp[256];
|
||||
unsigned result;
|
||||
|
||||
if (NULL == file)
|
||||
{
|
||||
printf(" touch filename\n\r");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( ( 0 == strcmp(file, ".") ) || ( 0 == strcmp(file, "..") ) || ( 0 == strcmp(cur_dir, "/")) )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( '/' == file[0])
|
||||
{
|
||||
strcpy(temp, file);
|
||||
|
||||
if ( !file_check(temp) )
|
||||
k70.p00 = 2;
|
||||
else
|
||||
k70.p00 = 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(temp, cur_dir);
|
||||
strcat(temp, file);
|
||||
|
||||
if ( !file_check(temp) )
|
||||
k70.p00 = 2;
|
||||
else
|
||||
k70.p00 = 3;
|
||||
}
|
||||
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = temp;
|
||||
|
||||
result = kol_file_70(&k70);
|
||||
|
||||
if (0 == result)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
|
||||
}
|
5
programs/system/shell/cmd_ver.c
Normal file
5
programs/system/shell/cmd_ver.c
Normal file
@ -0,0 +1,5 @@
|
||||
|
||||
void cmd_ver()
|
||||
{
|
||||
printf (" %s\n\r", SHELL_VERSION);
|
||||
}
|
7
programs/system/shell/compile.bat
Normal file
7
programs/system/shell/compile.bat
Normal file
@ -0,0 +1,7 @@
|
||||
del shell.kex
|
||||
del shell.o
|
||||
fasm start.asm start.o
|
||||
gcc -c shell.c
|
||||
ld -nostdlib -T kolibri.ld -o shell.kex start.o kolibri.o stdlib.o string.o shell.o
|
||||
objcopy shell.kex -O binary
|
||||
pause
|
82
programs/system/shell/console.c
Normal file
82
programs/system/shell/console.c
Normal file
@ -0,0 +1,82 @@
|
||||
|
||||
///===========================
|
||||
|
||||
#define CON_COLOR_BLUE 1
|
||||
#define CON_COLOR_GREEN 2
|
||||
#define CON_COLOR_RED 4
|
||||
#define CON_COLOR_BRIGHT 8
|
||||
/* öâåò ôîíà */
|
||||
#define CON_BGR_BLUE 0x10
|
||||
#define CON_BGR_GREEN 0x20
|
||||
#define CON_BGR_RED 0x40
|
||||
#define CON_BGR_BRIGHT 0x80
|
||||
|
||||
///===========================
|
||||
|
||||
void (* _stdcall con_init)(unsigned w_w, unsigned w_h, unsigned s_w, unsigned s_h, const char* t);
|
||||
void (* _cdecl printf)(const char* format,...);
|
||||
void (* _stdcall _exit)(char bCloseWindow);
|
||||
void (* __stdcall gets)(char* str, int n);
|
||||
int (* __stdcall getch)(void);
|
||||
int (* __stdcall con_get_font_height)(void);
|
||||
int (* __stdcall con_set_cursor_height)(int new_height);
|
||||
unsigned (*__stdcall con_get_flags)(void);
|
||||
unsigned (*__stdcall con_set_flags)(unsigned new_flags);
|
||||
|
||||
///===========================
|
||||
|
||||
void CONSOLE_INIT(char title[])
|
||||
{
|
||||
kol_struct_import *imp;
|
||||
|
||||
imp = kol_cofflib_load("/sys/lib/console.obj");
|
||||
if (imp == NULL)
|
||||
kol_exit();
|
||||
|
||||
con_init = ( _stdcall void (*)(unsigned, unsigned, unsigned, unsigned, const char*))
|
||||
kol_cofflib_procload (imp, "con_init");
|
||||
if (con_init == NULL)
|
||||
kol_exit();
|
||||
|
||||
printf = ( _cdecl void (*)(const char*,...))
|
||||
kol_cofflib_procload (imp, "con_printf");
|
||||
if (printf == NULL)
|
||||
kol_exit();
|
||||
|
||||
_exit = ( _stdcall void (*)(char))
|
||||
kol_cofflib_procload (imp, "con_exit");
|
||||
if (_exit == NULL)
|
||||
kol_exit();
|
||||
|
||||
gets = ( _stdcall void (*)(char*, int))
|
||||
kol_cofflib_procload (imp, "con_gets");
|
||||
if (gets == NULL)
|
||||
kol_exit();
|
||||
|
||||
getch = ( _stdcall int (*)(void))
|
||||
kol_cofflib_procload (imp, "con_getch2");
|
||||
if (getch == NULL)
|
||||
kol_exit();
|
||||
|
||||
con_get_font_height = ( _stdcall int (*)(void))
|
||||
kol_cofflib_procload (imp, "con_get_font_height");
|
||||
if (con_get_font_height == NULL)
|
||||
kol_exit();
|
||||
|
||||
con_set_cursor_height = ( _stdcall int (*)(int))
|
||||
kol_cofflib_procload (imp, "con_set_cursor_height");
|
||||
if (con_set_cursor_height == NULL)
|
||||
kol_exit();
|
||||
|
||||
con_get_flags = ( _stdcall unsigned (*)(void))
|
||||
kol_cofflib_procload (imp, "con_get_flags");
|
||||
if (con_get_flags == NULL)
|
||||
kol_exit();
|
||||
|
||||
con_set_flags = ( _stdcall unsigned (*)(unsigned))
|
||||
kol_cofflib_procload (imp, "con_set_flags");
|
||||
if (con_set_flags == NULL)
|
||||
kol_exit();
|
||||
|
||||
con_init(-1, -1, -1, -1, title);
|
||||
}
|
82
programs/system/shell/globals.h
Normal file
82
programs/system/shell/globals.h
Normal file
@ -0,0 +1,82 @@
|
||||
|
||||
#define FALSE 0
|
||||
#define TRUE 1
|
||||
|
||||
#define SHELL_VERSION "0.4"
|
||||
|
||||
extern char PATH[256];
|
||||
extern char PARAM[256];
|
||||
|
||||
char title[64];
|
||||
char cur_dir[256];
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
char *ALIASES = NULL;
|
||||
unsigned ALIAS_NUM = 0;
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
#define CMD_HISTORY_NUM 5
|
||||
|
||||
char CMD[256];
|
||||
char CMD_HISTORY[CMD_HISTORY_NUM][256];
|
||||
char CMD_NUM;
|
||||
|
||||
unsigned CMD_POS;
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
char script_sign[] = {"#SHS"};
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
const NUM_OF_CMD = 19;
|
||||
|
||||
const char HELP_COMMANDS[][10]=
|
||||
{
|
||||
"about",
|
||||
"alias",
|
||||
"cd",
|
||||
"date",
|
||||
"echo",
|
||||
"exit",
|
||||
"free",
|
||||
"help",
|
||||
"kill",
|
||||
"ls",
|
||||
"mkdir",
|
||||
"more",
|
||||
"ps",
|
||||
"pwd",
|
||||
"reboot",
|
||||
"rm",
|
||||
"rmdir",
|
||||
"touch",
|
||||
"ver"
|
||||
};
|
||||
|
||||
const char HELP_DESC [][70]=
|
||||
{
|
||||
" Displays information about the program\n\r",
|
||||
" Allows the user view the current aliases\n\r",
|
||||
" Changes directories\n\r",
|
||||
" Returns the date and time\n\r",
|
||||
" Echoes the data to the screen\n\r",
|
||||
" Exits program\n\r",
|
||||
" Displays total, free and used memory\n\r",
|
||||
" Gives help\n\r",
|
||||
" Stops a running process\n\r",
|
||||
" Lists the files in a directory\n\r",
|
||||
" Makes directory\n\r",
|
||||
" Displays a data file to the screen\n\r",
|
||||
" Lists the current processes running\n\r",
|
||||
" Displays the name of the working directory\n\r",
|
||||
" Reboots the computer\n\r",
|
||||
" Removes files\n\r",
|
||||
" Removes directories\n\r",
|
||||
" Creates an empty file or updates the time/date stamp on a file\n\r",
|
||||
" Displays version\n\r"
|
||||
};
|
||||
|
||||
/// ===========================================================
|
90
programs/system/shell/kolibri.h
Normal file
90
programs/system/shell/kolibri.h
Normal file
@ -0,0 +1,90 @@
|
||||
|
||||
#define NULL ((void*)0)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned p00 __attribute__((packed));
|
||||
unsigned p04 __attribute__((packed));
|
||||
unsigned p08 __attribute__((packed));
|
||||
unsigned p12 __attribute__((packed));
|
||||
unsigned p16 __attribute__((packed));
|
||||
char p20 __attribute__((packed));
|
||||
char *p21 __attribute__((packed));
|
||||
} kol_struct70 __attribute__((packed));
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned p00 __attribute__((packed));
|
||||
char p04 __attribute__((packed));
|
||||
char p05[3] __attribute__((packed));
|
||||
unsigned p08 __attribute__((packed));
|
||||
unsigned p12 __attribute__((packed));
|
||||
unsigned p16 __attribute__((packed));
|
||||
unsigned p20 __attribute__((packed));
|
||||
unsigned p24 __attribute__((packed));
|
||||
unsigned p28 __attribute__((packed));
|
||||
unsigned p32[2] __attribute__((packed));
|
||||
unsigned p40 __attribute__((packed));
|
||||
} kol_struct_BDVK __attribute__((packed));
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *name __attribute__((packed));
|
||||
void *data __attribute__((packed));
|
||||
} kol_struct_import __attribute__((packed));
|
||||
|
||||
|
||||
void kol_exit();
|
||||
void kol_sleep(unsigned d);
|
||||
void kol_wnd_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c);
|
||||
void kol_wnd_move(unsigned x, unsigned y);
|
||||
void kol_wnd_caption(char *s);
|
||||
void kol_event_mask(unsigned e);
|
||||
unsigned kol_event_wait();
|
||||
unsigned kol_event_wait_time(unsigned time);
|
||||
unsigned kol_event_check();
|
||||
void kol_paint_start();
|
||||
void kol_paint_end();
|
||||
void kol_paint_pixel(unsigned x, unsigned y, unsigned c);
|
||||
void kol_paint_bar(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c);
|
||||
void kol_paint_line(unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned c);
|
||||
void kol_paint_string(unsigned x, unsigned y, char *s, unsigned c);
|
||||
void kol_paint_image(unsigned x, unsigned y, unsigned w, unsigned h, char *d);
|
||||
void kol_paint_image_pal(unsigned x, unsigned y, unsigned w, unsigned h, char *d, unsigned *palette);
|
||||
unsigned kol_key_get();
|
||||
unsigned kol_key_control();
|
||||
void kol_key_lang_set(unsigned lang);
|
||||
unsigned kol_key_lang_get();
|
||||
void kol_key_mode_set(unsigned mode);
|
||||
unsigned kol_key_mode_get();
|
||||
void kol_btn_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned d, unsigned c);
|
||||
unsigned kol_btn_get();
|
||||
void kol_btn_type(unsigned t);
|
||||
unsigned kol_mouse_pos();
|
||||
unsigned kol_mouse_posw();
|
||||
unsigned kol_mouse_btn();
|
||||
void kol_board_putc(char c);
|
||||
void kol_board_puts(char *s);
|
||||
void kol_board_puti(int n);
|
||||
int kol_file_70(kol_struct70 *k);
|
||||
kol_struct_import* kol_cofflib_load(char *name);
|
||||
void* kol_cofflib_procload (kol_struct_import *imp, char *name);
|
||||
unsigned kol_cofflib_procnum (kol_struct_import *imp);
|
||||
void kol_cofflib_procname (kol_struct_import *imp, char *name, unsigned n);
|
||||
unsigned kol_system_end(unsigned param);
|
||||
unsigned kol_system_cpufreq();
|
||||
unsigned kol_system_mem();
|
||||
unsigned kol_system_memfree();
|
||||
unsigned kol_system_time_get();
|
||||
unsigned kol_system_date_get();
|
||||
void kol_path_file2dir(char *dir, char *fname);
|
||||
void kol_path_full(char *full, char *fname);
|
||||
void kol_screen_wait_rr();
|
||||
void kol_screen_get_size(unsigned *w, unsigned *h);
|
||||
unsigned kol_skin_height();
|
||||
unsigned kol_thread_start(unsigned start, unsigned stack);
|
||||
unsigned kol_time_tick();
|
||||
unsigned kol_sound_speaker(char data[]);
|
||||
unsigned kol_process_info(unsigned slot, char buf1k[]);
|
||||
int kol_process_kill_pid(unsigned process);
|
20
programs/system/shell/kolibri.ld
Normal file
20
programs/system/shell/kolibri.ld
Normal file
@ -0,0 +1,20 @@
|
||||
/*OUTPUT_FORMAT("binary")*/
|
||||
ENTRY(Start)
|
||||
SECTIONS
|
||||
{
|
||||
.text 0x000000:
|
||||
{
|
||||
*(.text)
|
||||
}
|
||||
|
||||
.data : {
|
||||
*(.data)
|
||||
hEnd = . ;
|
||||
}
|
||||
|
||||
.bss :
|
||||
{
|
||||
*(.bss)
|
||||
}
|
||||
Memory = . ;
|
||||
}
|
133
programs/system/shell/module_alias.c
Normal file
133
programs/system/shell/module_alias.c
Normal file
@ -0,0 +1,133 @@
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int alias_check(char alias[])
|
||||
{
|
||||
|
||||
unsigned i;
|
||||
char buf1[256];
|
||||
char buf2[256];
|
||||
|
||||
if ( !alias_split (alias, buf1, buf2))
|
||||
return FALSE;
|
||||
|
||||
for (i = 0; i < NUM_OF_CMD; i++)
|
||||
if ( !strcmp(HELP_COMMANDS[i], buf1) )
|
||||
return -1;
|
||||
|
||||
if (NULL == ALIASES)
|
||||
ALIASES = malloc(128*1024);
|
||||
|
||||
if (NULL == ALIASES)
|
||||
return FALSE;
|
||||
|
||||
if ( 0 == ALIAS_NUM )
|
||||
return FALSE;
|
||||
|
||||
for (i = 0; i < ALIAS_NUM; i++)
|
||||
{
|
||||
if ( !strcmp(ALIASES+256*i, buf1) )
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int alias_search(char alias[])
|
||||
{
|
||||
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < ALIAS_NUM; i++)
|
||||
{
|
||||
if ( !strcmp(ALIASES+256*i, alias) )
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int alias_add(char alias[])
|
||||
{
|
||||
|
||||
char buf1[256];
|
||||
char buf2[256];
|
||||
|
||||
if ( ALIAS_NUM > 255)
|
||||
return FALSE;
|
||||
|
||||
if ( !alias_split (alias, buf1, buf2))
|
||||
return FALSE;
|
||||
|
||||
strcpy (ALIASES+256*ALIAS_NUM, buf1);
|
||||
strcpy (ALIASES+256*ALIAS_NUM+64*1024, buf2);
|
||||
ALIAS_NUM++;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
void alias_list()
|
||||
{
|
||||
|
||||
unsigned i;
|
||||
|
||||
if ( 0 == ALIAS_NUM)
|
||||
return;
|
||||
|
||||
for (i = 0; i < ALIAS_NUM; i++)
|
||||
printf (" %s=%s\n\r",ALIASES+256*i, ALIASES+256*i+64*1024);
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int alias_split (char alias[], char s1[], char s2[])
|
||||
{
|
||||
|
||||
unsigned i, j;
|
||||
|
||||
if (NULL == strchr(alias, '='))
|
||||
return FALSE;
|
||||
|
||||
for (i=0, j = 0;; i++)
|
||||
{
|
||||
if ('=' == alias[i])
|
||||
{
|
||||
s1[i]='\0';
|
||||
break;
|
||||
}
|
||||
s1[i]=alias[i];
|
||||
}
|
||||
|
||||
j = 0;
|
||||
|
||||
for (;; i++, j++)
|
||||
{
|
||||
s2[j]=alias[i];
|
||||
if ('\0' == alias[i])
|
||||
break;
|
||||
}
|
||||
|
||||
trim(s1);
|
||||
|
||||
for (i=0;;i++)
|
||||
{
|
||||
s2[i] = s2[i+1];
|
||||
if ('\0' == s2[i] )
|
||||
break;
|
||||
}
|
||||
|
||||
trim(s2);
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
/// ===========================================================
|
336
programs/system/shell/module_command.c
Normal file
336
programs/system/shell/module_command.c
Normal file
@ -0,0 +1,336 @@
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
void command_clear()
|
||||
{
|
||||
for (;CMD_POS;CMD_POS--)
|
||||
printf("%c %c", 8, 8);
|
||||
CMD[0]='\0';
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
void command_history_add(char command[])
|
||||
{
|
||||
|
||||
if ( (0 != strcmp( CMD_HISTORY[0], CMD)) &&
|
||||
(0 != strcmp( CMD_HISTORY[1], CMD)) &&
|
||||
(0 != strcmp( CMD_HISTORY[2], CMD)) &&
|
||||
(0 != strcmp( CMD_HISTORY[3], CMD)) &&
|
||||
(0 != strcmp( CMD_HISTORY[4], CMD)) )
|
||||
|
||||
{
|
||||
strcpy(CMD_HISTORY[4], CMD_HISTORY[3]);
|
||||
strcpy(CMD_HISTORY[3], CMD_HISTORY[2]);
|
||||
strcpy(CMD_HISTORY[2], CMD_HISTORY[1]);
|
||||
strcpy(CMD_HISTORY[1], CMD_HISTORY[0]);
|
||||
|
||||
strcpy(CMD_HISTORY[0], CMD);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
void command_get()
|
||||
{
|
||||
unsigned key;
|
||||
//unsigned pos = 0;
|
||||
int hist;
|
||||
|
||||
CMD_POS = 0;
|
||||
CMD_NUM = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
key = getch();
|
||||
if ( 0 != (key & 0xff) )
|
||||
{
|
||||
key &= 0xff;
|
||||
switch (key)
|
||||
{
|
||||
case 27: // ESC
|
||||
command_clear();
|
||||
break;
|
||||
|
||||
case 13: // ENTER
|
||||
CMD[CMD_POS] = '\0';
|
||||
printf("\n\r");
|
||||
|
||||
command_history_add(CMD);
|
||||
return;
|
||||
|
||||
case 8: // BACKSPACE
|
||||
if (CMD_POS > 0)
|
||||
{
|
||||
printf ("%c %c", 8, 8);
|
||||
CMD_POS--;
|
||||
}
|
||||
break;
|
||||
|
||||
case 9: // TAB
|
||||
break;
|
||||
|
||||
default:
|
||||
if (CMD_POS < 255)
|
||||
{
|
||||
CMD[CMD_POS] = key;
|
||||
CMD_POS++;
|
||||
printf("%c", key);
|
||||
}
|
||||
break;
|
||||
};
|
||||
}
|
||||
else // îáðàáîòêà ðàñøèðåííûõ êëàâèø
|
||||
{
|
||||
key = (key>>8)&0xff;
|
||||
// printf ("%d\n\r", key);
|
||||
|
||||
switch (key)
|
||||
{
|
||||
|
||||
case 72: // UP
|
||||
for (hist = 0; hist < CMD_HISTORY_NUM; hist++)
|
||||
{
|
||||
command_clear();
|
||||
|
||||
if (CMD_NUM < CMD_HISTORY_NUM-1)
|
||||
CMD_NUM++;
|
||||
else
|
||||
CMD_NUM = 0;
|
||||
|
||||
printf( CMD_HISTORY[CMD_NUM] );
|
||||
strcpy(CMD, CMD_HISTORY[CMD_NUM]);
|
||||
CMD_POS = strlen(CMD);
|
||||
|
||||
if (0!=strlen(CMD))
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 80: // DOWN
|
||||
for (hist = 0; hist < CMD_HISTORY_NUM; hist++)
|
||||
{
|
||||
command_clear();
|
||||
|
||||
if (CMD_NUM > 0)
|
||||
CMD_NUM--;
|
||||
else
|
||||
CMD_NUM = CMD_HISTORY_NUM-1;
|
||||
|
||||
printf( CMD_HISTORY[CMD_NUM] );
|
||||
strcpy(CMD, CMD_HISTORY[CMD_NUM]);
|
||||
CMD_POS = strlen(CMD);
|
||||
|
||||
if (0!=strlen(CMD))
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int command_get_cmd(char cmd[])
|
||||
{
|
||||
unsigned i;
|
||||
for (i=0;;i++)
|
||||
{
|
||||
cmd[i] = CMD[i];
|
||||
if (0 == cmd[i])
|
||||
{
|
||||
i = -2;
|
||||
break;
|
||||
}
|
||||
if ( iswhite(cmd[i]) )
|
||||
{
|
||||
cmd[i] = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
return i+1;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
void command_execute()
|
||||
{
|
||||
char cmd[256];
|
||||
char args[256];
|
||||
unsigned arg;
|
||||
|
||||
trim(CMD);
|
||||
arg = command_get_cmd(cmd);
|
||||
|
||||
if ( !strlen(cmd) )
|
||||
return;
|
||||
|
||||
strcpy(args, CMD+arg);
|
||||
trim(args);
|
||||
|
||||
if ( !strcmp(cmd, "help") )
|
||||
{
|
||||
if (-1 == arg)
|
||||
cmd_help(NULL);
|
||||
else
|
||||
cmd_help(args);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "ver") )
|
||||
{
|
||||
cmd_ver();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "cd") )
|
||||
{
|
||||
if (-1 == arg)
|
||||
cmd_cd(NULL);
|
||||
else
|
||||
cmd_cd(args);
|
||||
|
||||
if ( '/' != cur_dir[strlen(cur_dir)-1] )
|
||||
strcat(cur_dir, "/");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "ls") )
|
||||
{
|
||||
if (-1 == arg)
|
||||
cmd_ls(cur_dir);
|
||||
else
|
||||
cmd_ls(args);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "ps") )
|
||||
{
|
||||
cmd_ps();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "kill") )
|
||||
{
|
||||
if (-1 == arg)
|
||||
cmd_kill(NULL);
|
||||
else
|
||||
cmd_kill(args);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "pwd") )
|
||||
{
|
||||
cmd_pwd();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "mkdir") )
|
||||
{
|
||||
if (-1 == arg)
|
||||
cmd_mkdir(NULL);
|
||||
else
|
||||
cmd_mkdir(args);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "rmdir") )
|
||||
{
|
||||
if (-1 == arg)
|
||||
cmd_rmdir(NULL);
|
||||
else
|
||||
cmd_rmdir(args);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "rm") )
|
||||
{
|
||||
if (-1 == arg)
|
||||
cmd_rm(NULL);
|
||||
else
|
||||
cmd_rm(args);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "more") )
|
||||
{
|
||||
if (-1 == arg)
|
||||
cmd_more(NULL);
|
||||
else
|
||||
cmd_more(args);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "echo") )
|
||||
{
|
||||
cmd_echo(args);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "exit") )
|
||||
{
|
||||
cmd_exit();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "date") )
|
||||
{
|
||||
cmd_date();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "about") )
|
||||
{
|
||||
cmd_about();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "free") )
|
||||
{
|
||||
cmd_free();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "reboot") )
|
||||
{
|
||||
cmd_reboot();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "touch") )
|
||||
{
|
||||
if (-1 == arg)
|
||||
cmd_touch(NULL);
|
||||
else
|
||||
cmd_touch(args);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !strcmp(cmd, "alias") )
|
||||
{
|
||||
if (-1 == arg)
|
||||
cmd_alias(NULL);
|
||||
else
|
||||
cmd_alias(args);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( -1 != alias_search(CMD) )
|
||||
{
|
||||
strcpy(CMD, ALIASES+64*1024+256*alias_search(CMD));
|
||||
command_execute();
|
||||
return;
|
||||
}
|
||||
|
||||
executable_run(cmd, args);
|
||||
|
||||
}
|
||||
|
||||
/// ===========================================================
|
60
programs/system/shell/module_executable.c
Normal file
60
programs/system/shell/module_executable.c
Normal file
@ -0,0 +1,60 @@
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int executable_run(char cmd[], char args[])
|
||||
{
|
||||
|
||||
char exec[256];
|
||||
char error_starting[]={" No such command '%s'.\n\r"};
|
||||
int result;
|
||||
|
||||
if ( '/' == cmd[0]) // åñëè ïóòü àáñîëáòíûé
|
||||
{
|
||||
strcpy(exec, cmd);
|
||||
|
||||
if ( !file_check(exec) ) // ïðîâåðÿåì ñóùåñòâîâàíèå ôàéëà
|
||||
{
|
||||
printf(error_starting, cmd);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
strcpy(exec, cur_dir); // ïðîâåðÿåì ôàéë â òåêóùåì êàòàëîãå
|
||||
strcat(exec, cmd);
|
||||
|
||||
if ( !file_check(exec) ) // ïðîâåðÿåì ñóùåñòâîâàíèå ôàéëà
|
||||
{
|
||||
strcpy(exec, "/rd/1/"); // ïðîâåðÿåì ôàéë íà âèðòóàëüíîì äèñêå
|
||||
strcat(exec, cmd);
|
||||
if ( !file_check(exec) ) // ïðîâåðÿåì ñóùåñòâîâàíèå ôàéëà
|
||||
{
|
||||
printf(error_starting, cmd);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ( script_check(exec) )
|
||||
{
|
||||
return script_run(exec, args);
|
||||
}
|
||||
|
||||
/* çàïóñê ïðîãðàììû */
|
||||
result = program_run(exec, args);
|
||||
if (result > 0)
|
||||
{
|
||||
printf (" '%s' started. PID = %d\n\r", cmd, result);
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf(error_starting, cmd);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// ===========================================================
|
16
programs/system/shell/module_program.c
Normal file
16
programs/system/shell/module_program.c
Normal file
@ -0,0 +1,16 @@
|
||||
|
||||
int program_run(char cmd[], char param[])
|
||||
{
|
||||
|
||||
kol_struct70 k70;
|
||||
|
||||
k70.p00 = 7;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = param;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = cmd;
|
||||
|
||||
return kol_file_70(&k70);
|
||||
}
|
102
programs/system/shell/module_script.c
Normal file
102
programs/system/shell/module_script.c
Normal file
@ -0,0 +1,102 @@
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int script_check(char file[])
|
||||
{
|
||||
|
||||
kol_struct70 k70;
|
||||
char buf[4];
|
||||
|
||||
k70.p00 = 0;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 4; // ÷èòàòü 4 áàéòà
|
||||
k70.p16 = buf;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = file;
|
||||
|
||||
kol_file_70(&k70);
|
||||
|
||||
if ( !strcmp(buf, script_sign) )
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int script_run(char exec[], char args[])
|
||||
{
|
||||
|
||||
kol_struct70 k70;
|
||||
kol_struct_BDVK bdvk;
|
||||
unsigned result, filesize, pos, i;
|
||||
char *buf; //áóôåð, êóäà êîïèðóåòñÿ ñêðèïò
|
||||
|
||||
k70.p00 = 5;
|
||||
k70.p04 = k70.p08 = k70.p12 = 0;
|
||||
k70.p16 = &bdvk;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = exec;
|
||||
|
||||
result = kol_file_70(&k70); // ïîëó÷àåì èíôîðìàöèþ î ôàéëå
|
||||
if ( 0 != result )
|
||||
return FALSE;
|
||||
|
||||
filesize = bdvk.p32[0]; // ïîëó÷àåì ðàçìåð ôàéëà
|
||||
|
||||
buf = malloc(filesize+256);
|
||||
if (NULL == buf)
|
||||
return FALSE;
|
||||
|
||||
buf[filesize]=0;
|
||||
|
||||
k70.p00 = 0;
|
||||
k70.p04 = k70.p08 = 0;
|
||||
k70.p12 = filesize;
|
||||
k70.p16 = buf;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = exec;
|
||||
|
||||
result = kol_file_70(&k70); // ñ÷èòûâàåì ôàéë â áóôåð
|
||||
if ( 0 != result )
|
||||
{
|
||||
free(buf);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pos = 0;
|
||||
|
||||
for (;;) // îáðàáîòêà ñêðèïòà
|
||||
{
|
||||
|
||||
if (pos > filesize)
|
||||
break;
|
||||
|
||||
for (i=0;;i++) // ñ÷èòûâàíèå ñòðîêè
|
||||
{
|
||||
if ((0x0A == buf[pos])||(0x0D == buf[pos])||(0 == buf[pos]))
|
||||
{
|
||||
pos++;
|
||||
CMD[i] = '\0';
|
||||
break;
|
||||
}
|
||||
CMD[i] = buf[pos];
|
||||
pos++;
|
||||
}
|
||||
|
||||
if ( 0 == strlen(CMD) ) // ïóñòàÿ ñòðîêà
|
||||
continue;
|
||||
|
||||
if ('#' == CMD[0]) // êîììåíòàðèé
|
||||
continue;
|
||||
|
||||
command_execute();
|
||||
|
||||
}
|
||||
|
||||
free(buf);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
27
programs/system/shell/prototypes.h
Normal file
27
programs/system/shell/prototypes.h
Normal file
@ -0,0 +1,27 @@
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int file_check(char file[]);
|
||||
int dir_check(char dir[]);
|
||||
void dir_truncate(char dir[]);
|
||||
int iswhite(char c);
|
||||
void trim(char string[]);
|
||||
void execute();
|
||||
void kol_main();
|
||||
|
||||
int executable_run(char cmd[], char args[]);
|
||||
|
||||
void command_execute();
|
||||
void command_get();
|
||||
int command_get_cmd(char cmd[]);
|
||||
|
||||
int script_check(char file[]);
|
||||
int script_run(char exec[], char args[]);
|
||||
|
||||
int aliases_check(char alias[]);
|
||||
int alias_search(char alias[]);
|
||||
int alias_add(char alias[]);
|
||||
int alias_split (char alias[], char s1[], char s2[]);
|
||||
void alias_list();
|
||||
|
||||
/// ===========================================================
|
27
programs/system/shell/readme.txt
Normal file
27
programs/system/shell/readme.txt
Normal file
@ -0,0 +1,27 @@
|
||||
Shell for KolibriOS
|
||||
version 0.4
|
||||
|
||||
author: Oleksandr Bogomaz aka Albom
|
||||
e-mail: albom85@yandex.ru
|
||||
site: http://albom06.boom.ru/
|
||||
|
||||
Available commands:
|
||||
about Displays information about the program
|
||||
alias Allows the user view the current aliases
|
||||
cd Changes directories
|
||||
date Returns the date and time
|
||||
echo Echoes the data to the screen
|
||||
exit Exits program
|
||||
free Displays total, free and used memory
|
||||
help Gives help
|
||||
kill Stops a running process
|
||||
ls Lists the files in a directory
|
||||
mkdir Makes directory
|
||||
more Displays a data file to the screen
|
||||
ps Lists the current processes running
|
||||
pwd Displays the name of the working directory
|
||||
reboot Reboots the computer
|
||||
rm Removes files
|
||||
rmdir Removes directories
|
||||
touch Creates an empty file or updates the time/date stamp on a file
|
||||
ver Displays version
|
134
programs/system/shell/shell.c
Normal file
134
programs/system/shell/shell.c
Normal file
@ -0,0 +1,134 @@
|
||||
|
||||
#include "all.h"
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int dir_check(char dir[])
|
||||
{
|
||||
kol_struct70 k70;
|
||||
int result;
|
||||
|
||||
k70.p00 = 1;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 2*1024*1024; // 2 MB
|
||||
k70.p16 = malloc(2*1024*1024);
|
||||
k70.p20 = 0;
|
||||
k70.p21 = dir;
|
||||
|
||||
result = kol_file_70(&k70);
|
||||
|
||||
free(k70.p16);
|
||||
|
||||
if ( (0 == result)||(6 == result) )
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
void dir_truncate(char dir[])
|
||||
{
|
||||
int i;
|
||||
i = strlen(dir)-1;
|
||||
for (;;i--)
|
||||
if ('/' == dir[i])
|
||||
{
|
||||
dir[i+1] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int file_check(char file[])
|
||||
{
|
||||
kol_struct70 k70;
|
||||
int result;
|
||||
|
||||
k70.p00 = 0;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = file;
|
||||
|
||||
result = kol_file_70(&k70);
|
||||
|
||||
if (0 == result)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int iswhite(char c)
|
||||
{
|
||||
return ((' ' == c) || ('\t' == c) || (13 == c) || (10 == c));
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
void trim(char string[])
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for (i=0; ;i++)
|
||||
if ( !iswhite(string[i]) )
|
||||
break;
|
||||
j = 0;
|
||||
for (;;i++, j++)
|
||||
{
|
||||
string[j] = string[i];
|
||||
if ('\0' == string[i] )
|
||||
break;
|
||||
}
|
||||
|
||||
for (i=0; ;i++)
|
||||
if ('\0' == string[i])
|
||||
break;
|
||||
i--;
|
||||
for (;i>0;--i)
|
||||
if ( iswhite(string[i]) )
|
||||
string[i] = '\0';
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
void kol_main()
|
||||
{
|
||||
|
||||
strcpy(title, "SHELL ");
|
||||
strcat(title, SHELL_VERSION);
|
||||
CONSOLE_INIT(title);
|
||||
|
||||
strcpy(cur_dir, PATH);
|
||||
dir_truncate(cur_dir);
|
||||
|
||||
con_set_cursor_height(con_get_font_height()-1);
|
||||
|
||||
if (strlen(PARAM) > 0)
|
||||
strcpy(CMD, PARAM);
|
||||
else
|
||||
strcpy(CMD, ".shell");
|
||||
|
||||
command_execute();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
printf ("# ");
|
||||
command_get();
|
||||
command_execute();
|
||||
}
|
||||
|
||||
_exit(0);
|
||||
kol_exit();
|
||||
}
|
||||
|
||||
/// ===========================================================
|
14
programs/system/shell/stdlib.h
Normal file
14
programs/system/shell/stdlib.h
Normal file
@ -0,0 +1,14 @@
|
||||
|
||||
#define RAND_MAX 0x7FFFU
|
||||
|
||||
#define isspace(c) ((c)==' ')
|
||||
#define abs(i) (((i)<0)?(-(i)):(i))
|
||||
|
||||
#define random(num) ((rand()*(num))/((RAND_MAX+1)))
|
||||
|
||||
void* malloc(unsigned size);
|
||||
void free(void *pointer);
|
||||
void* realloc(void* pointer, unsigned size);
|
||||
|
||||
void srand (unsigned seed);
|
||||
int rand (void);
|
12
programs/system/shell/string.h
Normal file
12
programs/system/shell/string.h
Normal file
@ -0,0 +1,12 @@
|
||||
|
||||
#define NULL ((void*)0)
|
||||
|
||||
void* memset(void *mem, int c, unsigned size);
|
||||
void* memcpy(void *dst, const void *src, unsigned size);
|
||||
|
||||
void strcat(char strDest[], char strSource[]);
|
||||
int strcmp(const char* string1, const char* string2);
|
||||
void strcpy(char strDest[], const char strSource[]);
|
||||
char* strncpy(char *strDest, const char *strSource, unsigned n);
|
||||
int strlen(const char* string);
|
||||
char *strchr(const char* string, int c);
|
Loading…
Reference in New Issue
Block a user