Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/bdsh/cmds/modules/cp/cp.c

    rdd8ab1c r582a0b8  
    2828
    2929#include <errno.h>
    30 #include <str_error.h>
    3130#include <stdio.h>
    3231#include <stdlib.h>
     
    6766} dentry_type_t;
    6867
    69 static int copy_file(const char *src, const char *dest,
     68static int64_t copy_file(const char *src, const char *dest,
    7069    size_t blen, int vb);
    7170
     
    176175}
    177176
    178 static int do_copy(const char *src, const char *dest,
     177static int64_t do_copy(const char *src, const char *dest,
    179178    size_t blen, int vb, int recursive, int force, int interactive)
    180179{
    181         int rc = EOK;
     180        int r = -1;
    182181        char dest_path[PATH_MAX];
    183182        char src_path[PATH_MAX];
     
    218217                                printf("The dest directory %s does not exists",
    219218                                    dest_path);
    220                                 rc = ENOENT;
    221219                                goto exit;
    222220                        }
     
    226224                        printf("Cannot overwrite existing directory %s\n",
    227225                            dest_path);
    228                         rc = EEXIST;
    229226                        goto exit;
    230227                } else if (dest_type == TYPE_FILE) {
     
    236233                         */
    237234                        if (force && !interactive) {
    238                                 rc = vfs_unlink_path(dest_path);
    239                                 if (rc != EOK) {
     235                                if (vfs_unlink_path(dest_path) != EOK) {
    240236                                        printf("Unable to remove %s\n",
    241237                                            dest_path);
     
    248244                                if (overwrite) {
    249245                                        printf("Overwriting file: %s\n", dest_path);
    250                                         rc = vfs_unlink_path(dest_path);
    251                                         if (rc != EOK) {
     246                                        if (vfs_unlink_path(dest_path) != EOK) {
    252247                                                printf("Unable to remove %s\n", dest_path);
    253248                                                goto exit;
     
    255250                                } else {
    256251                                        printf("Not overwriting file: %s\n", dest_path);
    257                                         rc = EOK;
     252                                        r = 0;
    258253                                        goto exit;
    259254                                }
    260255                        } else {
    261256                                printf("File already exists: %s\n", dest_path);
    262                                 rc = EEXIST;
    263257                                goto exit;
    264258                        }
     
    266260
    267261                /* call copy_file and exit */
    268                 rc = (copy_file(src, dest_path, blen, vb) < 0);
     262                r = (copy_file(src, dest_path, blen, vb) < 0);
    269263
    270264        } else if (src_type == TYPE_DIR) {
     
    274268                        printf("Cannot copy the %s directory without the "
    275269                            "-r option\n", src);
    276                         rc = EINVAL;
    277270                        goto exit;
    278271                } else if (dest_type == TYPE_FILE) {
    279272                        printf("Cannot overwrite a file with a directory\n");
    280                         rc = EEXIST;
    281273                        goto exit;
    282274                }
     
    301293                                merge_paths(dest_path, PATH_MAX, src_dirname);
    302294
    303                                 rc = vfs_link_path(dest_path, KIND_DIRECTORY,
    304                                     NULL);
    305                                 if (rc != EOK) {
     295                                if (vfs_link_path(dest_path, KIND_DIRECTORY,
     296                                    NULL) != EOK) {
    306297                                        printf("Unable to create "
    307298                                            "dest directory %s\n", dest_path);
     
    317308                         * e.g. cp -r /src /data/new_dir_src
    318309                         */
    319                         rc = vfs_link_path(dest_path, KIND_DIRECTORY, NULL);
    320                         if (rc != EOK) {
     310                        if (vfs_link_path(dest_path, KIND_DIRECTORY,
     311                            NULL) != EOK) {
    321312                                printf("Unable to create "
    322313                                    "dest directory %s\n", dest_path);
     
    330321                        /* Something strange is happening... */
    331322                        printf("Unable to open src %s directory\n", src);
    332                         rc = ENOENT;
    333323                        goto exit;
    334324                }
     
    358348                                printf("Cannot copy a directory "
    359349                                    "into itself\n");
    360                                 rc = EEXIST;
    361350                                goto exit;
    362351                        }
     
    366355
    367356                        /* Recursively call do_copy() */
    368                         rc = do_copy(src_dent, dest_dent, blen, vb, recursive,
     357                        r = do_copy(src_dent, dest_dent, blen, vb, recursive,
    369358                            force, interactive);
    370                         if (rc != EOK)
     359                        if (r)
    371360                                goto exit;
    372361
     
    378367        if (dir)
    379368                closedir(dir);
    380         return rc;
    381 }
    382 
    383 static int copy_file(const char *src, const char *dest,
     369        return r;
     370}
     371
     372static int64_t copy_file(const char *src, const char *dest,
    384373        size_t blen, int vb)
    385374{
    386         int fd1, fd2;
    387         size_t rbytes, wbytes;
    388         int rc;
     375        int fd1, fd2, bytes;
    389376        off64_t total;
     377        int64_t copied = 0;
    390378        char *buff = NULL;
    391379        aoff64_t posr = 0, posw = 0;
     
    395383                printf("Copying %s to %s\n", src, dest);
    396384
    397         rc = vfs_lookup_open(src, WALK_REGULAR, MODE_READ, &fd1);
    398         if (rc != EOK) {
     385        fd1 = vfs_lookup_open(src, WALK_REGULAR, MODE_READ);
     386        if (fd1 < 0) {
    399387                printf("Unable to open source file %s\n", src);
    400388                return -1;
    401389        }
    402390
    403         rc = vfs_lookup_open(dest, WALK_REGULAR | WALK_MAY_CREATE, MODE_WRITE, &fd2);
    404         if (rc != EOK) {
     391        fd2 = vfs_lookup_open(dest, WALK_REGULAR | WALK_MAY_CREATE, MODE_WRITE);
     392        if (fd2 < 0) {
    405393                printf("Unable to open destination file %s\n", dest);
    406394                vfs_put(fd1);
     
    422410                printf("Unable to allocate enough memory to read %s\n",
    423411                    src);
    424                 rc = ENOMEM;
     412                copied = -1;
    425413                goto out;
    426414        }
    427415
    428         while ((rc = vfs_read(fd1, &posr, buff, blen, &rbytes)) == EOK &&
    429             rbytes > 0) {
    430                 if ((rc = vfs_write(fd2, &posw, buff, rbytes, &wbytes)) != EOK)
    431                         break;
    432         }
    433 
    434         if (rc != EOK) {
    435                 printf("\nError copying %s: %s\n", src, str_error(rc));
    436                 return rc;
     416        while ((bytes = vfs_read(fd1, &posr, buff, blen)) > 0) {
     417                if ((bytes = vfs_write(fd2, &posw, buff, bytes)) < 0)
     418                        break;
     419                copied += bytes;
     420        }
     421
     422        if (bytes < 0) {
     423                printf("\nError copying %s, (%d)\n", src, bytes);
     424                copied = bytes;
    437425        }
    438426
     
    442430        if (buff)
    443431                free(buff);
    444         return rc;
     432        return copied;
    445433}
    446434
Note: See TracChangeset for help on using the changeset viewer.