Subversion Repositories Kolibri OS

Rev

Rev 6826 | Rev 7802 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3245 Albom 1
 
2
{
3
4
 
5
int argc;
6
char *filename_in = NULL;
6857 siemargl 7
char *filename_out = NULL;
8
char *buffer = NULL;
9
3245 Albom 10
 
11
kol_struct70	k70_out;
12
13
 
14
15
 
6857 siemargl 16
unsigned result, buf_size;
17
3245 Albom 18
 
19
20
 
21
   {
22
      #if LANG_ENG
23
	printf("  cp  \n\r");
24
      #elif LANG_RUS
25
	printf("  cp <источник> <результат>\n\r");
26
      #endif
27
28
 
29
30
 
3247 Albom 31
   }
3245 Albom 32
33
 
6826 siemargl 34
filename_out = (char*) malloc(FILENAME_MAX);
35
3245 Albom 36
 
37
   {
38
   strcpy(filename_in, cur_dir);
39
   if (filename_in[strlen(filename_in)-1] != '/')
40
	strcat(filename_in, "/"); // add slash
41
   strcat(filename_in, argv[0]);
42
   }
43
   else
44
   {
45
   strcpy(filename_in, argv[0]);
46
   }
47
48
 
49
   {
50
   strcpy(filename_out, cur_dir);
51
   if (filename_out[strlen(filename_out)-1] != '/')
52
	strcat(filename_out, "/"); // add slash
53
   strcat(filename_out, argv[1]);
54
   }
55
   else
56
   {
57
   strcpy(filename_out, argv[1]);
58
   }
59
6857 siemargl 60
 
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
3245 Albom 69
 
70
 
71
k70_in.p04 = 0LL;
6857 siemargl 72
k70_in.p12 = 0;
73
k70_in.p16 = (unsigned) &bdvk;
3245 Albom 74
k70_in.p20 = 0;
75
k70_in.p21 = filename_in;
76
77
 
78
if ( 0 != result )
79
	goto lbl_exit;
6857 siemargl 80
3245 Albom 81
 
6857 siemargl 82
buf_size = 1 << 20; // 1Mb
83
while( ((buf_size >> 10) > kol_system_memfree()) && (buf_size > 4096) )
84
	buf_size /= 2;
85
3245 Albom 86
 
6857 siemargl 87
if (buf_size > filesize)
88
	buf_size = (unsigned)filesize;	// may be zero!
89
if (buf_size == 0) buf_size = 4096;	// ...
90
3245 Albom 91
 
6857 siemargl 92
if (!buffer)
93
	{
94
		result = E_NOMEM;
95
		goto lbl_exit;
96
	}
97
98
 
3245 Albom 99
//k70_in.p08 = 0;
6857 siemargl 100
k70_in.p12 = buf_size;
101
k70_in.p16 = (unsigned) buffer;
3245 Albom 102
k70_in.p20 = 0;
103
k70_in.p21 = filename_in;
104
105
 
106
//k70_out.p08 = 0;
6857 siemargl 107
k70_out.p12 = buf_size;
108
k70_out.p16 = (unsigned) buffer;
3245 Albom 109
k70_out.p20 = 0;
110
k70_out.p21 = filename_out;
111
112
 
6857 siemargl 113
do {
114
    k70_in.p04 = offset;
115
    if (offset + buf_size > filesize)  // last chunk
116
		{
117
		k70_in.p12 = k70_out.p12 = (unsigned)(filesize - offset); // filesize % buf_size;
118
		}
119
120
 
3245 Albom 121
    if (result != 0)
122
		goto lbl_exit;
6857 siemargl 123
3245 Albom 124
 
6857 siemargl 125
    result = kol_file_70(&k70_out); // запись
3245 Albom 126
    if (result != 0)
127
		goto lbl_exit;
6857 siemargl 128
3245 Albom 129
 
6857 siemargl 130
       k70_out.p00 = 3; // меняем функцию с создания (2) на дозапись (3)
3245 Albom 131
	offset += buf_size;
6857 siemargl 132
} while (offset < filesize);
133
3245 Albom 134
 
6857 siemargl 135
3245 Albom 136
 
137
free(filename_in);
138
free(filename_out);
139
free(buffer);
140
141
 
6857 siemargl 142
}
3245 Albom 143