Subversion Repositories Kolibri OS

Rev

Rev 6826 | Rev 7802 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6826 Rev 6857
Line 1... Line 1...
1
int cmd_cp(char param[])
1
int cmd_cp(char param[])
2
{
2
{
Line 3... Line 3...
3
 
3
 
4
char* argv[100];
-
 
5
int i;
4
char* argv[100];
6
int argc;
5
int argc;
7
char *filename_in;
6
char *filename_in = NULL;
8
char *filename_out;
7
char *filename_out = NULL;
Line 9... Line 8...
9
char *buffer;
8
char *buffer = NULL;
10
 
9
 
Line 11... Line 10...
11
kol_struct70	k70_in;
10
kol_struct70	k70_in;
Line 12... Line 11...
12
kol_struct70	k70_out;
11
kol_struct70	k70_out;
13
 
12
 
Line 14... Line 13...
14
kol_struct_BDVK	bdvk;
13
kol_struct_BDVK	bdvk;
Line 15... Line 14...
15
 
14
 
16
unsigned filesize, result;
15
unsigned long long filesize;
Line 57... Line 56...
57
   {
56
   {
58
   strcpy(filename_out, argv[1]);
57
   strcpy(filename_out, argv[1]);
59
   }
58
   }
60
 
59
   
Line -... Line 60...
-
 
60
// add ability to use directory as destination
-
 
61
if ( dir_check(filename_out) )
-
 
62
	{
-
 
63
		char *fname = strrchr(filename_in, '/') + 1;  // always exist, as we add curdir
-
 
64
		if (filename_out[strlen(filename_out)-1] != '/')
-
 
65
			strcat(filename_out, "/"); // add slash
-
 
66
		strcat(filename_out, fname);
-
 
67
	}
-
 
68
 
Line 61... Line 69...
61
 
69
 
62
k70_in.p00 = 5;
70
k70_in.p00 = 5;
-
 
71
k70_in.p04 = 0LL;
63
k70_in.p04 = k70_in.p08 = k70_in.p12 = 0;
72
k70_in.p12 = 0;
64
k70_in.p16 = (unsigned) &bdvk;
73
k70_in.p16 = (unsigned) &bdvk;
65
k70_in.p20 = 0;
74
k70_in.p20 = 0;
Line 66... Line 75...
66
k70_in.p21 = filename_in;
75
k70_in.p21 = filename_in;
67
 
76
 
68
result = kol_file_70(&k70_in); // ¯®«ãç ¥¬ ¨­ä®à¬ æ¨î ® ä ©«¥
-
 
69
if ( 0 != result )
-
 
70
       {
-
 
71
       parameters_free(argc, argv);
-
 
72
       free(filename_in);
77
result = kol_file_70(&k70_in); // ¯®«ãç ¥¬ ¨­ä®à¬ æ¨î ® ä ©«¥
73
       free(filename_out);
-
 
Line -... Line 78...
-
 
78
if ( 0 != result )
-
 
79
	goto lbl_exit;
-
 
80
 
-
 
81
// count buffer size up to 1Mb, but no more than 1/2 of free memory
-
 
82
buf_size = 1 << 20; // 1Mb
74
       return TRUE;
83
while( ((buf_size >> 10) > kol_system_memfree()) && (buf_size > 4096) )
75
       }
84
	buf_size /= 2;
-
 
85
 
-
 
86
filesize = bdvk.p32; // ¯®«ãç ¥¬ à §¬¥à ä ©« (®£à ­¨ç¥­¨¥ - 4 ƒ¡ ©â  ⮫쪮 ¤«ï FAT)
Line 76... Line 87...
76
 
87
if (buf_size > filesize)
-
 
88
	buf_size = (unsigned)filesize;	// may be zero!
-
 
89
if (buf_size == 0) buf_size = 4096;	// ...
-
 
90
 
-
 
91
buffer = (char*) malloc(buf_size);
-
 
92
if (!buffer)
Line 77... Line 93...
77
filesize = bdvk.p32[0]; // ¯®«ãç ¥¬ à §¬¥à ä ©«   (®£à ­¨ç¥­¨¥ - 4 ƒ¡ ©â )
93
	{
78
n = filesize / 4096;
94
		result = E_NOMEM;
79
 
95
		goto lbl_exit;
80
buffer = (char*) malloc(4096);
96
	}
81
 
97
 
82
k70_in.p00 = 0;
98
k70_in.p00 = 0;
Line 83... Line 99...
83
k70_in.p08 = 0;
99
//k70_in.p08 = 0;
84
k70_in.p12 = 4096;
100
k70_in.p12 = buf_size;
85
k70_in.p16 = (unsigned) buffer;
101
k70_in.p16 = (unsigned) buffer;
86
k70_in.p20 = 0;
102
k70_in.p20 = 0;
87
k70_in.p21 = filename_in;
103
k70_in.p21 = filename_in;
88
 
104
 
Line 89... Line 105...
89
k70_out.p00 = 2;
105
k70_out.p00 = 2;
-
 
106
//k70_out.p08 = 0;
90
k70_out.p08 = 0;
107
k70_out.p12 = buf_size;
-
 
108
k70_out.p16 = (unsigned) buffer;
91
k70_out.p12 = 4096;
109
k70_out.p20 = 0;
92
k70_out.p16 = (unsigned) buffer;
-
 
93
k70_out.p20 = 0;
-
 
94
k70_out.p21 = filename_out;
110
k70_out.p21 = filename_out;
95
 
-
 
96
i = 0; // ¤«ï ⮣®, çâ®¡ë ª®¯¨à®¢ âì ä ©«ë á à §¬¥à®¬ ¬¥­ìè¥ 4 ª ©â
-
 
97
for ( i = 0; i < n; i++)
-
 
98
    {
-
 
99
 
-
 
100
    k70_in.p04 = i*4096;
-
 
101
    result = kol_file_70(&k70_in); // ç⥭¨¥
-
 
102
    if (result != 0)
111
 
Line 103... Line -...
103
       {
-
 
104
       parameters_free(argc, argv);
-
 
105
       free(filename_in);
-
 
106
       free(filename_out);
-
 
107
       free(buffer);
-
 
108
       return FALSE;
-
 
109
       }
-
 
110
 
-
 
111
    k70_out.p04 = i*4096;
-
 
112
    result = kol_file_70(&k70_out); // § ¯¨áì
-
 
113
    if (result != 0)
-
 
114
       {
-
 
115
       parameters_free(argc, argv);
-
 
116
       free(filename_in);
-
 
117
       free(filename_out);
-
 
118
       free(buffer);
-
 
119
       return FALSE;
-
 
120
       }
-
 
121
 
-
 
122
    if (i == 0)
-
 
123
       k70_out.p00 = 3; // ¬¥­ï¥¬ äã­ªæ¨î á ᮧ¤ ­¨ï (2) ­  ¤®§ ¯¨áì (3)
-
 
124
 
-
 
125
    }
-
 
126
 
112
unsigned long long offset = 0;
127
if ( (filesize%4096) != 0 ) // ¥á«¨ à §¬¥à ä ©«  ­¥ ªà â¥­ 4 ª ©â ¬
113
do {
128
   {
-
 
129
 
-
 
130
   k70_in.p12  = filesize%4096;
-
 
131
   k70_out.p12 = filesize%4096;
-
 
132
 
114
    k70_in.p04 = offset;
133
   k70_in.p04 = i*4096; // ¢ i ¤®«¦­® ¡ëâì ¯à ¢¨«ì­®¥ ᬥ饭¨¥
-
 
134
   result = kol_file_70(&k70_in); // ç⥭¨¥
-
 
Line 135... Line 115...
135
   if (result != 0)
115
    if (offset + buf_size > filesize)  // last chunk
136
       {
116
		{
137
       parameters_free(argc, argv);
117
		k70_in.p12 = k70_out.p12 = (unsigned)(filesize - offset); // filesize % buf_size;
138
       free(filename_in);
-
 
139
       free(filename_out);
-
 
140
       free(buffer);
-
 
141
       return FALSE;
-
 
142
       }
118
		}
143
 
-
 
144
    k70_out.p04 = i*4096;
-
 
Line -... Line 119...
-
 
119
    
-
 
120
    result = kol_file_70(&k70_in); // ç⥭¨¥
145
    result = kol_file_70(&k70_out); // § ¯¨áì
121
    if (result != 0)
-
 
122
		goto lbl_exit;
Line -... Line 123...
-
 
123
 
Line 146... Line 124...
146
    if (result != 0)
124
    k70_out.p04 = offset;
147
       {
125
    result = kol_file_70(&k70_out); // § ¯¨áì
148
       parameters_free(argc, argv);
126
    if (result != 0)
149
       free(filename_in);
127
		goto lbl_exit;
Line 150... Line -...
150
       free(filename_out);
-
 
151
       free(buffer);
128
 
152
       return FALSE;
129
    if (k70_out.p00 == 2)