shell 0.5 could run console apps

git-svn-id: svn://kolibrios.org@2502 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Albom 2012-03-23 18:53:16 +00:00
parent 1386fef88b
commit 762c577e6a
15 changed files with 336 additions and 23 deletions

View File

@ -0,0 +1,23 @@
Shell 0.5 // 23.03.2012 // Albom
=======================================
* Добавлена поддержка консольных приложений, которые общаются с шеллом через именованную область
Консольное приложение может быть написано на любом языке программирования - это обыкновенная программа для КолибриОС.
1) Консольное приложение после своего запуска В ПЕРВУЮ ОЧЕРЕДЬ должно создать именованную область с именем pid-SHELL, где pid - идентификатор процесса с заглавными нулями,
например: 42 -> 0042 (т.е. сейчас ограничение до 9999).
+ нужно сделать, чтобы программа корректно завершалась, если запущена не из шелла (СЕЙЧАС НЕ РЕАЛИЗОВАНО!!!)
2) Первый байт области - команда (т.е. максимум 255 команд), далее - данные (могут отсутствовать).
Список команд для версии 0.5:
SC_OK 0 ничего не делать
SC_EXIT 1 выход
SC_PUTC 2 вывести на экран символ
SC_PUTS 3 вывести на экран строку
SC_GETC 4 считать с клавиатуры символ
SC_GETS 5 считать с клавиатуры строку
SC_CLS 6 очистить экран
3) Программа должна САМА заботиться о рациональном использовании процессорного времени.
4) Программа должна САМА заботиться о закрытии именованной области.

View File

@ -1,22 +1,32 @@
Shell 0.5 // 23.03.2012 // Albom
=======================================
* Добавлена поддержка консольных приложений, которые общаются с шеллом через именованную область
Shell 0.4.6 // 30.01.2011 // Albom
=======================================
* Временно удалены команды killall и ccpuid (чтобы вернуть, необходимо раскомментировать 2 строчки)
* Исправления в текстовых строках
Shell 0.4.52 // 25.10.2010 // Pterox
=======================================
* Добавлена команда "killall" - убивает все процессы кроме OS/IDLE.
* Фиксы
Shell 0.4.51 // 21.10.2010 // Pterox
=======================================
* Команда "turnoff" переименована в "shutdown", "kerver" удалена - теперь её заменяет "ver kernel"; фиксы.
Shell 0.4.5 // 19.10.2010 // Pterox
=======================================
Программа теперь многоязыковая (английский, и русский язык). Программа полностью русифицированна.
* Команда "free" переименована в "memory" - для точности.
* Добавлены команды turnoff (выключить компьютер), kerver (версия ядра KoOS), uptime; reboot теперь может перезагружать ядро ("reboot kernel")
Shell 0.4.4 // 20.08.2010 // Albom
=======================================
1) шелл корректно завершается при закрытии окна
@ -29,19 +39,23 @@ Shell 0.4.4 // 20.08.2010 // Albom
1) добавить переменную (одну!), в которую будет результат в текстовой форме (не то что возвращает ф-ция) записываться. с ней можно будет работать из командной строки.
2) внедрить простую стековую машину для вычислений с вещественными числами.
Shell 0.4.3 // 20.08.2010 // Albom
=======================================
* Смесь версий 0.4.1 и 0.4.2. Теперь в архиве все исходные файлы, необходимые для компиляции (раньше использовались объектники с моими обёртками, исходники я с шеллом не выкладывал)
Shell 0.4.2 // 28.08.2009 // diamond
=======================================
* Добавил корректное завершение работы при закрытии окна консоли, работает только начиная с последней на данный момент версией библиотеки (лежит на svn, включена в ночную сборку). Перекомпилировал в VS2008 с LTCG, ещё пошаманил с оптимизацией по размеру.
Shell 0.4.1 // 16.03.2009 // Albom
=======================================
* версия с исправленными ошибками.
* работает команда alias, добавлена команда clear.
Shell 0.4 // 12.08.2008 // Albom
=======================================
1) Работает схема псевдонимов (до 256 команд)
@ -68,6 +82,7 @@ shell /sys/somescript
- просмотр текстовых и бинарных файлов (вроде бы задача простая, но пришлось повозиться с управляющими символами)
- очень не рекомендуется просматривать большие файлы
Shell 0.3 // 07.08.2008 // Albom
=======================================
1) Возможность запуска скриптов.
@ -84,20 +99,24 @@ Shell 0.3 // 07.08.2008 // Albom
* до 256 (можно изменить при компиляции) синонимов
* пока работает только добавление и просмотр синонимов, а отработка пока не реализована.
Shell 0.2 // 04.08.2008 // Albom
=======================================
* добавил новые функции
* написал собственную процедуру ввода команды
Shell 0.11 // 01.08.2008 // Albom
=======================================
* Добавил команды free и reboot, внёс некоторые изменения, исправил найденные ошибки.
Shell 0.1 // 29.07.2008 // Albom
=======================================
* Реализованы (не полностью) команды: about, cd, date, echo, exit, help, kill, ls, ps, pwd, ver
* При запуске программы (если не указан полный путь) она ищется в каталоге /rd/1 и текущем каталоге.
Shell 0.02 // 27.07.2008 // Albom
=======================================
* Реализовал команды:
@ -108,6 +127,7 @@ Shell 0.02 // 27.07.2008 // Albom
kill - завершить процесс по PID
help (с параметром и без) - помощь
Shell 0.01 // 27.07.2008 // Albom
=======================================
* Решил написать функциональный шелл на Си с использованием console.obj.

View File

@ -44,6 +44,7 @@
#include "cmd/cmd_killall.c"
#include "modules/module_command.c"
#include "modules/module_program_console.c"
#include "modules/module_program.c"
#include "modules/module_script.c"
#include "modules/module_executable.c"

View File

@ -5,8 +5,6 @@ int cmd_ps(char param[])
int i, n;
char *buf1k;
unsigned PID;
unsigned *p;
short *s;
short STATE;
buf1k = malloc(1024);
@ -16,10 +14,8 @@ if (NULL == buf1k)
for (i = 1;;i++)
{
n = kol_process_info(i, buf1k);
p = buf1k+30;
PID = *p;
s = buf1k+50;
STATE = *s;
PID = *(buf1k+30);
STATE = *(buf1k+50);
if ( 9 != STATE)
printf (" %7d %s\n\r", PID, buf1k+10);
if (i == n)

View File

@ -9,7 +9,7 @@ gcc -c system/string.c
gcc -c system/ctype.c
ld -nostdlib -T kolibri.ld -o shell start.o kolibri.o stdlib.o string.o ctype.o shell.o
objcopy shell -O binary
erase lang.h start.o shell.o kolibri.o stdlib.o string.o
erase lang.h start.o shell.o kolibri.o stdlib.o string.o ctype.o
kpack shell
move shell bin\rus\
copy locale\rus\.shell bin\rus\

View File

@ -0,0 +1,14 @@
@echo off
fasm start.asm start.o
gcc -c test.c
gcc -c system/kolibri.c
gcc -c system/stdlib.c
gcc -c system/string.c
gcc -c system/ctype.c
ld -nostdlib -T kolibri.ld -o test start.o kolibri.o stdlib.o string.o ctype.o test.o
objcopy test -O binary
erase start.o kolibri.o stdlib.o string.o ctype.o test.o
kpack test
copy test bin\eng\
move test bin\rus\
pause

View File

@ -1,5 +1,5 @@
#define SHELL_VERSION "0.4.91"
#define SHELL_VERSION "0.5"
extern char PATH[256];
extern char PARAM[256];

View File

@ -49,11 +49,15 @@ if ( script_check(exec) )
result = program_run(exec, args);
if (result > 0)
{
#if LANG_ENG
printf (" '%s' started. PID = %d\n\r", cmd, result);
#elif LANG_RUS
printf (" '%s' § ¯ã饭. PID = %d\n\r", cmd, result);
#endif
if ( !program_console(result) )
{
#if LANG_ENG
printf (" '%s' started. PID = %d\n\r", cmd, result);
#elif LANG_RUS
printf (" '%s' § ¯ã饭. PID = %d\n\r", cmd, result);
#endif
}
return TRUE;
}
else

View File

@ -0,0 +1,95 @@
#include "../program_console.h"
int program_console(int pid)
{
char name[32];
char *buffer;
int result;
int i;
char command;
int size;
int is_end;
_itoa(pid, name);
strcat(name, "-SHELL");
buffer = NULL;
for (i = 0; i < 30; i++)
{
result = kol_buffer_open(name, SHM_OPEN | SHM_WRITE, 0, &buffer);
if (buffer != NULL)
break;
kol_sleep(2);
}
if (buffer == NULL)
return 0;
else
size = result;
is_end = 0;
for (;;)
{
command = *(buffer);
switch (command)
{
case SC_EXIT:
*buffer = SC_OK;
is_end = 1;
break;
case SC_OK:
kol_sleep(5);
break;
case SC_CLS:
con_cls();
*buffer = SC_OK;
break;
case SC_PUTC:
printf("%c", *(buffer+1));
*buffer = SC_OK;
break;
case SC_PUTS:
printf("%s", buffer+1 );
*buffer = SC_OK;
break;
case SC_GETC:
*(buffer+1) = (char) getch() ;
*buffer = SC_OK;
break;
case SC_GETS:
gets(buffer+1, size-2);
*buffer = SC_OK;
break;
default:
#if LANG_ENG
printf (" Error in console application.\n\r");
#elif LANG_RUS
printf (" Îøèáêà â êîíñîëüíîì ïðèëîæåíèè.\n\r");
#endif
return 0;
};
if (is_end)
{
printf("\n\r");
return 1;
}
}
return 9;
}

View File

@ -0,0 +1,8 @@
#define SC_OK 0
#define SC_EXIT 1
#define SC_PUTC 2
#define SC_PUTS 3
#define SC_GETC 4
#define SC_GETS 5
#define SC_CLS 6

View File

@ -215,14 +215,13 @@ while (*(s+i))
void kol_board_puti(int n)
{
char c;
int i = 0;
do
{
c = n % 10 + '0';
asm ("int $0x40"::"a"(63), "b"(1), "c"(c));
i++;
}
while ((n /= 10) > 0);
if ( n > 1 )
kol_board_puti(n / 10);
c = n % 10 + '0';
asm ("int $0x40"::"a"(63), "b"(1), "c"(c));
}
@ -419,4 +418,17 @@ asm ("int $0x40"::"a"(18), "b"(2), "c"(process));
void kol_get_kernel_ver(char buff16b[])
{
asm ("int $0x40"::"a"(18), "b"(13), "c"(buff16b));
}
}
int kol_buffer_open(char name[], int mode, int size, char **buf)
{
int error;
asm ("movl %0, %%esi"::"r"(mode));
asm ("int $0x40":"=a"(*buf), "=d"(error):"a"(68), "b"(22), "c"(name), "d"(size));
return error;
}
void kol_buffer_close(char name[])
{
asm ("int $0x40"::"a"(68), "b"(23), "c"(name));
}

View File

@ -1,6 +1,18 @@
#define NULL ((void*)0)
#define SHM_OPEN 0
#define SHM_OPEN_ALWAYS 0x04
#define SHM_CREATE 0x08
#define SHM_READ 0x00
#define SHM_WRITE 0x01
#define E_NOTFOUND 5
#define E_ACCESS 10
#define E_NOMEM 30
#define E_PARAM 33
typedef struct
{
unsigned p00 __attribute__((packed));
@ -89,4 +101,6 @@ unsigned kol_sound_speaker(char data[]);
unsigned kol_process_info(unsigned slot, char buf1k[]);
int kol_process_kill_pid(unsigned process);
void kol_get_kernel_ver(char buff16b[]);
int kol_kill_process(unsigned process);
int kol_kill_process(unsigned process);
int kol_buffer_open(char name[], int mode, int size, char **buf);
void kol_buffer_close(char name[]);

View File

@ -122,3 +122,19 @@ char* strchr(const char* string, int c)
return (char*)0;
}
void _itoa(int i, char *s)
{
int a, b, c, d;
a = (i - i%1000)/1000;
b = (i - i%100)/100 - a*10;
c = (i - i%10)/10 - a*100 - b*10;
d = i%10;
s[0] = a + '0';
s[1] = b + '0';
s[2] = c + '0';
s[3] = d + '0';
s[4] = 0;
}

View File

@ -13,3 +13,4 @@ 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);
void _itoa(int i, char *s);

View File

@ -0,0 +1,109 @@
#include "system/kolibri.h"
#include "system/string.h"
#include "program_console.h"
char *buffer; // èñïîëüçóåòñÿ òîëüêî îäíà èìåíîâàííàÿ îáëàñòü, ïîýòîìó ìîæíî ñäåëàòü å¸ ãëîáàëüíîé ïåðåìåííîé
char name[32]; // èìÿ íóæíî êàê äëÿ ñîçäàíèÿ îáëàñòè, òàê è äëÿ óäàëåíèÿ, ïîýòîìó ìîæíî ñäåëàòü å¸ ãëîáàëüíîé ïåðåìåííîé
int sc_init() // èíèöèàëèçàöèÿ - ñîçäàíèå èìåíîâàííîé îáëàñòè
{
char *buf1k;
unsigned PID;
int result;
buf1k = malloc(1024);
if (NULL == buf1k)
return -1;
kol_process_info(-1, buf1k); // ïîëó÷àåì ÑÂÎÉ (-1) èäåíòèôèêàòîð ïðîöåññà
PID = *(buf1k+30);
free(buf1k);
_itoa(PID, name); // ôîðìèðóåì èç íîìåðà ïðîöåññà ñòðîêó ñ çàãëàâíûìè íóëÿìè 42 -> 0042 (ò.å. äî 9999)
strcat(name, "-SHELL");
*buffer = NULL;
result = kol_buffer_open(name, SHM_OPEN_ALWAYS | SHM_WRITE, 1024*16, &buffer); // ñîçäà¸ì îáëàñòü (16 êèë)
return result;
}
void sc_puts(char *str)
{
*buffer = SC_PUTS;
strcpy(buffer+1, str);
while (*buffer) kol_sleep(5);
}
void sc_exit()
{
*buffer = SC_EXIT;
while (*buffer) kol_sleep(5);
kol_buffer_close(name);
}
void sc_gets(char *str)
{
*buffer = SC_GETS;
while (*buffer) kol_sleep(5);
strcpy(str, buffer+1);
}
char sc_getc()
{
*buffer = SC_GETC;
while (*buffer) kol_sleep(5);
return *(buffer+1);
}
void sc_putc(char c)
{
*buffer = SC_PUTC;
*(buffer+1) = c;
while (*buffer) kol_sleep(5);
}
void sc_cls()
{
*buffer = SC_CLS;
while (*buffer) kol_sleep(5);
}
void kol_main()
{
char string[256];
sc_init();
sc_cls();
sc_puts("This is a test console application for Shell\n\r");
sc_puts("Type a string (255 symbols max): ");
sc_gets(string);
sc_puts("You typed:\n\r");
sc_puts(string);
sc_puts("Press any key: ");
string[0] = sc_getc();
sc_puts("\n\rYou pressed: ");
sc_putc(string[0]);
sc_exit();
}