forked from KolibriOS/kolibrios
SHELL 0.8.2
- big refactoring, now uses libc.obj - added kfetch command git-svn-id: svn://kolibrios.org@8827 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
@@ -1,29 +1,25 @@
|
||||
|
||||
/// ===========================================================
|
||||
void command_history_add() {
|
||||
int i;
|
||||
|
||||
void command_history_add()
|
||||
{
|
||||
if ('\0' == CMD[0]) return;
|
||||
|
||||
int i;
|
||||
CMD_NUM = -1;
|
||||
|
||||
if ('\0' == CMD[0]) return;
|
||||
for (i = 0; i < CMD_HISTORY_NUM_REAL; i++)
|
||||
if ( 0 == strcmp( CMD_HISTORY[i], CMD ) )
|
||||
return;
|
||||
|
||||
CMD_NUM = -1;
|
||||
for (i = CMD_HISTORY_NUM_REAL; i > 0 ; i--)
|
||||
strcpy(CMD_HISTORY[i], CMD_HISTORY[i-1]);
|
||||
|
||||
for (i = 0; i < CMD_HISTORY_NUM_REAL; i++)
|
||||
if ( 0 == strcmp( CMD_HISTORY[i], CMD ) )
|
||||
return;
|
||||
strcpy(CMD_HISTORY[0], CMD);
|
||||
|
||||
for (i = CMD_HISTORY_NUM_REAL; i > 0 ; i--)
|
||||
strcpy(CMD_HISTORY[i], CMD_HISTORY[i-1]);
|
||||
|
||||
strcpy(CMD_HISTORY[0], CMD);
|
||||
|
||||
if (CMD_HISTORY_NUM_REAL < CMD_HISTORY_NUM-1)
|
||||
CMD_HISTORY_NUM_REAL++;
|
||||
if (CMD_HISTORY_NUM_REAL < CMD_HISTORY_NUM-1)
|
||||
CMD_HISTORY_NUM_REAL++;
|
||||
|
||||
}
|
||||
// ============================================================
|
||||
|
||||
|
||||
char * insert_string( char s1[], unsigned int pos, const char s2[] )
|
||||
{
|
||||
@@ -48,362 +44,346 @@ char * insert_string( char s1[], unsigned int pos, const char s2[] )
|
||||
return s1;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
|
||||
void command_get()
|
||||
{
|
||||
unsigned key;
|
||||
unsigned key;
|
||||
|
||||
unsigned i;
|
||||
unsigned cmdLen = 0;
|
||||
unsigned cmdPos = 0;
|
||||
CMD[0] = '\0';
|
||||
unsigned i;
|
||||
unsigned cmdLen = 0;
|
||||
unsigned cmdPos = 0;
|
||||
CMD[0] = '\0';
|
||||
|
||||
int clipNum; // number of clipboard slots
|
||||
char* clipBuf; // clipboard buffer
|
||||
char clipCopy[255+12];
|
||||
int clipNum; // number of clipboard slots
|
||||
char* clipBuf; // clipboard buffer
|
||||
char clipCopy[255+12];
|
||||
|
||||
for (;;)
|
||||
{
|
||||
key = getch();
|
||||
if ( 0 != (key & 0xff) )
|
||||
{
|
||||
key &= 0xff;
|
||||
switch (key)
|
||||
{
|
||||
case 27: // ESC
|
||||
for (i = cmdPos; i < cmdLen; i++)
|
||||
printf(" ");
|
||||
for (i = cmdLen; i > 0; i--)
|
||||
printf("%c %c", 8, 8);
|
||||
cmdLen = 0;
|
||||
cmdPos = 0;
|
||||
CMD[0] = '\0';
|
||||
break;
|
||||
for (;;) {
|
||||
key = getch();
|
||||
if ( 0 != (key & 0xff) ) {
|
||||
key &= 0xff;
|
||||
switch (key) {
|
||||
case 27: // ESC
|
||||
for (i = cmdPos; i < cmdLen; i++)
|
||||
printf(" ");
|
||||
for (i = cmdLen; i > 0; i--)
|
||||
printf("%c %c", 8, 8);
|
||||
cmdLen = 0;
|
||||
cmdPos = 0;
|
||||
CMD[0] = '\0';
|
||||
break;
|
||||
|
||||
case 13: // ENTER
|
||||
printf("\n\r");
|
||||
command_history_add();
|
||||
return;
|
||||
case 13: // ENTER
|
||||
printf("\n\r");
|
||||
command_history_add();
|
||||
return;
|
||||
|
||||
case 8: // BACKSPACE
|
||||
if (cmdPos > 0)
|
||||
{
|
||||
for (i = cmdPos-1; i < cmdLen; i++)
|
||||
CMD[i] = CMD[i+1];
|
||||
for (i = 0; i < cmdLen-cmdPos; i++)
|
||||
printf (" ");
|
||||
case 8: // BACKSPACE
|
||||
if (cmdPos > 0)
|
||||
{
|
||||
for (i = cmdPos-1; i < cmdLen; i++)
|
||||
CMD[i] = CMD[i+1];
|
||||
for (i = 0; i < cmdLen-cmdPos; i++)
|
||||
printf (" ");
|
||||
|
||||
for (i = 0; i < cmdLen; i++)
|
||||
printf ("%c %c", 8, 8);
|
||||
for (i = 0; i < cmdLen; i++)
|
||||
printf ("%c %c", 8, 8);
|
||||
|
||||
printf("%s", CMD);
|
||||
printf("%s", CMD);
|
||||
|
||||
for (i = 0; i < cmdLen-cmdPos; i++)
|
||||
printf("%c", 8);
|
||||
for (i = 0; i < cmdLen-cmdPos; i++)
|
||||
printf("%c", 8);
|
||||
|
||||
cmdPos--;
|
||||
cmdLen--;
|
||||
}
|
||||
break;
|
||||
cmdPos--;
|
||||
cmdLen--;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 9: // TAB
|
||||
break;
|
||||
|
||||
|
||||
case 22: // Ctrl+V
|
||||
clipNum = kol_clip_num();
|
||||
if (clipNum > 0)
|
||||
{
|
||||
clipBuf = kol_clip_get(clipNum-1);
|
||||
// printf("Length: %d, Type: %d, Encoding: %d\n", (int) *clipBuf, (int)*(clipBuf+4), (int)*(clipBuf+8));
|
||||
if ( (int) *clipBuf > 0 ) // is clipboard empty?
|
||||
{
|
||||
if ((int)*(clipBuf+4)==0) // text?
|
||||
{
|
||||
if ((int)*(clipBuf+8)==1) // 866 encoding?
|
||||
{
|
||||
// clear previous text
|
||||
for (i = cmdPos; i < cmdLen; i++)
|
||||
printf(" ");
|
||||
for (i = cmdLen; i > 0; i--)
|
||||
printf("%c %c", 8, 8);
|
||||
case 9: // TAB
|
||||
break;
|
||||
|
||||
|
||||
case 22: // Ctrl+V
|
||||
clipNum = _ksys_clip_num();
|
||||
if (clipNum > 0)
|
||||
{
|
||||
clipBuf = _ksys_clip_get(clipNum-1);
|
||||
// printf("Length: %d, Type: %d, Encoding: %d\n", (int) *clipBuf, (int)*(clipBuf+4), (int)*(clipBuf+8));
|
||||
if ( (int) *clipBuf > 0 ) // is clipboard empty?
|
||||
{
|
||||
if ((int)*(clipBuf+4)==0) // text?
|
||||
{
|
||||
if ((int)*(clipBuf+8)==1) // 866 encoding?
|
||||
{
|
||||
// clear previous text
|
||||
for (i = cmdPos; i < cmdLen; i++)
|
||||
printf(" ");
|
||||
for (i = cmdLen; i > 0; i--)
|
||||
printf("%c %c", 8, 8);
|
||||
|
||||
char *pasteText = clipBuf + 12;
|
||||
int pasteLen = strlen(pasteText);
|
||||
insert_string(CMD, cmdPos, pasteText);
|
||||
cmdLen = strlen(CMD);
|
||||
cmdPos += pasteLen;
|
||||
printf("%s", CMD);
|
||||
for (i = 0; i < cmdLen-cmdPos; i++) printf("%c", 8); // rewind the internal console cursor
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
char *pasteText = clipBuf + 12;
|
||||
int pasteLen = strlen(pasteText);
|
||||
insert_string(CMD, cmdPos, pasteText);
|
||||
cmdLen = strlen(CMD);
|
||||
cmdPos += pasteLen;
|
||||
printf("%s", CMD);
|
||||
for (i = 0; i < cmdLen-cmdPos; i++) printf("%c", 8); // rewind the internal console cursor
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 3: // Ctrl+C
|
||||
if ( cmdLen > 0 )
|
||||
{
|
||||
|
||||
*clipCopy = 12 + cmdLen;
|
||||
*(clipCopy+4)=0;
|
||||
*(clipCopy+8)=1;
|
||||
|
||||
for (i = 0; i <= cmdLen; i++)
|
||||
*(clipCopy+12+i) = CMD[i];
|
||||
|
||||
kol_clip_set(12+cmdLen, clipCopy);
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
if (cmdLen < 255)
|
||||
{
|
||||
if ( kol_key_control() & 0x40 ) // ¥á«¨ ¢ª«îçñ CapsLock
|
||||
if ( (kol_key_control() & 1) || (kol_key_control() & 2)) // ¥á«¨ ¦ âë è¨äâë
|
||||
key = tolower(key);
|
||||
else
|
||||
key = toupper(key);
|
||||
|
||||
case 3: // Ctrl+C
|
||||
if ( cmdLen > 0 )
|
||||
{
|
||||
|
||||
*clipCopy = 12 + cmdLen;
|
||||
*(clipCopy+4)=0;
|
||||
*(clipCopy+8)=1;
|
||||
|
||||
for (i = 0; i <= cmdLen; i++)
|
||||
*(clipCopy+12+i) = CMD[i];
|
||||
|
||||
_ksys_clip_set(12+cmdLen, clipCopy);
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
if (cmdLen < 255)
|
||||
{
|
||||
if ( kol_key_control() & 0x40 ) // � ������ CapsLock
|
||||
if ( (kol_key_control() & 1) || (kol_key_control() & 2)) // � ������ ����
|
||||
key = tolower(key);
|
||||
else
|
||||
key = toupper(key);
|
||||
|
||||
for (i = cmdLen+1; i > cmdPos; i--)
|
||||
CMD[i] = CMD[i-1];
|
||||
for (i = cmdLen+1; i > cmdPos; i--)
|
||||
CMD[i] = CMD[i-1];
|
||||
|
||||
CMD[cmdPos] = key;
|
||||
CMD[cmdPos] = key;
|
||||
|
||||
for (i = cmdPos; i > 0; i--)
|
||||
printf("%c %c", 8, 8);
|
||||
for (i = cmdPos; i > 0; i--)
|
||||
printf("%c %c", 8, 8);
|
||||
|
||||
printf("%s", CMD);
|
||||
printf("%s", CMD);
|
||||
|
||||
for (i = 0; i < cmdLen-cmdPos; i++)
|
||||
printf("%c", 8);
|
||||
for (i = 0; i < cmdLen-cmdPos; i++)
|
||||
printf("%c", 8);
|
||||
|
||||
cmdPos++;
|
||||
cmdLen++;
|
||||
}
|
||||
break;
|
||||
cmdPos++;
|
||||
cmdLen++;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
key = (key>>8)&0xff;
|
||||
switch (key)
|
||||
{
|
||||
case 83: // Del
|
||||
if (cmdPos < cmdLen)
|
||||
{
|
||||
for (i = cmdPos; i < cmdLen; i++)
|
||||
CMD[i] = CMD[i+1];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
key = (key>>8)&0xff;
|
||||
switch (key)
|
||||
{
|
||||
case 83: // Del
|
||||
if (cmdPos < cmdLen)
|
||||
{
|
||||
for (i = cmdPos; i < cmdLen; i++)
|
||||
CMD[i] = CMD[i+1];
|
||||
|
||||
for (i = 0; i < cmdLen-cmdPos; i++)
|
||||
printf(" ");
|
||||
for (i = 0; i < cmdLen-cmdPos; i++)
|
||||
printf(" ");
|
||||
|
||||
for (i = 0; i < cmdLen-cmdPos; i++)
|
||||
printf("%c", 8);
|
||||
for (i = 0; i < cmdLen-cmdPos; i++)
|
||||
printf("%c", 8);
|
||||
|
||||
for (i = cmdPos; i < cmdLen; i++)
|
||||
printf("%c", CMD[i]);
|
||||
for (i = cmdPos; i < cmdLen; i++)
|
||||
printf("%c", CMD[i]);
|
||||
|
||||
for (i = 0; i < cmdLen-cmdPos; i++)
|
||||
printf("%c", 8);
|
||||
for (i = 0; i < cmdLen-cmdPos; i++)
|
||||
printf("%c", 8);
|
||||
|
||||
cmdLen--;
|
||||
}
|
||||
break;
|
||||
cmdLen--;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 0x47: // Home
|
||||
// move internal cursor and cmdPos to the beginning of the line
|
||||
for (;cmdPos > 0; cmdPos--) {printf("%c", 8);}
|
||||
break;
|
||||
case 0x47: // Home
|
||||
// move internal cursor and cmdPos to the beginning of the line
|
||||
for (;cmdPos > 0; cmdPos--) {printf("%c", 8);}
|
||||
break;
|
||||
|
||||
case 0x4F: // End
|
||||
// move internal cursor and cmdPos to the end of the line
|
||||
for (;cmdPos < cmdLen; cmdPos++) {printf("%c", CMD[cmdPos]);}
|
||||
break;
|
||||
case 0x4F: // End
|
||||
// move internal cursor and cmdPos to the end of the line
|
||||
for (;cmdPos < cmdLen; cmdPos++) {printf("%c", CMD[cmdPos]);}
|
||||
break;
|
||||
|
||||
case 75: // Left
|
||||
if (cmdPos > 0)
|
||||
{
|
||||
printf("%c", 8);
|
||||
cmdPos--;
|
||||
}
|
||||
break;
|
||||
case 75: // Left
|
||||
if (cmdPos > 0)
|
||||
{
|
||||
printf("%c", 8);
|
||||
cmdPos--;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 77: // Right
|
||||
if (cmdPos < cmdLen)
|
||||
{
|
||||
printf("%c", CMD[cmdPos]);
|
||||
cmdPos++;
|
||||
}
|
||||
break;
|
||||
case 77: // Right
|
||||
if (cmdPos < cmdLen)
|
||||
{
|
||||
printf("%c", CMD[cmdPos]);
|
||||
cmdPos++;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 72: // Up
|
||||
if (CMD_HISTORY_NUM_REAL > 0 && CMD_NUM >= -1)
|
||||
{
|
||||
case 72: // Up
|
||||
if (CMD_HISTORY_NUM_REAL > 0 && CMD_NUM >= -1)
|
||||
{
|
||||
|
||||
for (i = cmdPos; i < cmdLen; i++)
|
||||
printf(" ");
|
||||
for (i = cmdPos; i < cmdLen; i++)
|
||||
printf(" ");
|
||||
|
||||
for (i = cmdLen; i > 0; i--)
|
||||
printf("%c %c", 8, 8);
|
||||
for (i = cmdLen; i > 0; i--)
|
||||
printf("%c %c", 8, 8);
|
||||
|
||||
if (CMD_NUM < CMD_HISTORY_NUM_REAL-1)
|
||||
CMD_NUM++;
|
||||
/* else
|
||||
CMD_NUM = 0;
|
||||
*/
|
||||
printf("%s", CMD_HISTORY[CMD_NUM]);
|
||||
strcpy(CMD, CMD_HISTORY[CMD_NUM]);
|
||||
cmdLen = strlen(CMD);
|
||||
cmdPos = strlen(CMD);
|
||||
if (CMD_NUM < CMD_HISTORY_NUM_REAL-1)
|
||||
CMD_NUM++;
|
||||
/* else
|
||||
CMD_NUM = 0;
|
||||
*/
|
||||
printf("%s", CMD_HISTORY[CMD_NUM]);
|
||||
strcpy(CMD, CMD_HISTORY[CMD_NUM]);
|
||||
cmdLen = strlen(CMD);
|
||||
cmdPos = strlen(CMD);
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
||||
case 80: // Down
|
||||
if (CMD_HISTORY_NUM_REAL > 0 && CMD_NUM >= 0)
|
||||
{
|
||||
case 80: // Down
|
||||
if (CMD_HISTORY_NUM_REAL > 0 && CMD_NUM >= 0)
|
||||
{
|
||||
|
||||
for (i = cmdPos; i < cmdLen; i++)
|
||||
printf(" ");
|
||||
for (i = cmdPos; i < cmdLen; i++)
|
||||
printf(" ");
|
||||
|
||||
for (i = cmdLen; i > 0; i--)
|
||||
printf("%c %c", 8, 8);
|
||||
for (i = cmdLen; i > 0; i--)
|
||||
printf("%c %c", 8, 8);
|
||||
|
||||
if (CMD_NUM > 0)
|
||||
CMD_NUM--;
|
||||
/* else
|
||||
CMD_NUM = CMD_HISTORY_NUM_REAL-1;
|
||||
*/
|
||||
printf("%s", CMD_HISTORY[CMD_NUM]);
|
||||
strcpy(CMD, CMD_HISTORY[CMD_NUM]);
|
||||
cmdLen = strlen(CMD);
|
||||
cmdPos = strlen(CMD);
|
||||
if (CMD_NUM > 0)
|
||||
CMD_NUM--;
|
||||
/* else
|
||||
CMD_NUM = CMD_HISTORY_NUM_REAL-1;
|
||||
*/
|
||||
printf("%s", CMD_HISTORY[CMD_NUM]);
|
||||
strcpy(CMD, CMD_HISTORY[CMD_NUM]);
|
||||
cmdLen = strlen(CMD);
|
||||
cmdPos = strlen(CMD);
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 0: // console window closed
|
||||
cmd_exit(NULL);
|
||||
case 0: // console window closed
|
||||
cmd_exit(NULL);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
} // switch end
|
||||
} // if end
|
||||
} // for end
|
||||
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
|
||||
int command_get_cmd(char cmd[])
|
||||
{
|
||||
unsigned i, len;
|
||||
int quote = 0;
|
||||
unsigned i, len;
|
||||
int quote = 0;
|
||||
|
||||
if (CMD[0]=='"')
|
||||
quote = 1;
|
||||
if (CMD[0]=='"')
|
||||
quote = 1;
|
||||
|
||||
if (quote == 0)
|
||||
{
|
||||
for (i=0;;i++)
|
||||
{
|
||||
cmd[i] = CMD[i];
|
||||
if (0 == cmd[i])
|
||||
return i;
|
||||
if ( iswhite(cmd[i]) )
|
||||
{
|
||||
cmd[i] = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
return i+1;
|
||||
}
|
||||
else
|
||||
{
|
||||
len = 0;
|
||||
for (i=1;;i++)
|
||||
{
|
||||
cmd[len] = CMD[i];
|
||||
if (0 == cmd[len])
|
||||
{
|
||||
i--;
|
||||
break;
|
||||
}
|
||||
if ( cmd[len] == '"' )
|
||||
{
|
||||
cmd[len] = '\0';
|
||||
break;
|
||||
}
|
||||
len++;
|
||||
}
|
||||
trim(cmd);
|
||||
return i+1;
|
||||
}
|
||||
if (quote == 0)
|
||||
{
|
||||
for (i=0;;i++)
|
||||
{
|
||||
cmd[i] = CMD[i];
|
||||
if (0 == cmd[i])
|
||||
return i;
|
||||
if ( iswhite(cmd[i]) )
|
||||
{
|
||||
cmd[i] = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
return i+1;
|
||||
}
|
||||
else
|
||||
{
|
||||
len = 0;
|
||||
for (i=1;;i++)
|
||||
{
|
||||
cmd[len] = CMD[i];
|
||||
if (0 == cmd[len])
|
||||
{
|
||||
i--;
|
||||
break;
|
||||
}
|
||||
if ( cmd[len] == '"' )
|
||||
{
|
||||
cmd[len] = '\0';
|
||||
break;
|
||||
}
|
||||
len++;
|
||||
}
|
||||
trim(cmd);
|
||||
return i+1;
|
||||
}
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
|
||||
typedef int (*handler1_t)(char* arg);
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
|
||||
void command_execute()
|
||||
{
|
||||
char cmd[256];
|
||||
char args[256];
|
||||
unsigned arg;
|
||||
int i;
|
||||
int result;
|
||||
char cmd[256];
|
||||
char args[256];
|
||||
unsigned arg;
|
||||
int i;
|
||||
int result;
|
||||
|
||||
trim(CMD);
|
||||
arg = command_get_cmd(cmd);
|
||||
trim(CMD);
|
||||
arg = command_get_cmd(cmd);
|
||||
|
||||
if ( !strlen(cmd) )
|
||||
return;
|
||||
if ( !strlen(cmd) )
|
||||
return;
|
||||
|
||||
strcpy(args, CMD+arg);
|
||||
trim(args);
|
||||
strcpy(args, CMD+arg);
|
||||
trim(args);
|
||||
|
||||
for (i = 0; i < NUM_OF_CMD; i++)
|
||||
{
|
||||
if (!strcmp(cmd, COMMANDS[i].name))
|
||||
{
|
||||
result = ((handler1_t)COMMANDS[i].handler)(args);
|
||||
if (result == FALSE)
|
||||
{
|
||||
#if LANG_ENG
|
||||
printf(" Error!\n\r");
|
||||
#elif LANG_RUS
|
||||
printf(" Žè¨¡ª !\n\r");
|
||||
#endif
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < NUM_OF_CMD; i++) {
|
||||
if (!strcmp(cmd, COMMANDS[i].name)) {
|
||||
result = ((handler1_t)COMMANDS[i].handler)(args);
|
||||
if (result == FALSE) {
|
||||
printf(UNKNOWN_CMD_ERROR);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ( -1 != alias_search(CMD) ) {
|
||||
strcpy(CMD, ALIASES+64*1024+256*alias_search(CMD));
|
||||
command_execute();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( -1 != alias_search(CMD) )
|
||||
{
|
||||
strcpy(CMD, ALIASES+64*1024+256*alias_search(CMD));
|
||||
command_execute();
|
||||
return;
|
||||
}
|
||||
|
||||
executable_run(cmd, args);
|
||||
executable_run(cmd, args);
|
||||
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
|
||||
@@ -1,74 +1,54 @@
|
||||
|
||||
/// ===========================================================
|
||||
int executable_run(char cmd[], char args[]) {
|
||||
char exec[FILENAME_MAX];
|
||||
int result;
|
||||
|
||||
int executable_run(char cmd[], char args[])
|
||||
{
|
||||
if ( '/' == cmd[0]) // if path is absolute
|
||||
{
|
||||
strcpy(exec, cmd);
|
||||
if (!file_check(exec) ) // check file existense
|
||||
{
|
||||
file_not_found(cmd);
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
strcpy(exec, cur_dir); // check file in current directory
|
||||
if (exec[strlen(exec)-1] != '/')
|
||||
strcat(exec, "/"); // add slash
|
||||
strcat(exec, cmd);
|
||||
|
||||
if ( !file_check(exec) ) // check file existense
|
||||
{
|
||||
strcpy(exec, "/rd/1/"); // check file on virtual disk
|
||||
strcat(exec, cmd);
|
||||
if ( !file_check(exec) ) // check file existense
|
||||
{
|
||||
file_not_found(cmd);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
char exec[FILENAME_MAX];
|
||||
int result;
|
||||
// if file exists:
|
||||
|
||||
if ( '/' == cmd[0]) // if path is absolute
|
||||
{
|
||||
strcpy(exec, cmd);
|
||||
if (!file_check(exec) ) // check file existense
|
||||
{
|
||||
file_not_found(cmd);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(exec, cur_dir); // check file in current directory
|
||||
if (exec[strlen(exec)-1] != '/')
|
||||
strcat(exec, "/"); // add slash
|
||||
strcat(exec, cmd);
|
||||
|
||||
if ( !file_check(exec) ) // check file existense
|
||||
{
|
||||
strcpy(exec, "/rd/1/"); // check file on virtual disk
|
||||
strcat(exec, cmd);
|
||||
if ( !file_check(exec) ) // check file existense
|
||||
{
|
||||
file_not_found(cmd);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if file exists:
|
||||
|
||||
// try to run as a program
|
||||
result = program_run(exec, args);
|
||||
if (result > 0)
|
||||
{
|
||||
if ( !program_console(result) )
|
||||
{
|
||||
LAST_PID = 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
|
||||
{
|
||||
if ( script_check(exec) ) // if file is a valid script
|
||||
{
|
||||
return script_run(exec, args);
|
||||
} else
|
||||
{
|
||||
#if LANG_ENG
|
||||
printf ("Error in '%s' : script must start with #SHS line\n\r", cmd);
|
||||
#elif LANG_RUS
|
||||
printf ("Žè¨¡ª ¢ '%s' : áªà¨¯â ¤®«¦¥ ç¨ âìáï á® áâà®çª¨ #SHS\n\r", cmd);
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
// try to run as a program
|
||||
result = program_run(exec, args);
|
||||
if (result > 0) {
|
||||
if ( !program_console(result) ) {
|
||||
LAST_PID = result;
|
||||
printf (EXEC_STARTED_FMT, cmd, result);
|
||||
}
|
||||
return TRUE;
|
||||
} else {
|
||||
if ( script_check(exec) ) // if file is a valid script
|
||||
{
|
||||
return script_run(exec, args);
|
||||
} else
|
||||
{
|
||||
printf (EXEC_SCRIPT_ERROR_FMT, cmd);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
|
||||
@@ -1,63 +1,53 @@
|
||||
|
||||
/// ===========================================================
|
||||
int parameters_prepare(char *param, char* argv[]) {
|
||||
int i, param_len;
|
||||
int argc = 1;
|
||||
int quote = 0;
|
||||
int argv_len;
|
||||
|
||||
int parameters_prepare(char *param, char* argv[])
|
||||
{
|
||||
param_len = strlen(param);
|
||||
if ( param_len == 0 )
|
||||
return 0;
|
||||
|
||||
int i, param_len;
|
||||
int argc = 1;
|
||||
int quote = 0;
|
||||
int argv_len;
|
||||
argv[0] = (char*) malloc(4096);
|
||||
|
||||
param_len = strlen(param);
|
||||
if ( param_len == 0 )
|
||||
return 0;
|
||||
argv_len = 0;
|
||||
for (i = 0; i < param_len; i++) {
|
||||
switch (param[i]) {
|
||||
case '\\':
|
||||
if (param[i+1]!='\0') {
|
||||
switch(param[i+1]) {
|
||||
|
||||
argv[0] = (char*) malloc(4096);
|
||||
case 'n':
|
||||
argv[argc-1][argv_len] = '\n';
|
||||
argv_len++;
|
||||
i++;
|
||||
break;
|
||||
|
||||
argv_len = 0;
|
||||
for (i = 0; i < param_len; i++)
|
||||
{
|
||||
switch (param[i])
|
||||
{
|
||||
case 't':
|
||||
argv[argc-1][argv_len] = '\t';
|
||||
argv_len++;
|
||||
i++;
|
||||
|
||||
case '\\':
|
||||
if (param[i+1]!='\0')
|
||||
{
|
||||
switch(param[i+1])
|
||||
{
|
||||
case '\\':
|
||||
case '\'':
|
||||
case '"':
|
||||
case '?':
|
||||
argv[argc-1][argv_len] = param[i+1];
|
||||
argv_len++;
|
||||
i++;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
argv[argc-1][argv_len] = '\n';
|
||||
argv_len++;
|
||||
i++;
|
||||
break;
|
||||
default:
|
||||
i++;
|
||||
};
|
||||
}
|
||||
break;
|
||||
|
||||
case 't':
|
||||
argv[argc-1][argv_len] = '\t';
|
||||
argv_len++;
|
||||
i++;
|
||||
|
||||
case '\\':
|
||||
case '\'':
|
||||
case '"':
|
||||
case '?':
|
||||
argv[argc-1][argv_len] = param[i+1];
|
||||
argv_len++;
|
||||
i++;
|
||||
break;
|
||||
|
||||
default:
|
||||
i++;
|
||||
};
|
||||
}
|
||||
break;
|
||||
|
||||
case '"':
|
||||
if (quote == 0)
|
||||
case '"':
|
||||
if (quote == 0)
|
||||
quote = 1;
|
||||
else
|
||||
{
|
||||
else {
|
||||
quote = 0;
|
||||
argv[argc-1][argv_len] = '\0';
|
||||
argc++;
|
||||
@@ -65,62 +55,46 @@ for (i = 0; i < param_len; i++)
|
||||
argv[argc-1][argv_len] = '\0';
|
||||
argv_len = 0;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
case 32:
|
||||
if (quote == 0)
|
||||
{
|
||||
if ( ( param[i+1] != 32) || ( param[i+1] != 9) )
|
||||
{
|
||||
if (argv_len != 0)
|
||||
{
|
||||
argv[argc-1][argv_len] = '\0';
|
||||
argc++;
|
||||
argv[argc-1] = (char*) malloc(4096);
|
||||
argv[argc-1][argv_len] = '\0';
|
||||
argv_len = 0;
|
||||
case 9:
|
||||
case 32:
|
||||
if (quote == 0) {
|
||||
if ( ( param[i+1] != 32) || ( param[i+1] != 9) ) {
|
||||
if (argv_len != 0) {
|
||||
argv[argc-1][argv_len] = '\0';
|
||||
argc++;
|
||||
argv[argc-1] = (char*) malloc(4096);
|
||||
argv[argc-1][argv_len] = '\0';
|
||||
argv_len = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
} else {
|
||||
argv[argc-1][argv_len] = param[i];
|
||||
argv_len++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
argv[argc-1][argv_len] = param[i];
|
||||
argv_len++;
|
||||
break;
|
||||
|
||||
break;
|
||||
}; // switch end
|
||||
} // for end
|
||||
|
||||
default:
|
||||
argv[argc-1][argv_len] = param[i];
|
||||
argv_len++;
|
||||
break;
|
||||
argv[argc-1][argv_len] = '\0';
|
||||
|
||||
};
|
||||
}
|
||||
if ( strlen(argv[argc-1]) == 0 ) {
|
||||
free(argv[argc-1]);
|
||||
argc--;
|
||||
}
|
||||
|
||||
argv[argc-1][argv_len] = '\0';
|
||||
|
||||
if ( strlen(argv[argc-1]) == 0 )
|
||||
{
|
||||
free(argv[argc-1]);
|
||||
argc--;
|
||||
}
|
||||
|
||||
return argc;
|
||||
return argc;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
void parameters_free(int argc, char* argv[])
|
||||
{
|
||||
|
||||
int i;
|
||||
|
||||
for (i = 0; i < argc; i++)
|
||||
free(argv[i]);
|
||||
|
||||
void parameters_free(int argc, char* argv[]) {
|
||||
int i;
|
||||
for (i = 0; i < argc; i++) free(argv[i]);
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
|
||||
@@ -2,107 +2,95 @@
|
||||
#include "../program_console.h"
|
||||
|
||||
|
||||
int program_console(int pid)
|
||||
{
|
||||
int program_console(int pid) {
|
||||
char name[32];
|
||||
char *buffer;
|
||||
char *buf1k;
|
||||
int result;
|
||||
int i;
|
||||
char command;
|
||||
int size;
|
||||
int is_end;
|
||||
|
||||
char name[32];
|
||||
char *buffer;
|
||||
char *buf1k;
|
||||
int result;
|
||||
int i;
|
||||
char command;
|
||||
int size;
|
||||
int is_end;
|
||||
itoa(pid, name);
|
||||
strcat(name, "-SHELL");
|
||||
|
||||
itoa(pid, name);
|
||||
strcat(name, "-SHELL");
|
||||
buffer = NULL;
|
||||
buf1k = NULL;
|
||||
|
||||
buffer = NULL;
|
||||
buf1k = NULL;
|
||||
for (i = 0; i < 30; i++) {
|
||||
result = kol_buffer_open(name, SHM_OPEN | SHM_WRITE, 0, &buffer);
|
||||
if (buffer != NULL)
|
||||
break;
|
||||
|
||||
for (i = 0; i < 30; i++)
|
||||
{
|
||||
result = kol_buffer_open(name, SHM_OPEN | SHM_WRITE, 0, &buffer);
|
||||
if (buffer != NULL)
|
||||
break;
|
||||
kol_sleep(2);
|
||||
}
|
||||
|
||||
kol_sleep(2);
|
||||
}
|
||||
if (buffer == NULL)
|
||||
return 0;
|
||||
else
|
||||
size = result;
|
||||
|
||||
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;
|
||||
|
||||
is_end = 0;
|
||||
for (;;)
|
||||
{
|
||||
case SC_CLS:
|
||||
con_cls();
|
||||
*buffer = SC_OK;
|
||||
break;
|
||||
|
||||
case SC_PUTC:
|
||||
printf("%c", *(buffer+1));
|
||||
*buffer = SC_OK;
|
||||
break;
|
||||
|
||||
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_PUTS:
|
||||
printf("%s", buffer+1 );
|
||||
*buffer = SC_OK;
|
||||
break;
|
||||
|
||||
case SC_GETC:
|
||||
*(buffer+1) = (char) getch() ;
|
||||
*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;
|
||||
case SC_GETS:
|
||||
gets(buffer+1, size-2);
|
||||
*buffer = SC_OK;
|
||||
break;
|
||||
|
||||
case SC_PID:
|
||||
buf1k=malloc(1024);
|
||||
kol_process_info(-1, buf1k);
|
||||
memcpy(buffer+1, buf1k+30, sizeof(unsigned));
|
||||
*buffer = SC_OK;
|
||||
free(buf1k);
|
||||
break;
|
||||
case SC_PID:
|
||||
buf1k=malloc(1024);
|
||||
kol_process_info(-1, buf1k);
|
||||
memcpy(buffer+1, buf1k+30, sizeof(unsigned));
|
||||
*buffer = SC_OK;
|
||||
free(buf1k);
|
||||
break;
|
||||
|
||||
case SC_PING:
|
||||
*buffer = SC_OK;
|
||||
break;
|
||||
case SC_PING:
|
||||
*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;
|
||||
default:
|
||||
printf (CON_APP_ERROR);
|
||||
return 0;
|
||||
};
|
||||
if (is_end) {
|
||||
printf("\n\r");
|
||||
return 1;
|
||||
}
|
||||
} // for end
|
||||
return 9;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,106 +1,96 @@
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int script_check(char file[])
|
||||
{
|
||||
int script_check(char file[]) {
|
||||
kol_struct70 k70;
|
||||
char buf[4];
|
||||
|
||||
kol_struct70 k70;
|
||||
char buf[4];
|
||||
k70.p00 = 0;
|
||||
k70.p04 = 0;
|
||||
//k70.p08 = 0;
|
||||
k70.p12 = 4; // read 4 bytes
|
||||
k70.p16 = (unsigned) buf;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = file;
|
||||
|
||||
k70.p00 = 0;
|
||||
k70.p04 = 0;
|
||||
//k70.p08 = 0;
|
||||
k70.p12 = 4; // read 4 bytes
|
||||
k70.p16 = (unsigned) buf;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = file;
|
||||
kol_file_70(&k70);
|
||||
|
||||
kol_file_70(&k70);
|
||||
|
||||
if ( !strcmp(buf, script_sign) ) // if we found the script signature
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
if ( !strcmp(buf, script_sign) ) // if we found the script signature
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int script_run(char exec[], char args[])
|
||||
{
|
||||
int script_run(char exec[], char args[]) {
|
||||
kol_struct70 k70;
|
||||
kol_struct_BDVK bdvk;
|
||||
unsigned result, i;
|
||||
unsigned long long filesize, pos;
|
||||
char *buf; // buffer, where script is copied
|
||||
|
||||
kol_struct70 k70;
|
||||
kol_struct_BDVK bdvk;
|
||||
unsigned result, i;
|
||||
unsigned long long filesize, pos;
|
||||
char *buf; // buffer, where script is copied
|
||||
k70.p00 = 5;
|
||||
k70.p04 = k70.p12 = 0;
|
||||
//k70.p08 = 0;
|
||||
k70.p16 = (unsigned) &bdvk;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = exec;
|
||||
|
||||
k70.p00 = 5;
|
||||
k70.p04 = k70.p12 = 0;
|
||||
//k70.p08 = 0;
|
||||
k70.p16 = (unsigned) &bdvk;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = exec;
|
||||
result = kol_file_70(&k70); // get file info
|
||||
if ( 0 != result )
|
||||
return FALSE;
|
||||
|
||||
result = kol_file_70(&k70); // get file info
|
||||
if ( 0 != result )
|
||||
return FALSE;
|
||||
filesize = bdvk.p32; // get file size
|
||||
|
||||
filesize = bdvk.p32; // get file size
|
||||
buf = malloc(filesize+256); // may fail for over 4Gb file, but impossible case
|
||||
if (NULL == buf)
|
||||
return FALSE;
|
||||
|
||||
buf = malloc(filesize+256); // may fail for over 4Gb file, but impossible case
|
||||
if (NULL == buf)
|
||||
return FALSE;
|
||||
buf[filesize]=0;
|
||||
|
||||
buf[filesize]=0;
|
||||
k70.p00 = 0;
|
||||
k70.p04 = 0;
|
||||
//k70.p08 = 0;
|
||||
k70.p12 = filesize;
|
||||
k70.p16 = (unsigned) buf;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = exec;
|
||||
|
||||
k70.p00 = 0;
|
||||
k70.p04 = 0;
|
||||
//k70.p08 = 0;
|
||||
k70.p12 = filesize;
|
||||
k70.p16 = (unsigned) buf;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = exec;
|
||||
result = kol_file_70(&k70); // read file to the buffer
|
||||
if ( 0 != result )
|
||||
{
|
||||
free(buf);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
result = kol_file_70(&k70); // read file to the buffer
|
||||
if ( 0 != result )
|
||||
{
|
||||
free(buf);
|
||||
return FALSE;
|
||||
}
|
||||
pos = 0;
|
||||
|
||||
pos = 0;
|
||||
for (;;) // script processing
|
||||
{
|
||||
if (pos > filesize)
|
||||
break;
|
||||
|
||||
for (;;) // script processing
|
||||
{
|
||||
for (i=0;;i++) // reading a string
|
||||
{
|
||||
if ((0x0A == buf[pos])||(0x0D == buf[pos])||(0 == buf[pos]))
|
||||
{
|
||||
pos++;
|
||||
CMD[i] = '\0';
|
||||
break;
|
||||
}
|
||||
CMD[i] = buf[pos];
|
||||
pos++;
|
||||
}
|
||||
|
||||
if (pos > filesize)
|
||||
break;
|
||||
if ( 0 == strlen(CMD) ) // empty string
|
||||
continue;
|
||||
|
||||
for (i=0;;i++) // reading a string
|
||||
{
|
||||
if ((0x0A == buf[pos])||(0x0D == buf[pos])||(0 == buf[pos]))
|
||||
{
|
||||
pos++;
|
||||
CMD[i] = '\0';
|
||||
break;
|
||||
}
|
||||
CMD[i] = buf[pos];
|
||||
pos++;
|
||||
}
|
||||
if ('#' == CMD[0]) // comment
|
||||
continue;
|
||||
|
||||
if ( 0 == strlen(CMD) ) // empty string
|
||||
continue;
|
||||
command_execute();
|
||||
|
||||
if ('#' == CMD[0]) // comment
|
||||
continue;
|
||||
}
|
||||
|
||||
command_execute();
|
||||
|
||||
}
|
||||
|
||||
free(buf);
|
||||
return TRUE;
|
||||
free(buf);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
|
||||
Reference in New Issue
Block a user