Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/futil/src/futil.c

    r04e520e r629b480  
    11/*
    2  * Copyright (c) 2024 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4747static char buf[BUF_SIZE];
    4848
     49/** Create file utility instance.
     50 *
     51 * @param cb Callback functions
     52 * @param arg Argument to callback functions
     53 * @param rfutil Place to store pointer to new file utility instance
     54 * @return EOK on succcess, ENOMEM if out of memory.
     55 */
     56errno_t futil_create(futil_cb_t *cb, void *arg, futil_t **rfutil)
     57{
     58        futil_t *futil;
     59
     60        futil = calloc(1, sizeof(futil_t));
     61        if (futil == NULL)
     62                return ENOMEM;
     63
     64        futil->cb = cb;
     65        futil->cb_arg = arg;
     66        *rfutil = futil;
     67        return EOK;
     68}
     69
     70/** Destroy file utility instance.
     71 *
     72 * @param futil File utility instance
     73 */
     74void futil_destroy(futil_t *futil)
     75{
     76        free(futil);
     77}
     78
    4979/** Copy file.
    5080 *
     81 * @param futil File utility instance
    5182 * @param srcp Source path
    5283 * @param dstp Destination path
     
    5485 * @return EOK on success, EIO on I/O error
    5586 */
    56 errno_t futil_copy_file(const char *srcp, const char *destp)
     87errno_t futil_copy_file(futil_t *futil, const char *srcp, const char *destp)
    5788{
    5889        int sf, df;
     
    6192        aoff64_t posr = 0, posw = 0;
    6293
    63         printf("Copy '%s' to '%s'.\n", srcp, destp);
     94        if (futil->cb != NULL && futil->cb->copy_file != NULL)
     95                futil->cb->copy_file(futil->cb_arg, srcp, destp);
    6496
    6597        rc = vfs_lookup_open(srcp, WALK_REGULAR, MODE_READ, &sf);
     
    6799                return EIO;
    68100
    69         rc = vfs_lookup_open(destp, WALK_REGULAR | WALK_MAY_CREATE, MODE_WRITE, &df);
    70         if (rc != EOK)
    71                 return EIO;
     101        rc = vfs_lookup_open(destp, WALK_REGULAR | WALK_MAY_CREATE, MODE_WRITE,
     102            &df);
     103        if (rc != EOK) {
     104                vfs_put(sf);
     105                return EIO;
     106        }
    72107
    73108        do {
     
    99134/** Copy contents of srcdir (recursively) into destdir.
    100135 *
     136 * @param futil File utility instance
    101137 * @param srcdir Source directory
    102138 * @param destdir Destination directory
     
    104140 * @return EOK on success, ENOMEM if out of memory, EIO on I/O error
    105141 */
    106 errno_t futil_rcopy_contents(const char *srcdir, const char *destdir)
     142errno_t futil_rcopy_contents(futil_t *futil, const char *srcdir,
     143    const char *destdir)
    107144{
    108145        DIR *dir;
     
    118155        de = readdir(dir);
    119156        while (de != NULL) {
    120                 if (asprintf(&srcp, "%s/%s", srcdir, de->d_name) < 0)
    121                         return ENOMEM;
    122                 if (asprintf(&destp, "%s/%s", destdir, de->d_name) < 0)
    123                         return ENOMEM;
     157                if (asprintf(&srcp, "%s/%s", srcdir, de->d_name) < 0) {
     158                        rc = ENOMEM;
     159                        goto error;
     160                }
     161
     162                if (asprintf(&destp, "%s/%s", destdir, de->d_name) < 0) {
     163                        rc = ENOMEM;
     164                        goto error;
     165                }
    124166
    125167                rc = vfs_stat_path(srcp, &s);
    126168                if (rc != EOK)
    127                         return EIO;
     169                        goto error;
    128170
    129171                if (s.is_file) {
    130                         rc = futil_copy_file(srcp, destp);
    131                         if (rc != EOK)
    132                                 return EIO;
     172                        rc = futil_copy_file(futil, srcp, destp);
     173                        if (rc != EOK) {
     174                                rc = EIO;
     175                                goto error;
     176                        }
    133177                } else if (s.is_directory) {
    134                         printf("Create directory '%s'\n", destp);
     178                        if (futil->cb != NULL && futil->cb->create_dir != NULL)
     179                                futil->cb->create_dir(futil->cb_arg, destp);
    135180                        rc = vfs_link_path(destp, KIND_DIRECTORY, NULL);
    136181                        if (rc != EOK)
    137                                 return EIO;
    138                         rc = futil_rcopy_contents(srcp, destp);
     182                                goto error;
     183                        rc = futil_rcopy_contents(futil, srcp, destp);
    139184                        if (rc != EOK)
    140                                 return EIO;
     185                                goto error;
    141186                } else {
    142                         return EIO;
     187                        rc = EIO;
     188                        goto error;
    143189                }
    144190
     
    146192        }
    147193
    148         return EOK;
     194        closedir(dir);
     195        return EOK;
     196error:
     197        closedir(dir);
     198        return rc;
    149199}
    150200
    151201/** Return file contents as a heap-allocated block of bytes.
    152202 *
     203 * @param futil File utility instance
    153204 * @param srcp File path
    154205 * @param rdata Place to store pointer to data
     
    158209 *         I/O error, ENOMEM if out of memory
    159210 */
    160 errno_t futil_get_file(const char *srcp, void **rdata, size_t *rsize)
     211errno_t futil_get_file(futil_t *futil, const char *srcp, void **rdata,
     212    size_t *rsize)
    161213{
    162214        int sf;
Note: See TracChangeset for help on using the changeset viewer.