Subversion Repositories Kolibri OS

Rev

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