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) |