SHELL 0.8 changelog

- added mv command
- added ren command
- now ls works also with relative pathes
- fixed bug in strrchr

git-svn-id: svn://kolibrios.org@7802 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Rustem Gimadutdinov (rgimad) 2020-04-16 21:50:49 +00:00
parent d802f7476f
commit b8b18f32a0
10 changed files with 388 additions and 122 deletions

View File

@ -15,6 +15,9 @@
#include "globals.h" #include "globals.h"
#include "prototypes.h" #include "prototypes.h"
// from main file (shell.c). TODO - in future move to library
void get_file_dir_loc(char *filepath, char *dir_path);
#include "system/console.c" #include "system/console.c"
#include "cmd/cmd_about.c" #include "cmd/cmd_about.c"
@ -42,6 +45,8 @@
#include "cmd/cmd_uptime.c" #include "cmd/cmd_uptime.c"
#include "cmd/cmd_history.c" #include "cmd/cmd_history.c"
#include "cmd/cmd_cp.c" #include "cmd/cmd_cp.c"
#include "cmd/cmd_mv.c"
#include "cmd/cmd_ren.c"
#include "cmd/cmd_waitfor.c" #include "cmd/cmd_waitfor.c"
#include "modules/module_command.c" #include "modules/module_command.c"
@ -52,4 +57,6 @@
#include "modules/module_alias.c" #include "modules/module_alias.c"
#include "modules/module_parameters.c" #include "modules/module_parameters.c"
typedef unsigned int size_t;
/// =========================================================== /// ===========================================================

View File

@ -1,144 +1,152 @@
int cmd_cp(char param[]) int cmd_cp(char param[])
{ {
char* argv[100];
int argc;
char *filename_in = NULL;
char *filename_out = NULL;
char *buffer = NULL;
char* argv[100]; kol_struct70 k70_in;
int argc; kol_struct70 k70_out;
char *filename_in = NULL;
char *filename_out = NULL;
char *buffer = NULL;
kol_struct70 k70_in; kol_struct_BDVK bdvk;
kol_struct70 k70_out;
kol_struct_BDVK bdvk; unsigned long long filesize;
unsigned result, buf_size;
unsigned long long filesize; argc = parameters_prepare(param, argv);
unsigned result, buf_size;
argc = parameters_prepare(param, argv); if (argc != 2)
if (argc != 2)
{ {
#if LANG_ENG #if LANG_ENG
printf(" cp <file_in> <file_out>\n\r"); printf(" cp <file_in> <file_out>\n\r");
#elif LANG_RUS #elif LANG_RUS
printf(" cp <¨áâ®ç­¨ª> <१ã«ìâ â>\n\r"); printf(" cp <¨áâ®ç­¨ª> <१ã«ìâ â>\n\r");
#endif #endif
parameters_free(argc, argv); parameters_free(argc, argv);
return TRUE; return TRUE;
} }
filename_in = (char*) malloc(FILENAME_MAX); filename_in = (char*) malloc(FILENAME_MAX);
filename_out = (char*) malloc(FILENAME_MAX); filename_out = (char*) malloc(FILENAME_MAX);
if (argv[0][0] != '/') if (argv[0][0] != '/')
{ {
strcpy(filename_in, cur_dir); strcpy(filename_in, cur_dir);
if (filename_in[strlen(filename_in)-1] != '/') if (filename_in[strlen(filename_in)-1] != '/')
{
strcat(filename_in, "/"); // add slash strcat(filename_in, "/"); // add slash
strcat(filename_in, argv[0]);
} }
else strcat(filename_in, argv[0]);
} else
{ {
strcpy(filename_in, argv[0]); strcpy(filename_in, argv[0]);
} }
// -----
if (argv[1][0] != '/') if (argv[1][0] != '/')
{ {
strcpy(filename_out, cur_dir); strcpy(filename_out, cur_dir);
if (filename_out[strlen(filename_out)-1] != '/') if (filename_out[strlen(filename_out)-1] != '/')
{
strcat(filename_out, "/"); // add slash strcat(filename_out, "/"); // add slash
strcat(filename_out, argv[1]);
} }
else strcat(filename_out, argv[1]);
} else
{ {
strcpy(filename_out, argv[1]); strcpy(filename_out, argv[1]);
} }
// add ability to use directory as destination // add ability to use directory as destination
if ( dir_check(filename_out) ) if ( dir_check(filename_out) )
{ {
char *fname = strrchr(filename_in, '/') + 1; // always exist, as we add curdir char *fname = strrchr(filename_in, '/') + 1; // always exist, as we add curdir
if (filename_out[strlen(filename_out)-1] != '/') if (filename_out[strlen(filename_out)-1] != '/')
{
strcat(filename_out, "/"); // add slash strcat(filename_out, "/"); // add slash
}
strcat(filename_out, fname); strcat(filename_out, fname);
} }
k70_in.p00 = 5; k70_in.p00 = 5;
k70_in.p04 = 0LL; k70_in.p04 = 0LL;
k70_in.p12 = 0; k70_in.p12 = 0;
k70_in.p16 = (unsigned) &bdvk; k70_in.p16 = (unsigned) &bdvk;
k70_in.p20 = 0; k70_in.p20 = 0;
k70_in.p21 = filename_in; k70_in.p21 = filename_in;
result = kol_file_70(&k70_in); // ¯®«ãç ¥¬ ¨­ä®à¬ æ¨î ® ä ©«¥ result = kol_file_70(&k70_in); // get information about file
if ( 0 != result ) if ( 0 != result )
goto lbl_exit; goto lbl_exit;
// count buffer size up to 1Mb, but no more than 1/2 of free memory // count buffer size up to 1Mb, but no more than 1/2 of free memory
buf_size = 1 << 20; // 1Mb buf_size = 1 << 20; // 1Mb
while( ((buf_size >> 10) > kol_system_memfree()) && (buf_size > 4096) ) while( ((buf_size >> 10) > kol_system_memfree()) && (buf_size > 4096) )
buf_size /= 2; buf_size /= 2;
filesize = bdvk.p32; // ¯®«ãç ¥¬ à §¬¥à ä ©« (®£à ­¨ç¥­¨¥ - 4 ƒ¡ ©â  ⮫쪮 ¤«ï FAT) filesize = bdvk.p32; // getting file size (restriction - 4 GB only for FAT)
if (buf_size > filesize) if (buf_size > filesize)
buf_size = (unsigned)filesize; // may be zero! buf_size = (unsigned)filesize; // may be zero!
if (buf_size == 0) buf_size = 4096; // ... if (buf_size == 0) buf_size = 4096; // ...
buffer = (char*) malloc(buf_size); buffer = (char*) malloc(buf_size);
if (!buffer) if (!buffer)
{ {
result = E_NOMEM; result = E_NOMEM;
goto lbl_exit; goto lbl_exit;
} }
k70_in.p00 = 0; k70_in.p00 = 0;
//k70_in.p08 = 0; //k70_in.p08 = 0;
k70_in.p12 = buf_size; k70_in.p12 = buf_size;
k70_in.p16 = (unsigned) buffer; k70_in.p16 = (unsigned) buffer;
k70_in.p20 = 0; k70_in.p20 = 0;
k70_in.p21 = filename_in; k70_in.p21 = filename_in;
k70_out.p00 = 2; k70_out.p00 = 2;
//k70_out.p08 = 0; //k70_out.p08 = 0;
k70_out.p12 = buf_size; k70_out.p12 = buf_size;
k70_out.p16 = (unsigned) buffer; k70_out.p16 = (unsigned) buffer;
k70_out.p20 = 0; k70_out.p20 = 0;
k70_out.p21 = filename_out; k70_out.p21 = filename_out;
unsigned long long offset = 0; unsigned long long offset = 0;
do { do
{
k70_in.p04 = offset; k70_in.p04 = offset;
if (offset + buf_size > filesize) // last chunk if (offset + buf_size > filesize) // last chunk
{ {
k70_in.p12 = k70_out.p12 = (unsigned)(filesize - offset); // filesize % buf_size; k70_in.p12 = k70_out.p12 = (unsigned)(filesize - offset); // filesize % buf_size;
} }
result = kol_file_70(&k70_in); // ç⥭¨¥ result = kol_file_70(&k70_in); // read
if (result != 0) if (result != 0)
{
goto lbl_exit; goto lbl_exit;
}
k70_out.p04 = offset; k70_out.p04 = offset;
result = kol_file_70(&k70_out); // § ¯¨áì result = kol_file_70(&k70_out); // write
if (result != 0) if (result != 0)
{
goto lbl_exit; goto lbl_exit;
}
if (k70_out.p00 == 2) if (k70_out.p00 == 2)
k70_out.p00 = 3; // ¬¥­ï¥¬ äã­ªæ¨î á ᮧ¤ ­¨ï (2) ­  ¤®§ ¯¨áì (3) {
k70_out.p00 = 3; // changing function from create (2) to append (3)
}
offset += buf_size; offset += buf_size;
} while (offset < filesize); } while (offset < filesize);
lbl_exit: lbl_exit:
parameters_free(argc, argv); parameters_free(argc, argv);
free(filename_in); free(filename_in);
free(filename_out); free(filename_out);
free(buffer); free(buffer);
return (result == 0); return (result == 0);
} }

View File

@ -8,6 +8,7 @@ unsigned num_of_file; // number of files in directory
unsigned *t; unsigned *t;
unsigned type_of_file; // check is this a file or a folder unsigned type_of_file; // check is this a file or a folder
int i, result; int i, result;
char tmp[FILENAME_MAX];
bool single_column_mode = FALSE; bool single_column_mode = FALSE;
@ -26,10 +27,24 @@ if (!strnicmp(dir,"-1",1))
dir += 3; dir += 3;
} }
if ( !strlen(dir) ) if ( !strlen(dir) ) // if argument is empty, list current directory
k70.p21 = cur_dir; k70.p21 = cur_dir;
else else
{
if (dir[0] != '/') // if given directory is relative path, then append cur_dir on left side
{
strcpy(tmp, cur_dir);
if (tmp[strlen(tmp)-1] != '/')
{
strcat(tmp, "/"); // add slash
}
strcat(tmp, dir);
k70.p21 = tmp;
} else // if given directory is an absolute path
{
k70.p21 = dir; k70.p21 = dir;
}
}
result = kol_file_70(&k70); result = kol_file_70(&k70);
if ( !((result==0) || (result==6)) ) // check does the directory exists if ( !((result==0) || (result==6)) ) // check does the directory exists

View File

@ -0,0 +1,164 @@
int cmd_mv(char param[])
{
char* argv[100];
int argc;
char *filename_in = NULL;
char *filename_out = NULL;
char *buffer = NULL;
kol_struct70 k70_in;
kol_struct70 k70_out;
kol_struct_BDVK bdvk;
unsigned long long filesize;
unsigned result, buf_size;
argc = parameters_prepare(param, argv);
/*
argv[0] - path (abs or rel) to file
argv[1] - new location: path (abs or rel) to dir or file
*/
if (argc != 2)
{
#if LANG_ENG
printf(" mv <file_in> <file_out>\n\r");
#elif LANG_RUS
printf(" mv <¨áâ®ç­¨ª> <१ã«ìâ â>\n\r");
#endif
parameters_free(argc, argv);
return TRUE;
}
filename_in = (char*) malloc(FILENAME_MAX);
filename_out = (char*) malloc(FILENAME_MAX);
if (argv[0][0] != '/')
{
strcpy(filename_in, cur_dir);
if (filename_in[strlen(filename_in)-1] != '/')
{
strcat(filename_in, "/"); // add slash
}
strcat(filename_in, argv[0]);
} else
{
strcpy(filename_in, argv[0]);
}
// -----
if (argv[1][0] != '/')
{
strcpy(filename_out, cur_dir);
if (filename_out[strlen(filename_out)-1] != '/')
{
strcat(filename_out, "/"); // add slash
}
strcat(filename_out, argv[1]);
} else
{
strcpy(filename_out, argv[1]);
}
// add ability to use directory as destination
if ( dir_check(filename_out) )
{
char *fname = strrchr(filename_in, '/') + 1; // always exist, as we add curdir
if (filename_out[strlen(filename_out)-1] != '/')
{
strcat(filename_out, "/"); // add slash
}
strcat(filename_out, fname);
}
if (strcmp(filename_in, filename_out) == 0) // if source file and destination file are same then exist with success
{
result = 0;
goto lbl_exit;
}
k70_in.p00 = 5;
k70_in.p04 = 0LL;
k70_in.p12 = 0;
k70_in.p16 = (unsigned) &bdvk;
k70_in.p20 = 0;
k70_in.p21 = filename_in;
result = kol_file_70(&k70_in); // get information about file
if ( 0 != result )
goto lbl_exit;
// count buffer size up to 1Mb, but no more than 1/2 of free memory
buf_size = 1 << 20; // 1Mb
while( ((buf_size >> 10) > kol_system_memfree()) && (buf_size > 4096) )
buf_size /= 2;
filesize = bdvk.p32; // getting file size (restriction - 4 GB only for FAT)
if (buf_size > filesize)
buf_size = (unsigned)filesize; // may be zero!
if (buf_size == 0) buf_size = 4096; // ...
buffer = (char*) malloc(buf_size);
if (!buffer)
{
result = E_NOMEM;
goto lbl_exit;
}
k70_in.p00 = 0;
//k70_in.p08 = 0;
k70_in.p12 = buf_size;
k70_in.p16 = (unsigned) buffer;
k70_in.p20 = 0;
k70_in.p21 = filename_in;
k70_out.p00 = 2;
//k70_out.p08 = 0;
k70_out.p12 = buf_size;
k70_out.p16 = (unsigned) buffer;
k70_out.p20 = 0;
k70_out.p21 = filename_out;
unsigned long long offset = 0;
do
{
k70_in.p04 = offset;
if (offset + buf_size > filesize) // last chunk
{
k70_in.p12 = k70_out.p12 = (unsigned)(filesize - offset); // filesize % buf_size;
}
result = kol_file_70(&k70_in); // read
if (result != 0)
{
goto lbl_exit;
}
k70_out.p04 = offset;
result = kol_file_70(&k70_out); // write
if (result != 0)
{
goto lbl_exit;
}
if (k70_out.p00 == 2)
{
k70_out.p00 = 3; // changing function from create (2) to append (3)
}
offset += buf_size;
} while (offset < filesize);
cmd_rm(filename_in); // remove source file
lbl_exit:
parameters_free(argc, argv);
free(filename_in);
free(filename_out);
free(buffer);
return (result == 0);
}

View File

@ -0,0 +1,50 @@
int cmd_ren(char param[])
{
char* argv[100];
int argc;
/*
argv[0] - path (abs or rel) to file
argv[1] - new filename
*/
argc = parameters_prepare(param, argv);
if (argc != 2)
{
#if LANG_ENG
printf(" ren <file> <new_name>\n\r");
#elif LANG_RUS
printf(" ren <ä ©«> <­®¢®¥_¨¬ï>\n\r");
#endif
parameters_free(argc, argv);
return TRUE;
}
char *x;
if (x = strrchr(argv[1], '/') != 0) // argv[1] must be file name, not path
{
//printf("%d %s", x, argv[1]);
return FALSE;
}
char *new_filename = (char*)malloc(FILENAME_MAX); new_filename[0] = '\0';
get_file_dir_loc(argv[0], new_filename);
if (strlen(new_filename) > 0)
{
strcat(new_filename, "/");
}
strcat(new_filename, argv[1]);
char *mv_params = (char*)malloc(FILENAME_MAX*2 + 1); mv_params[0] = '\0';
strcat(mv_params, argv[0]);
strcat(mv_params, " ");
strcat(mv_params, new_filename);
//printf("(%s)\n", mv_params);
int res = cmd_mv(mv_params);
free(new_filename);
free(mv_params);
return res;
}

View File

@ -1,5 +1,5 @@
#define SHELL_VERSION "0.7.8a" #define SHELL_VERSION "0.7.9"
extern char PATH[256]; extern char PATH[256];
extern char PARAM[256]; extern char PARAM[256];
@ -67,6 +67,8 @@ int cmd_uptime(char param[]);
int cmd_killall(char process_name[]); int cmd_killall(char process_name[]);
int cmd_history(char arg[]); int cmd_history(char arg[]);
int cmd_cp(char param[]); int cmd_cp(char param[]);
int cmd_mv(char param[]);
int cmd_ren(char param[]);
int cmd_waitfor(char param[]); int cmd_waitfor(char param[]);
/// =========================================================== /// ===========================================================

View File

@ -6,6 +6,8 @@ const command_t COMMANDS[]=
{"cd", " Changes current directory. Usage:\n\r cd <directory name>\n\r", &cmd_cd}, {"cd", " Changes current directory. Usage:\n\r cd <directory name>\n\r", &cmd_cd},
{"clear", " Clears the screen\n\r", &cmd_clear}, {"clear", " Clears the screen\n\r", &cmd_clear},
{"cp", " Copies file\n\r", &cmd_cp}, {"cp", " Copies file\n\r", &cmd_cp},
{"mv", " Moves file\n\r", &cmd_mv},
{"ren", " Renames file\n\r", &cmd_ren},
{"date", " Returns the current date and time\n\r", &cmd_date}, {"date", " Returns the current date and time\n\r", &cmd_date},
{"echo", " Echoes the data to the screen. Usage:\n\r echo <data>\n\r", &cmd_echo}, {"echo", " Echoes the data to the screen. Usage:\n\r echo <data>\n\r", &cmd_echo},
{"exit", " Exits from Shell\n\r", &cmd_exit}, {"exit", " Exits from Shell\n\r", &cmd_exit},

View File

@ -6,6 +6,8 @@ const command_t COMMANDS[]=
{"cd", " ˆ§¬¥­ï¥â ⥪ãéãî ¤¥à¨ªâ®à¨î. ˆá¯®«ì§®¢ ­¨¥:\n\r cd <¤¨à¥ªâ®à¨ï>\n\r", &cmd_cd}, {"cd", " ˆ§¬¥­ï¥â ⥪ãéãî ¤¥à¨ªâ®à¨î. ˆá¯®«ì§®¢ ­¨¥:\n\r cd <¤¨à¥ªâ®à¨ï>\n\r", &cmd_cd},
{"clear", " Žç¨é ¥â íªà ­\n\r", &cmd_clear}, {"clear", " Žç¨é ¥â íªà ­\n\r", &cmd_clear},
{"cp", " Š®¯¨àã¥â ä ©«\n\r", &cmd_cp}, {"cp", " Š®¯¨àã¥â ä ©«\n\r", &cmd_cp},
{"mv", " <20>¥à¥¬¥é ¥â ä ©«\n\r", &cmd_mv},
{"ren", " <20>¥à¥¨¬¥­®¢ë¢ ¥â ä ©«\n\r", &cmd_ren},
{"date", " <20>®ª §ë¢ ¥â ⥪ãéãî ¤ âã ¨ ¢à¥¬ï\n\r", &cmd_date}, {"date", " <20>®ª §ë¢ ¥â ⥪ãéãî ¤ âã ¨ ¢à¥¬ï\n\r", &cmd_date},
{"echo", " ‚뢮¤¨â ¤ ­­ë¥ ­  íªà ­. ˆá¯®«ì§®¢ ­¨¥:\n\r echo <¤ ­­ë¥>\n\r", &cmd_echo}, {"echo", " ‚뢮¤¨â ¤ ­­ë¥ ­  íªà ­. ˆá¯®«ì§®¢ ­¨¥:\n\r echo <¤ ­­ë¥>\n\r", &cmd_echo},
{"exit", " ‡ ¢¥à襭¨¥ à ¡®âë Shell\n\r", &cmd_exit}, {"exit", " ‡ ¢¥à襭¨¥ à ¡®âë Shell\n\r", &cmd_exit},

View File

@ -41,6 +41,20 @@ for (;;i--)
break; break;
} }
} }
/// ===========================================================
void get_file_dir_loc(char *filepath, char *dir_path)
{
char *res = strrchr(filepath, '/');
if (res == 0)
{
dir_path = '\0';
return;
}
size_t pos = res - filepath;
strncpy(dir_path, filepath, pos);
dir_path[pos] = '\0';
}
/// =========================================================== /// ===========================================================
@ -160,7 +174,9 @@ command_execute();
for (;;) for (;;)
{ {
//printf("\033[32;1m");
printf ("# "); printf ("# ");
//printf("\033[0m");
command_get(); command_get();
command_execute(); command_execute();
} }

View File

@ -144,7 +144,7 @@ char* strchr(const char* string, int c)
char* strrchr(const char* string, int c) char* strrchr(const char* string, int c)
{ {
char* last_found; char* last_found = 0; // !
while (*string) while (*string)
{ {
if (*string==c) if (*string==c)