Subversion Repositories Kolibri OS

Rev

Rev 6826 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. int cmd_cp(char param[])
  3. {
  4.  
  5. char* argv[100];
  6. int argc;
  7. char *filename_in = NULL;
  8. char *filename_out = NULL;
  9. char *buffer = NULL;
  10.  
  11. kol_struct70    k70_in;
  12. kol_struct70    k70_out;
  13.  
  14. kol_struct_BDVK bdvk;
  15.  
  16. unsigned long long filesize;
  17. unsigned result, buf_size;
  18.  
  19. argc = parameters_prepare(param, argv);
  20.  
  21. if (argc != 2)
  22.    {
  23.       #if LANG_ENG
  24.         printf("  cp <file_in> <file_out>\n\r");
  25.       #elif LANG_RUS
  26.         printf("  cp <источник> <результат>\n\r");
  27.       #endif
  28.  
  29.       parameters_free(argc, argv);
  30.  
  31.       return TRUE;
  32.    }
  33.  
  34. filename_in  = (char*) malloc(FILENAME_MAX);
  35. filename_out = (char*) malloc(FILENAME_MAX);
  36.  
  37. if (argv[0][0] != '/')
  38.    {
  39.    strcpy(filename_in, cur_dir);
  40.    if (filename_in[strlen(filename_in)-1] != '/')
  41.         strcat(filename_in, "/"); // add slash
  42.    strcat(filename_in, argv[0]);
  43.    }
  44.    else
  45.    {
  46.    strcpy(filename_in, argv[0]);
  47.    }
  48.  
  49. if (argv[1][0] != '/')
  50.    {
  51.    strcpy(filename_out, cur_dir);
  52.    if (filename_out[strlen(filename_out)-1] != '/')
  53.         strcat(filename_out, "/"); // add slash
  54.    strcat(filename_out, argv[1]);
  55.    }
  56.    else
  57.    {
  58.    strcpy(filename_out, argv[1]);
  59.    }
  60.    
  61. // add ability to use directory as destination
  62. if ( dir_check(filename_out) )
  63.         {
  64.                 char *fname = strrchr(filename_in, '/') + 1;  // always exist, as we add curdir
  65.                 if (filename_out[strlen(filename_out)-1] != '/')
  66.                         strcat(filename_out, "/"); // add slash
  67.                 strcat(filename_out, fname);
  68.         }
  69.  
  70.  
  71. k70_in.p00 = 5;
  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.  
  78. result = kol_file_70(&k70_in); // получаем информацию о файле
  79. if ( 0 != result )
  80.         goto lbl_exit;
  81.  
  82. // count buffer size up to 1Mb, but no more than 1/2 of free memory
  83. buf_size = 1 << 20; // 1Mb
  84. while( ((buf_size >> 10) > kol_system_memfree()) && (buf_size > 4096) )
  85.         buf_size /= 2;
  86.  
  87. filesize = bdvk.p32; // получаем размер файла(ограничение - 4 Гбайта только для FAT)
  88. if (buf_size > filesize)
  89.         buf_size = (unsigned)filesize;  // may be zero!
  90. if (buf_size == 0) buf_size = 4096;     // ...
  91.  
  92. buffer = (char*) malloc(buf_size);
  93. if (!buffer)
  94.         {
  95.                 result = E_NOMEM;
  96.                 goto lbl_exit;
  97.         }
  98.  
  99. k70_in.p00 = 0;
  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.  
  106. k70_out.p00 = 2;
  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.  
  113. unsigned long long offset = 0;
  114. do {
  115.     k70_in.p04 = offset;
  116.     if (offset + buf_size > filesize)  // last chunk
  117.                 {
  118.                 k70_in.p12 = k70_out.p12 = (unsigned)(filesize - offset); // filesize % buf_size;
  119.                 }
  120.    
  121.     result = kol_file_70(&k70_in); // чтение
  122.     if (result != 0)
  123.                 goto lbl_exit;
  124.  
  125.     k70_out.p04 = offset;
  126.     result = kol_file_70(&k70_out); // запись
  127.     if (result != 0)
  128.                 goto lbl_exit;
  129.  
  130.     if (k70_out.p00 == 2)
  131.        k70_out.p00 = 3; // меняем функцию с создания (2) на дозапись (3)
  132.         offset += buf_size;
  133. } while (offset < filesize);
  134.  
  135. lbl_exit:
  136.  
  137. parameters_free(argc, argv);
  138. free(filename_in);
  139. free(filename_out);
  140. free(buffer);
  141.  
  142. return (result == 0);
  143. }
  144.  
  145.