better cp, 64-bit fileops

git-svn-id: svn://kolibrios.org@6857 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
siemargl
2017-02-06 12:35:58 +00:00
parent d248870812
commit 4e23975970
17 changed files with 107 additions and 104 deletions

View File

@@ -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; // ª®«¨ç¥á⢮ à § ª®¯¨à®¢ ­¨ï ¯® 4 ª¡ ©â 
unsigned long long filesize;
unsigned result, buf_size;
argc = parameters_prepare(param, argv);
@@ -58,110 +57,88 @@ 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); // ¯®«ãç ¥¬ ¨­ä®à¬ æ¨î ® ä ©«¥
if ( 0 != result )
{
parameters_free(argc, argv);
free(filename_in);
free(filename_out);
return TRUE;
}
goto lbl_exit;
filesize = bdvk.p32[0]; // ¯®«ãç ¥¬ à §¬¥à ä ©«  (®£à ­¨ç¥­¨¥ - 4 ƒ¡ ©â )
n = filesize / 4096;
// 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;
buffer = (char*) malloc(4096);
filesize = bdvk.p32; // ¯®«ãç ¥¬ à §¬¥à ä ©« (®£à ­¨ç¥­¨¥ - 4 ƒ¡ ©â  ⮫쪮 ¤«ï 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 = 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; // ¤«ï ⮣®, çâ®¡ë ª®¯¨à®¢ âì ä ©«ë á à §¬¥à®¬ ¬¥­ìè¥ 4 ª<> ©â
for ( i = 0; i < n; i++)
{
k70_in.p04 = i*4096;
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); // ç⥭¨¥
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); // § ¯¨áì
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; // ¬¥­ï¥¬ äã­ªæ¨î á á®§¤ ­¨ï (2) ­  ¤®§ ¯¨áì (3)
offset += buf_size;
} while (offset < filesize);
}
if ( (filesize%4096) != 0 ) // ¥á«¨ à §¬¥à ä ©«  ­¥ ªà â¥­ 4 ª<> ©â ¬
{
k70_in.p12 = filesize%4096;
k70_out.p12 = filesize%4096;
k70_in.p04 = i*4096; // ¢ i ¤®«¦­® ¡ëâì ¯à ¢¨«ì­®¥ ᬥ饭¨¥
result = kol_file_70(&k70_in); // ç⥭¨¥
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); // § ¯¨áì
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);
}

View File

@@ -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; // ç¨á«® ä ©«®¢ ¢ ª â «®£¥
// 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);

View File

@@ -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;

View File

@@ -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]; //¡ãä¥à
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]; // ¯®«ãç ¥¬ à §¬¥à ä ©« 
filesize = bdvk.p32; // ¯®«ãç ¥¬ à §¬¥à ä ©« 
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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -43,7 +43,7 @@ else
}
k70.p04 = 0;
k70.p08 = 0;
//k70.p08 = 0;
k70.p12 = 0;
k70.p16 = 0;
k70.p20 = 0;