Subversion Repositories Kolibri OS

Rev

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