Ignore:
File:
1 edited

Legend:

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

    r582a0b8 rdd8ab1c  
    2828
    2929#include <errno.h>
     30#include <str_error.h>
    3031#include <stdio.h>
    3132#include <stdlib.h>
     
    6667} dentry_type_t;
    6768
    68 static int64_t copy_file(const char *src, const char *dest,
     69static int copy_file(const char *src, const char *dest,
    6970    size_t blen, int vb);
    7071
     
    175176}
    176177
    177 static int64_t do_copy(const char *src, const char *dest,
     178static int do_copy(const char *src, const char *dest,
    178179    size_t blen, int vb, int recursive, int force, int interactive)
    179180{
    180         int r = -1;
     181        int rc = EOK;
    181182        char dest_path[PATH_MAX];
    182183        char src_path[PATH_MAX];
     
    217218                                printf("The dest directory %s does not exists",
    218219                                    dest_path);
     220                                rc = ENOENT;
    219221                                goto exit;
    220222                        }
     
    224226                        printf("Cannot overwrite existing directory %s\n",
    225227                            dest_path);
     228                        rc = EEXIST;
    226229                        goto exit;
    227230                } else if (dest_type == TYPE_FILE) {
     
    233236                         */
    234237                        if (force && !interactive) {
    235                                 if (vfs_unlink_path(dest_path) != EOK) {
     238                                rc = vfs_unlink_path(dest_path);
     239                                if (rc != EOK) {
    236240                                        printf("Unable to remove %s\n",
    237241                                            dest_path);
     
    244248                                if (overwrite) {
    245249                                        printf("Overwriting file: %s\n", dest_path);
    246                                         if (vfs_unlink_path(dest_path) != EOK) {
     250                                        rc = vfs_unlink_path(dest_path);
     251                                        if (rc != EOK) {
    247252                                                printf("Unable to remove %s\n", dest_path);
    248253                                                goto exit;
     
    250255                                } else {
    251256                                        printf("Not overwriting file: %s\n", dest_path);
    252                                         r = 0;
     257                                        rc = EOK;
    253258                                        goto exit;
    254259                                }
    255260                        } else {
    256261                                printf("File already exists: %s\n", dest_path);
     262                                rc = EEXIST;
    257263                                goto exit;
    258264                        }
     
    260266
    261267                /* call copy_file and exit */
    262                 r = (copy_file(src, dest_path, blen, vb) < 0);
     268                rc = (copy_file(src, dest_path, blen, vb) < 0);
    263269
    264270        } else if (src_type == TYPE_DIR) {
     
    268274                        printf("Cannot copy the %s directory without the "
    269275                            "-r option\n", src);
     276                        rc = EINVAL;
    270277                        goto exit;
    271278                } else if (dest_type == TYPE_FILE) {
    272279                        printf("Cannot overwrite a file with a directory\n");
     280                        rc = EEXIST;
    273281                        goto exit;
    274282                }
     
    293301                                merge_paths(dest_path, PATH_MAX, src_dirname);
    294302
    295                                 if (vfs_link_path(dest_path, KIND_DIRECTORY,
    296                                     NULL) != EOK) {
     303                                rc = vfs_link_path(dest_path, KIND_DIRECTORY,
     304                                    NULL);
     305                                if (rc != EOK) {
    297306                                        printf("Unable to create "
    298307                                            "dest directory %s\n", dest_path);
     
    308317                         * e.g. cp -r /src /data/new_dir_src
    309318                         */
    310                         if (vfs_link_path(dest_path, KIND_DIRECTORY,
    311                             NULL) != EOK) {
     319                        rc = vfs_link_path(dest_path, KIND_DIRECTORY, NULL);
     320                        if (rc != EOK) {
    312321                                printf("Unable to create "
    313322                                    "dest directory %s\n", dest_path);
     
    321330                        /* Something strange is happening... */
    322331                        printf("Unable to open src %s directory\n", src);
     332                        rc = ENOENT;
    323333                        goto exit;
    324334                }
     
    348358                                printf("Cannot copy a directory "
    349359                                    "into itself\n");
     360                                rc = EEXIST;
    350361                                goto exit;
    351362                        }
     
    355366
    356367                        /* Recursively call do_copy() */
    357                         r = do_copy(src_dent, dest_dent, blen, vb, recursive,
     368                        rc = do_copy(src_dent, dest_dent, blen, vb, recursive,
    358369                            force, interactive);
    359                         if (r)
     370                        if (rc != EOK)
    360371                                goto exit;
    361372
     
    367378        if (dir)
    368379                closedir(dir);
    369         return r;
    370 }
    371 
    372 static int64_t copy_file(const char *src, const char *dest,
     380        return rc;
     381}
     382
     383static int copy_file(const char *src, const char *dest,
    373384        size_t blen, int vb)
    374385{
    375         int fd1, fd2, bytes;
     386        int fd1, fd2;
     387        size_t rbytes, wbytes;
     388        int rc;
    376389        off64_t total;
    377         int64_t copied = 0;
    378390        char *buff = NULL;
    379391        aoff64_t posr = 0, posw = 0;
     
    383395                printf("Copying %s to %s\n", src, dest);
    384396
    385         fd1 = vfs_lookup_open(src, WALK_REGULAR, MODE_READ);
    386         if (fd1 < 0) {
     397        rc = vfs_lookup_open(src, WALK_REGULAR, MODE_READ, &fd1);
     398        if (rc != EOK) {
    387399                printf("Unable to open source file %s\n", src);
    388400                return -1;
    389401        }
    390402
    391         fd2 = vfs_lookup_open(dest, WALK_REGULAR | WALK_MAY_CREATE, MODE_WRITE);
    392         if (fd2 < 0) {
     403        rc = vfs_lookup_open(dest, WALK_REGULAR | WALK_MAY_CREATE, MODE_WRITE, &fd2);
     404        if (rc != EOK) {
    393405                printf("Unable to open destination file %s\n", dest);
    394406                vfs_put(fd1);
     
    410422                printf("Unable to allocate enough memory to read %s\n",
    411423                    src);
    412                 copied = -1;
     424                rc = ENOMEM;
    413425                goto out;
    414426        }
    415427
    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;
     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;
    425437        }
    426438
     
    430442        if (buff)
    431443                free(buff);
    432         return copied;
     444        return rc;
    433445}
    434446
Note: See TracChangeset for help on using the changeset viewer.