Now for incorrect scripts (which doesnt start with #SHS) shell says that they are incorrect, not "File not found". Also, translated comments from russian to english in two files.

git-svn-id: svn://kolibrios.org@7792 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Rustem Gimadutdinov (rgimad) 2020-04-14 22:21:16 +00:00
parent abbaaa2ff2
commit b76d44d868
4 changed files with 127 additions and 122 deletions

View File

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

View File

@ -4,63 +4,68 @@
int executable_run(char cmd[], char args[]) int executable_run(char cmd[], char args[])
{ {
char exec[FILENAME_MAX]; char exec[FILENAME_MAX];
int result; int result;
if ( '/' == cmd[0]) // ¥á«¨ ¯ãâì  ¡á®«îâ­ë© if ( '/' == cmd[0]) // if path is absolute
{ {
strcpy(exec, cmd); strcpy(exec, cmd);
if (!file_check(exec) ) // check file existense
if ( !file_check(exec) ) // ¯à®¢¥à塞 áãé¥á⢮¢ ­¨¥ ä ©« 
{ {
file_not_found(cmd); file_not_found(cmd);
return FALSE; return FALSE;
} }
} }
else
else
{ {
strcpy(exec, cur_dir); // ¯à®¢¥à塞 ä ©« ¢ ⥪ã饬 ª â «®£¥ strcpy(exec, cur_dir); // check file in current directory
if (exec[strlen(exec)-1] != '/') if (exec[strlen(exec)-1] != '/')
strcat(exec, "/"); // add slash strcat(exec, "/"); // add slash
strcat(exec, cmd);
if ( !file_check(exec) ) // ¯à®¢¥à塞 áãé¥á⢮¢ ­¨¥ ä ©« 
{
strcpy(exec, "/rd/1/"); // ¯à®¢¥à塞 ä ©« ­  ¢¨àâã «ì­®¬ ¤¨áª¥
strcat(exec, cmd); strcat(exec, cmd);
if ( !file_check(exec) ) // ¯à®¢¥à塞 áãé¥á⢮¢ ­¨¥ ä ©« 
{ 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); file_not_found(cmd);
return FALSE; return FALSE;
} }
} }
} }
// if file exists:
if ( script_check(exec) ) // try to run as a program
return script_run(exec, args); result = program_run(exec, args);
if (result > 0)
/* § ¯ã᪠¯à®£à ¬¬ë */
result = program_run(exec, args);
if (result > 0)
{ {
if ( !program_console(result) )
if ( !program_console(result) )
{ {
LAST_PID = result; LAST_PID = result;
#if LANG_ENG #if LANG_ENG
printf (" '%s' started. PID = %d\n\r", cmd, result); printf (" '%s' started. PID = %d\n\r", cmd, result);
#elif LANG_RUS #elif LANG_RUS
printf (" '%s' § ¯ã饭. PID = %d\n\r", cmd, result); printf (" '%s' § ¯ã饭. PID = %d\n\r", cmd, result);
#endif #endif
} }
return TRUE; return TRUE;
} }
else else
{ {
file_not_found(cmd); if ( script_check(exec) ) // if file is a valid script
return FALSE; {
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;
}
} }
} }

View File

@ -2,17 +2,17 @@
int program_run(char cmd[], char param[]) int program_run(char cmd[], char param[])
{ {
kol_struct70 k70; kol_struct70 k70;
k70.p00 = 7; k70.p00 = 7;
k70.p04 = 0; k70.p04 = 0;
//k70.p08 = (unsigned) param; //k70.p08 = (unsigned) param;
*((unsigned*)&k70 + 2) = (unsigned) param; *((unsigned*)&k70 + 2) = (unsigned) param;
k70.p12 = 0; k70.p12 = 0;
k70.p16 = 0; k70.p16 = 0;
k70.p20 = 0; k70.p20 = 0;
k70.p21 = cmd; k70.p21 = cmd;
return kol_file_70(&k70); return kol_file_70(&k70);
} }

View File

@ -4,23 +4,23 @@
int script_check(char file[]) int script_check(char file[])
{ {
kol_struct70 k70; kol_struct70 k70;
char buf[4]; char buf[4];
k70.p00 = 0; k70.p00 = 0;
k70.p04 = 0; k70.p04 = 0;
//k70.p08 = 0; //k70.p08 = 0;
k70.p12 = 4; // ÷èòàòü 4 áàéòà k70.p12 = 4; // read 4 bytes
k70.p16 = (unsigned) buf; k70.p16 = (unsigned) buf;
k70.p20 = 0; k70.p20 = 0;
k70.p21 = file; k70.p21 = file;
kol_file_70(&k70); kol_file_70(&k70);
if ( !strcmp(buf, script_sign) ) if ( !strcmp(buf, script_sign) ) // if we found the script signature
return TRUE; return TRUE;
else else
return FALSE; return FALSE;
} }
/// =========================================================== /// ===========================================================
@ -28,78 +28,78 @@ else
int script_run(char exec[], char args[]) int script_run(char exec[], char args[])
{ {
kol_struct70 k70; kol_struct70 k70;
kol_struct_BDVK bdvk; kol_struct_BDVK bdvk;
unsigned result, i; unsigned result, i;
unsigned long long filesize, pos; unsigned long long filesize, pos;
char *buf; //áóôåð, êóäà êîïèðóåòñÿ ñêðèïò char *buf; // buffer, where script is copied
k70.p00 = 5; k70.p00 = 5;
k70.p04 = k70.p12 = 0; k70.p04 = k70.p12 = 0;
//k70.p08 = 0; //k70.p08 = 0;
k70.p16 = (unsigned) &bdvk; k70.p16 = (unsigned) &bdvk;
k70.p20 = 0; k70.p20 = 0;
k70.p21 = exec; k70.p21 = exec;
result = kol_file_70(&k70); // ïîëó÷àåì èíôîðìàöèþ î ôàéëå result = kol_file_70(&k70); // get file info
if ( 0 != result ) if ( 0 != result )
return FALSE; return FALSE;
filesize = bdvk.p32; // ïîëó÷àåì ðàçìåð ôàéëà filesize = bdvk.p32; // get file size
buf = malloc(filesize+256); // may fail for over 4Gb file, but impossible case buf = malloc(filesize+256); // may fail for over 4Gb file, but impossible case
if (NULL == buf) if (NULL == buf)
return FALSE; return FALSE;
buf[filesize]=0; buf[filesize]=0;
k70.p00 = 0; k70.p00 = 0;
k70.p04 = 0; k70.p04 = 0;
//k70.p08 = 0; //k70.p08 = 0;
k70.p12 = filesize; k70.p12 = filesize;
k70.p16 = (unsigned) buf; k70.p16 = (unsigned) buf;
k70.p20 = 0; k70.p20 = 0;
k70.p21 = exec; k70.p21 = exec;
result = kol_file_70(&k70); // ñ÷èòûâàåì ôàéë â áóôåð result = kol_file_70(&k70); // read file to the buffer
if ( 0 != result ) 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])) free(buf);
{ return FALSE;
pos++;
CMD[i] = '\0';
break;
}
CMD[i] = buf[pos];
pos++;
} }
if ( 0 == strlen(CMD) ) // ïóñòàÿ ñòðîêà pos = 0;
continue;
if ('#' == CMD[0]) // êîììåíòàðèé for (;;) // script processing
continue; {
command_execute(); if (pos > filesize)
break;
} 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++;
}
free(buf); if ( 0 == strlen(CMD) ) // empty string
return TRUE; continue;
if ('#' == CMD[0]) // comment
continue;
command_execute();
}
free(buf);
return TRUE;
} }
/// =========================================================== /// ===========================================================