forked from KolibriOS/kolibrios
better cp, 64-bit fileops
git-svn-id: svn://kolibrios.org@6857 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
@@ -1,3 +1,8 @@
|
||||
Shell 0.7.6 // 06.02.2017 // Siemargl
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>樨 <20>ᯮ<EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 64-bit ࠧ<><E0A0A7><EFBFBD><EFBFBD> 䠩<><E4A0A9><EFBFBD>.
|
||||
cp <file> <dest> ⥯<><E2A5AF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <dest> - <20><>⠫<EFBFBD><E2A0AB>
|
||||
cp <20>ᯮ<EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> 1<><31>, <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <><E1A2AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
Shell 0.7.5 // 06.01.2017 // Siemargl
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>䨪<EFBFBD><E4A8AA>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ࠡ<EFBFBD>⪨ <20><>५<EFBFBD><E0A5AB> <20><><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>, <20>⮡<EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD>
|
||||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> waitfor <20> <20><>ਠ<EFBFBD><E0A8A0> ps <20> <20><>ࠬ<EFBFBD><E0A0AC>
|
||||
|
@@ -3,19 +3,18 @@ int cmd_cp(char param[])
|
||||
{
|
||||
|
||||
char* argv[100];
|
||||
int i;
|
||||
int argc;
|
||||
char *filename_in;
|
||||
char *filename_out;
|
||||
char *buffer;
|
||||
char *filename_in = NULL;
|
||||
char *filename_out = NULL;
|
||||
char *buffer = NULL;
|
||||
|
||||
kol_struct70 k70_in;
|
||||
kol_struct70 k70_out;
|
||||
|
||||
kol_struct_BDVK bdvk;
|
||||
|
||||
unsigned filesize, result;
|
||||
unsigned n; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢮ ࠧ <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD> <20><> 4 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
unsigned long long filesize;
|
||||
unsigned result, buf_size;
|
||||
|
||||
argc = parameters_prepare(param, argv);
|
||||
|
||||
@@ -59,109 +58,87 @@ if (argv[1][0] != '/')
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
k70_in.p00 = 5;
|
||||
k70_in.p04 = k70_in.p08 = k70_in.p12 = 0;
|
||||
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); // <20><><EFBFBD><EFBFBD>砥<EFBFBD> <20><><EFBFBD><EFBFBD>ଠ<EFBFBD><E0ACA0><EFBFBD> <20> 䠩<><E4A0A9>
|
||||
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; // <20><><EFBFBD><EFBFBD>砥<EFBFBD> ࠧ<><E0A0A7><EFBFBD> 䠩<><E4A0A9>(<28><>࠭<EFBFBD>祭<EFBFBD><E7A5AD> - 4 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ⮫쪮 <20><><EFBFBD> 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)
|
||||
{
|
||||
parameters_free(argc, argv);
|
||||
free(filename_in);
|
||||
free(filename_out);
|
||||
return TRUE;
|
||||
result = E_NOMEM;
|
||||
goto lbl_exit;
|
||||
}
|
||||
|
||||
filesize = bdvk.p32[0]; // <20><><EFBFBD><EFBFBD>砥<EFBFBD> ࠧ<><E0A0A7><EFBFBD> 䠩<><E4A0A9> (<28><>࠭<EFBFBD>祭<EFBFBD><E7A5AD> - 4 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
n = filesize / 4096;
|
||||
|
||||
buffer = (char*) malloc(4096);
|
||||
|
||||
k70_in.p00 = 0;
|
||||
k70_in.p08 = 0;
|
||||
k70_in.p12 = 4096;
|
||||
//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 = 4096;
|
||||
//k70_out.p08 = 0;
|
||||
k70_out.p12 = buf_size;
|
||||
k70_out.p16 = (unsigned) buffer;
|
||||
k70_out.p20 = 0;
|
||||
k70_out.p21 = filename_out;
|
||||
|
||||
i = 0; // <20><><EFBFBD> ⮣<>, <20>⮡<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD> 䠩<><E4A0A9> <20> ࠧ<><E0A0A7> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4 <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
for ( i = 0; i < n; i++)
|
||||
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;
|
||||
}
|
||||
|
||||
k70_in.p04 = i*4096;
|
||||
result = kol_file_70(&k70_in); // <20>⥭<EFBFBD><E2A5AD>
|
||||
if (result != 0)
|
||||
{
|
||||
parameters_free(argc, argv);
|
||||
free(filename_in);
|
||||
free(filename_out);
|
||||
free(buffer);
|
||||
return FALSE;
|
||||
}
|
||||
goto lbl_exit;
|
||||
|
||||
k70_out.p04 = i*4096;
|
||||
k70_out.p04 = offset;
|
||||
result = kol_file_70(&k70_out); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (result != 0)
|
||||
{
|
||||
parameters_free(argc, argv);
|
||||
free(filename_in);
|
||||
free(filename_out);
|
||||
free(buffer);
|
||||
return FALSE;
|
||||
}
|
||||
goto lbl_exit;
|
||||
|
||||
if (i == 0)
|
||||
if (k70_out.p00 == 2)
|
||||
k70_out.p00 = 3; // <20><><EFBFBD>塞 <20>㭪<EFBFBD><E3ADAA><EFBFBD> <20> ᮧ<><E1AEA7><EFBFBD><EFBFBD><EFBFBD> (2) <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (3)
|
||||
offset += buf_size;
|
||||
} while (offset < filesize);
|
||||
|
||||
}
|
||||
|
||||
if ( (filesize%4096) != 0 ) // <20> ࠧ<><E0A0A7><EFBFBD> 䠩<><E4A0A9> <20><> <20><><EFBFBD>⥭ 4 <20><><EFBFBD><EFBFBD>⠬
|
||||
{
|
||||
|
||||
k70_in.p12 = filesize%4096;
|
||||
k70_out.p12 = filesize%4096;
|
||||
|
||||
k70_in.p04 = i*4096; // <20> i <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ࠢ<EFBFBD><E0A0A2>쭮<EFBFBD> ᬥ饭<E1ACA5><E9A5AD>
|
||||
result = kol_file_70(&k70_in); // <20>⥭<EFBFBD><E2A5AD>
|
||||
if (result != 0)
|
||||
{
|
||||
parameters_free(argc, argv);
|
||||
free(filename_in);
|
||||
free(filename_out);
|
||||
free(buffer);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
k70_out.p04 = i*4096;
|
||||
result = kol_file_70(&k70_out); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (result != 0)
|
||||
{
|
||||
parameters_free(argc, argv);
|
||||
free(filename_in);
|
||||
free(filename_out);
|
||||
free(buffer);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
lbl_exit:
|
||||
|
||||
parameters_free(argc, argv);
|
||||
free(filename_in);
|
||||
free(filename_out);
|
||||
free(buffer);
|
||||
|
||||
|
||||
return TRUE;
|
||||
return (result == 0);
|
||||
}
|
||||
|
||||
|
@@ -12,8 +12,8 @@ int i, result;
|
||||
|
||||
k70.p00 = 1;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 10000;
|
||||
//k70.p08 = 0;
|
||||
k70.p12 = 2; // just for test exist & read number of entries
|
||||
k70.p16 = (unsigned) malloc(32+k70.p12*560);
|
||||
k70.p20 = 0;
|
||||
|
||||
@@ -34,6 +34,20 @@ if ( !((result==0) || (result==6)) ) //
|
||||
n = (unsigned*) (k70.p16+8);
|
||||
num_of_file = *n; // <20><> 䠩<><E4A0A9><EFBFBD> <20> <20><>⠫<EFBFBD><E2A0AB><EFBFBD>
|
||||
|
||||
// now read full directory
|
||||
k70.p12 = num_of_file;
|
||||
free( (void*) k70.p16);
|
||||
k70.p16 = (unsigned) malloc(32+k70.p12*560);
|
||||
if ( !k70.p16 )
|
||||
return FALSE;
|
||||
|
||||
result = kol_file_70(&k70);
|
||||
if ( !((result==0) || (result==6)) )
|
||||
{
|
||||
free( (void*) k70.p16);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_of_file; i++)
|
||||
{
|
||||
printf (" %s", k70.p16+32+40+(264+40)*i);
|
||||
|
@@ -24,7 +24,7 @@ if ( 0 == strcmp(dir, ".") || ( 0 == strcmp(dir, "..") ) || ( 0 == strcmp(cur_di
|
||||
|
||||
k70.p00 = 9;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
//k70.p08 = 0;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
|
@@ -4,7 +4,8 @@ int cmd_more(char file[])
|
||||
|
||||
kol_struct70 k70;
|
||||
kol_struct_BDVK bdvk;
|
||||
unsigned result, filesize, pos, i;
|
||||
unsigned result, i;
|
||||
unsigned long long filesize, pos;
|
||||
char buf[81]; //<2F><><EFBFBD><EFBFBD><EFBFBD>
|
||||
char temp[FILENAME_MAX];
|
||||
unsigned flags;
|
||||
@@ -44,7 +45,8 @@ else
|
||||
}
|
||||
|
||||
k70.p00 = 5;
|
||||
k70.p04 = k70.p08 = k70.p12 = 0;
|
||||
k70.p04 = k70.p12 = 0;
|
||||
//k70.p08 = 0;
|
||||
k70.p16 = (unsigned) &bdvk;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = temp;
|
||||
@@ -53,7 +55,7 @@ result = kol_file_70(&k70); //
|
||||
if ( 0 != result )
|
||||
return FALSE;
|
||||
|
||||
filesize = bdvk.p32[0]; // <20><><EFBFBD><EFBFBD>砥<EFBFBD> ࠧ<><E0A0A7><EFBFBD> 䠩<><E4A0A9>
|
||||
filesize = bdvk.p32; // <20><><EFBFBD><EFBFBD>砥<EFBFBD> ࠧ<><E0A0A7><EFBFBD> 䠩<><E4A0A9>
|
||||
|
||||
buf[80]=0;
|
||||
flags = con_get_flags();
|
||||
@@ -65,7 +67,7 @@ for (pos=0;pos<filesize;pos+=80)
|
||||
|
||||
k70.p00 = 0;
|
||||
k70.p04 = pos;
|
||||
k70.p08 = 0;
|
||||
// k70.p08 = 0; // bug for over 4Gb files, but "more" is unusable there
|
||||
k70.p12 = 80;
|
||||
k70.p16 = (unsigned) buf;
|
||||
k70.p20 = 0;
|
||||
|
@@ -40,7 +40,7 @@ else
|
||||
|
||||
k70.p00 = 8;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
//k70.p08 = 0;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
|
@@ -23,7 +23,7 @@ if ( ( 0 == strcmp(dir, ".") ) || ( 0 == strcmp(dir, "..") ) || ( 0 == strcmp(cu
|
||||
|
||||
k70.p00 = 8;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
//k70.p08 = 0;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
|
@@ -43,7 +43,7 @@ else
|
||||
}
|
||||
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
//k70.p08 = 0;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
|
@@ -1,5 +1,5 @@
|
||||
|
||||
#define SHELL_VERSION "0.7.5"
|
||||
#define SHELL_VERSION "0.7.6"
|
||||
|
||||
extern char PATH[256];
|
||||
extern char PARAM[256];
|
||||
|
@@ -359,7 +359,7 @@ for (i = 0; i < NUM_OF_CMD; i++)
|
||||
if (!strcmp(cmd, COMMANDS[i].name))
|
||||
{
|
||||
result = ((handler1_t)COMMANDS[i].handler)(args);
|
||||
if (result != TRUE)
|
||||
if (result == FALSE)
|
||||
{
|
||||
#if LANG_ENG
|
||||
printf(" Error!\n\r");
|
||||
|
@@ -6,7 +6,8 @@ kol_struct70 k70;
|
||||
|
||||
k70.p00 = 7;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = (unsigned) param;
|
||||
//k70.p08 = (unsigned) param;
|
||||
*((unsigned*)&k70 + 2) = (unsigned) param;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
|
@@ -9,7 +9,7 @@ char buf[4];
|
||||
|
||||
k70.p00 = 0;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
//k70.p08 = 0;
|
||||
k70.p12 = 4; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4 <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
k70.p16 = (unsigned) buf;
|
||||
k70.p20 = 0;
|
||||
@@ -30,11 +30,13 @@ int script_run(char exec[], char args[])
|
||||
|
||||
kol_struct70 k70;
|
||||
kol_struct_BDVK bdvk;
|
||||
unsigned result, filesize, pos, i;
|
||||
unsigned result, i;
|
||||
unsigned long long filesize, pos;
|
||||
char *buf; //<2F><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
k70.p00 = 5;
|
||||
k70.p04 = k70.p08 = k70.p12 = 0;
|
||||
k70.p04 = k70.p12 = 0;
|
||||
//k70.p08 = 0;
|
||||
k70.p16 = (unsigned) &bdvk;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = exec;
|
||||
@@ -43,16 +45,17 @@ result = kol_file_70(&k70); //
|
||||
if ( 0 != result )
|
||||
return FALSE;
|
||||
|
||||
filesize = bdvk.p32[0]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
filesize = bdvk.p32; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
buf = malloc(filesize+256);
|
||||
buf = malloc(filesize+256); // may fail for over 4Gb file, but impossible case
|
||||
if (NULL == buf)
|
||||
return FALSE;
|
||||
|
||||
buf[filesize]=0;
|
||||
|
||||
k70.p00 = 0;
|
||||
k70.p04 = k70.p08 = 0;
|
||||
k70.p04 = 0;
|
||||
//k70.p08 = 0;
|
||||
k70.p12 = filesize;
|
||||
k70.p16 = (unsigned) buf;
|
||||
k70.p20 = 0;
|
||||
|
@@ -19,7 +19,7 @@ int command_get_cmd(char cmd[]);
|
||||
int script_check(char file[]);
|
||||
int script_run(char exec[], char args[]);
|
||||
|
||||
int aliases_check(char alias[]);
|
||||
int alias_check(char alias[]);
|
||||
int alias_search(char alias[]);
|
||||
int alias_add(char alias[]);
|
||||
int alias_split (char alias[], char s1[], char s2[]);
|
||||
|
@@ -4,15 +4,16 @@
|
||||
/// ===========================================================
|
||||
|
||||
int dir_check(char dir[])
|
||||
/// just checks, if dir[] is really a directory
|
||||
{
|
||||
kol_struct70 k70;
|
||||
int result;
|
||||
|
||||
k70.p00 = 1;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 2*1024*1024; // 2 MB
|
||||
k70.p16 = (unsigned) malloc(2*1024*1024);
|
||||
//k70.p08 = 0;
|
||||
k70.p12 = 2; // enough to read . & ..
|
||||
k70.p16 = (unsigned)malloc(32+k70.p12*560);
|
||||
k70.p20 = 0;
|
||||
k70.p21 = dir;
|
||||
|
||||
@@ -20,7 +21,7 @@ result = kol_file_70(&k70);
|
||||
|
||||
free((void*)k70.p16);
|
||||
|
||||
if ( (0 == result)||(6 == result) )
|
||||
if ( (0 == result)||(6 == result) ) // 6 is possible ???
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
@@ -50,7 +51,7 @@ int result;
|
||||
|
||||
k70.p00 = 0;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
//k70.p08 = 0;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
|
@@ -18,8 +18,7 @@
|
||||
typedef struct
|
||||
{
|
||||
unsigned p00;
|
||||
unsigned p04;
|
||||
unsigned p08;
|
||||
unsigned long long p04;
|
||||
unsigned p12;
|
||||
unsigned p16;
|
||||
char p20;
|
||||
@@ -40,7 +39,7 @@ unsigned p16;
|
||||
unsigned p20;
|
||||
unsigned p24;
|
||||
unsigned p28;
|
||||
unsigned p32[2];
|
||||
unsigned long long p32;
|
||||
unsigned p40;
|
||||
} kol_struct_BDVK;
|
||||
#pragma pack(pop)
|
||||
|
@@ -29,5 +29,5 @@ asm ("int $0x40"::"a"(68), "b"(13), "c"(p) );
|
||||
|
||||
void* realloc(void *p, unsigned s)
|
||||
{
|
||||
asm ("int $0x40"::"a"(68), "b"(12), "c"(p), "d"(s) );
|
||||
asm ("int $0x40"::"a"(68), "b"(20), "c"(p), "d"(s) );
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
|
||||
#include "string.h"
|
||||
#include "ctype.h"
|
||||
|
||||
void* memset(void *mem, int c, unsigned size)
|
||||
{
|
||||
|
Reference in New Issue
Block a user