/programs/system/shell/History.txt |
---|
1,3 → 1,8 |
Shell 0.7.6 // 06.02.2017 // Siemargl |
* ©«®¢ë¥ ®¯¥à 樨 ¨á¯®«ì§ãîâ 64-bit à §¬¥àë ä ©«®¢. |
cp <file> <dest> ⥯¥àì ¯®¨¬ ¥â, ¥á«¨ <dest> - ª â «®£ |
cp ¨á¯®«ì§ã¥â ¡ãä¥à 1¡, ¨«¨ ¥ ¡®«¥¥ ¯®«®¢¨ë ᢮¡®¤®© ¯ ¬ï⨠|
Shell 0.7.5 // 06.01.2017 // Siemargl |
* ¥«ª¨¥ ¡ £ä¨ªáë, ¨§¬¥¥ «®£¨ª ®¡à ¡®âª¨ áâ५®ª ¢¢¥àå/¢¨§, çâ®¡ë ª ª ã ¢á¥å |
®¡ ¢«¥ ª®¬ ¤ waitfor ¨ ¢ ਠâ ps á ¯ à ¬¥â஬ |
/programs/system/shell/cmd/cmd_cp.c |
---|
3,11 → 3,10 |
{ |
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; |
14,8 → 13,8 |
kol_struct_BDVK bdvk; |
unsigned filesize, result; |
unsigned n; // ª®«¨ç¥á⢮ à § ª®¯¨à®¢ ¨ï ¯® 4 ª¡ ©â |
unsigned long long filesize; |
unsigned result, buf_size; |
argc = parameters_prepare(param, argv); |
59,9 → 58,19 |
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; |
68,100 → 77,68 |
result = kol_file_70(&k70_in); // ¯®«ãç ¥¬ ¨ä®à¬ æ¨î ® ä ©«¥ |
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; // ¯®«ãç ¥¬ à §¬¥à ä ©« (®£à ¨ç¥¨¥ - 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) |
{ |
parameters_free(argc, argv); |
free(filename_in); |
free(filename_out); |
return TRUE; |
result = E_NOMEM; |
goto lbl_exit; |
} |
filesize = bdvk.p32[0]; // ¯®«ãç ¥¬ à §¬¥à ä ©« (®£à ¨ç¥¨¥ - 4 ¡ ©â ) |
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; // ¤«ï ⮣®, çâ®¡ë ª®¯¨à®¢ âì ä ©«ë á à §¬¥à®¬ ¬¥ìè¥ 4 ª ©â |
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); // ç⥨¥ |
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); |
} |
lbl_exit: |
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; |
return (result == 0); |
} |
} |
parameters_free(argc, argv); |
free(filename_in); |
free(filename_out); |
free(buffer); |
return TRUE; |
} |
/programs/system/shell/cmd/cmd_ls.c |
---|
12,8 → 12,8 |
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 |
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); |
/programs/system/shell/cmd/cmd_mkdir.c |
---|
24,7 → 24,7 |
k70.p00 = 9; |
k70.p04 = 0; |
k70.p08 = 0; |
//k70.p08 = 0; |
k70.p12 = 0; |
k70.p16 = 0; |
k70.p20 = 0; |
/programs/system/shell/cmd/cmd_more.c |
---|
4,7 → 4,8 |
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 |
} |
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 |
if ( 0 != result ) |
return FALSE; |
filesize = bdvk.p32[0]; // ¯®«ãç ¥¬ à §¬¥à ä ©« |
filesize = bdvk.p32; // ¯®«ãç ¥¬ à §¬¥à ä ©« |
buf[80]=0; |
flags = con_get_flags(); |
65,7 → 67,7 |
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; |
/programs/system/shell/cmd/cmd_rm.c |
---|
40,7 → 40,7 |
k70.p00 = 8; |
k70.p04 = 0; |
k70.p08 = 0; |
//k70.p08 = 0; |
k70.p12 = 0; |
k70.p16 = 0; |
k70.p20 = 0; |
/programs/system/shell/cmd/cmd_rmdir.c |
---|
23,7 → 23,7 |
k70.p00 = 8; |
k70.p04 = 0; |
k70.p08 = 0; |
//k70.p08 = 0; |
k70.p12 = 0; |
k70.p16 = 0; |
k70.p20 = 0; |
/programs/system/shell/cmd/cmd_touch.c |
---|
43,7 → 43,7 |
} |
k70.p04 = 0; |
k70.p08 = 0; |
//k70.p08 = 0; |
k70.p12 = 0; |
k70.p16 = 0; |
k70.p20 = 0; |
/programs/system/shell/globals.h |
---|
1,5 → 1,5 |
#define SHELL_VERSION "0.7.5" |
#define SHELL_VERSION "0.7.6" |
extern char PATH[256]; |
extern char PARAM[256]; |
/programs/system/shell/modules/module_command.c |
---|
359,7 → 359,7 |
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"); |
/programs/system/shell/modules/module_program.c |
---|
6,7 → 6,8 |
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; |
/programs/system/shell/modules/module_script.c |
---|
9,7 → 9,7 |
k70.p00 = 0; |
k70.p04 = 0; |
k70.p08 = 0; |
//k70.p08 = 0; |
k70.p12 = 4; // ÷èòàòü 4 áàéòà |
k70.p16 = (unsigned) buf; |
k70.p20 = 0; |
30,11 → 30,13 |
kol_struct70 k70; |
kol_struct_BDVK bdvk; |
unsigned result, filesize, pos, i; |
unsigned result, i; |
unsigned long long filesize, pos; |
char *buf; //áóôåð, êóäà êîïèðóåòñÿ ñêðèïò |
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,9 → 45,9 |
if ( 0 != result ) |
return FALSE; |
filesize = bdvk.p32[0]; // ïîëó÷àåì ðàçìåð ôàéëà |
filesize = bdvk.p32; // ïîëó÷àåì ðàçìåð ôàéëà |
buf = malloc(filesize+256); |
buf = malloc(filesize+256); // may fail for over 4Gb file, but impossible case |
if (NULL == buf) |
return FALSE; |
52,7 → 54,8 |
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; |
/programs/system/shell/prototypes.h |
---|
19,7 → 19,7 |
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[]); |
/programs/system/shell/shell.c |
---|
4,6 → 4,7 |
/// =========================================================== |
int dir_check(char dir[]) |
/// just checks, if dir[] is really a directory |
{ |
kol_struct70 k70; |
int result; |
10,9 → 11,9 |
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 |
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 |
k70.p00 = 0; |
k70.p04 = 0; |
k70.p08 = 0; |
//k70.p08 = 0; |
k70.p12 = 0; |
k70.p16 = 0; |
k70.p20 = 0; |
/programs/system/shell/system/kolibri.h |
---|
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 p20; |
unsigned p24; |
unsigned p28; |
unsigned p32[2]; |
unsigned long long p32; |
unsigned p40; |
} kol_struct_BDVK; |
#pragma pack(pop) |
/programs/system/shell/system/stdlib.c |
---|
29,5 → 29,5 |
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) ); |
} |
/programs/system/shell/system/string.c |
---|
1,5 → 1,6 |
#include "string.h" |
#include "ctype.h" |
void* memset(void *mem, int c, unsigned size) |
{ |