Subversion Repositories Kolibri OS

Rev

Rev 7802 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7802 rgimad 1
 
2
{
3
    char* argv[100];
4
    int argc;
5
    char *filename_in = NULL;
6
    char *filename_out = NULL;
7
    char *buffer = NULL;
8
9
 
10
    kol_struct70 k70_out;
11
12
 
13
14
 
15
    unsigned result, buf_size;
16
17
 
18
19
 
20
	argv[0] - path (abs or rel) to file
21
	argv[1] - new location: path (abs or rel) to dir or file
22
    */
23
24
 
25
    {
26
        printf(CMD_MV_USAGE);
8827 rgimad 27
        parameters_free(argc, argv);
7802 rgimad 28
        return TRUE;
29
    }
30
31
 
32
    filename_out = (char*) malloc(FILENAME_MAX);
33
34
 
35
    {
36
        strcpy(filename_in, cur_dir);
37
        if (filename_in[strlen(filename_in)-1] != '/')
38
        {
39
            strcat(filename_in, "/"); // add slash
40
        }
41
        strcat(filename_in, argv[0]);
42
    } else
43
    {
44
        strcpy(filename_in, argv[0]);
45
    }
46
    // -----
47
    if (argv[1][0] != '/')
48
    {
49
        strcpy(filename_out, cur_dir);
50
        if (filename_out[strlen(filename_out)-1] != '/')
51
        {
52
            strcat(filename_out, "/"); // add slash
53
        }
54
        strcat(filename_out, argv[1]);
55
    } else
56
    {
57
        strcpy(filename_out, argv[1]);
58
    }
59
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
        {
66
            strcat(filename_out, "/"); // add slash
67
        }
68
        strcat(filename_out, fname);
69
    }
70
71
 
72
    {
73
    	result = 0;
74
    	goto lbl_exit;
75
    }
76
77
 
78
 
79
    k70_in.p04 = 0LL;
80
    k70_in.p12 = 0;
81
    k70_in.p16 = (unsigned) &bdvk;
82
    k70_in.p20 = 0;
83
    k70_in.p21 = filename_in;
84
85
 
86
    if ( 0 != result )
87
    	goto lbl_exit;
88
89
 
90
    buf_size = 1 << 20; // 1Mb
91
    while( ((buf_size >> 10) > kol_system_memfree()) && (buf_size > 4096) )
92
    	buf_size /= 2;
93
94
 
95
    if (buf_size > filesize)
96
    	buf_size = (unsigned)filesize;	// may be zero!
97
    if (buf_size == 0) buf_size = 4096;	// ...
98
99
 
100
    if (!buffer)
101
    {
102
        result = E_NOMEM;
103
        goto lbl_exit;
104
    }
105
106
 
107
    //k70_in.p08 = 0;
108
    k70_in.p12 = buf_size;
109
    k70_in.p16 = (unsigned) buffer;
110
    k70_in.p20 = 0;
111
    k70_in.p21 = filename_in;
112
113
 
114
    //k70_out.p08 = 0;
115
    k70_out.p12 = buf_size;
116
    k70_out.p16 = (unsigned) buffer;
117
    k70_out.p20 = 0;
118
    k70_out.p21 = filename_out;
119
120
 
121
    do
122
    {
123
        k70_in.p04 = offset;
124
        if (offset + buf_size > filesize)  // last chunk
125
        {
126
            k70_in.p12 = k70_out.p12 = (unsigned)(filesize - offset); // filesize % buf_size;
127
        }
128
129
 
130
        if (result != 0)
131
        {
132
            goto lbl_exit;
133
        }
134
135
 
136
        result = kol_file_70(&k70_out); // write
137
        if (result != 0)
138
        {
139
           goto lbl_exit;
140
        }
141
142
 
143
        {
144
            k70_out.p00 = 3; // changing function from create (2) to append (3)
145
        }
146
        offset += buf_size;
147
    } while (offset < filesize);
148
149
 
150
151
 
152
153
 
154
    free(filename_in);
155
    free(filename_out);
156
    free(buffer);
157
158
 
159
}
160