forked from KolibriOS/kolibrios
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:
parent
abbaaa2ff2
commit
b76d44d868
@ -1,5 +1,5 @@
|
||||
|
||||
#define SHELL_VERSION "0.7.8"
|
||||
#define SHELL_VERSION "0.7.8a"
|
||||
|
||||
extern char PATH[256];
|
||||
extern char PARAM[256];
|
||||
|
@ -4,63 +4,68 @@
|
||||
int executable_run(char cmd[], char args[])
|
||||
{
|
||||
|
||||
char exec[FILENAME_MAX];
|
||||
int result;
|
||||
char exec[FILENAME_MAX];
|
||||
int result;
|
||||
|
||||
if ( '/' == cmd[0]) // ¥á«¨ ¯ãâì ¡á®«îâë©
|
||||
if ( '/' == cmd[0]) // if path is absolute
|
||||
{
|
||||
strcpy(exec, cmd);
|
||||
|
||||
if ( !file_check(exec) ) // ¯à®¢¥à塞 áãé¥á⢮¢ ¨¥ ä ©«
|
||||
strcpy(exec, cmd);
|
||||
if (!file_check(exec) ) // check file existense
|
||||
{
|
||||
file_not_found(cmd);
|
||||
return FALSE;
|
||||
file_not_found(cmd);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
else
|
||||
{
|
||||
strcpy(exec, cur_dir); // ¯à®¢¥à塞 ä ©« ¢ ⥪ã饬 ª â «®£¥
|
||||
if (exec[strlen(exec)-1] != '/')
|
||||
strcat(exec, "/"); // add slash
|
||||
strcat(exec, cmd);
|
||||
|
||||
if ( !file_check(exec) ) // ¯à®¢¥à塞 áãé¥á⢮¢ ¨¥ ä ©«
|
||||
{
|
||||
strcpy(exec, "/rd/1/"); // ¯à®¢¥à塞 ä ©« ¢¨àâ㠫쮬 ¤¨áª¥
|
||||
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) ) // ¯à®¢¥à塞 áãé¥á⢮¢ ¨¥ ä ©«
|
||||
{
|
||||
|
||||
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:
|
||||
|
||||
if ( script_check(exec) )
|
||||
return script_run(exec, args);
|
||||
|
||||
/* § ¯ã᪠¯à®£à ¬¬ë */
|
||||
result = program_run(exec, args);
|
||||
if (result > 0)
|
||||
// try to run as a program
|
||||
result = program_run(exec, args);
|
||||
if (result > 0)
|
||||
{
|
||||
|
||||
if ( !program_console(result) )
|
||||
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
|
||||
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;
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
file_not_found(cmd);
|
||||
return FALSE;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -2,17 +2,17 @@
|
||||
int program_run(char cmd[], char param[])
|
||||
{
|
||||
|
||||
kol_struct70 k70;
|
||||
kol_struct70 k70;
|
||||
|
||||
k70.p00 = 7;
|
||||
k70.p04 = 0;
|
||||
//k70.p08 = (unsigned) param;
|
||||
*((unsigned*)&k70 + 2) = (unsigned) param;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = cmd;
|
||||
k70.p00 = 7;
|
||||
k70.p04 = 0;
|
||||
//k70.p08 = (unsigned) param;
|
||||
*((unsigned*)&k70 + 2) = (unsigned) param;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = cmd;
|
||||
|
||||
return kol_file_70(&k70);
|
||||
return kol_file_70(&k70);
|
||||
}
|
||||
|
||||
|
@ -4,23 +4,23 @@
|
||||
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; // ÷èòàòü 4 áàéòà
|
||||
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) )
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
if ( !strcmp(buf, script_sign) ) // if we found the script signature
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
@ -28,78 +28,78 @@ else
|
||||
int script_run(char exec[], char args[])
|
||||
{
|
||||
|
||||
kol_struct70 k70;
|
||||
kol_struct_BDVK bdvk;
|
||||
unsigned result, i;
|
||||
unsigned long long filesize, pos;
|
||||
char *buf; //áóôåð, êóäà êîïèðóåòñÿ ñêðèïò
|
||||
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); // ïîëó÷àåì èíôîðìàöèþ î ôàéëå
|
||||
if ( 0 != result )
|
||||
return FALSE;
|
||||
result = kol_file_70(&k70); // get file info
|
||||
if ( 0 != result )
|
||||
return FALSE;
|
||||
|
||||
filesize = bdvk.p32; // ïîëó÷àåì ðàçìåð ôàéëà
|
||||
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); // ñ÷èòûâàåì ôàéë â áóôåð
|
||||
if ( 0 != result )
|
||||
{
|
||||
free(buf);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pos = 0;
|
||||
|
||||
for (;;) // îáðàáîòêà ñêðèïòà
|
||||
{
|
||||
|
||||
if (pos > filesize)
|
||||
break;
|
||||
|
||||
for (i=0;;i++) // ñ÷èòûâàíèå ñòðîêè
|
||||
result = kol_file_70(&k70); // read file to the buffer
|
||||
if ( 0 != result )
|
||||
{
|
||||
if ((0x0A == buf[pos])||(0x0D == buf[pos])||(0 == buf[pos]))
|
||||
{
|
||||
pos++;
|
||||
CMD[i] = '\0';
|
||||
break;
|
||||
}
|
||||
CMD[i] = buf[pos];
|
||||
pos++;
|
||||
free(buf);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( 0 == strlen(CMD) ) // ïóñòàÿ ñòðîêà
|
||||
continue;
|
||||
pos = 0;
|
||||
|
||||
if ('#' == CMD[0]) // êîììåíòàðèé
|
||||
continue;
|
||||
for (;;) // script processing
|
||||
{
|
||||
|
||||
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);
|
||||
return TRUE;
|
||||
if ( 0 == strlen(CMD) ) // empty string
|
||||
continue;
|
||||
|
||||
if ('#' == CMD[0]) // comment
|
||||
continue;
|
||||
|
||||
command_execute();
|
||||
|
||||
}
|
||||
|
||||
free(buf);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
Loading…
Reference in New Issue
Block a user