Ignore:
File:
1 edited

Legend:

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

    r5df2570 r629b480  
    11/*
    2  * Copyright (c) 2026 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    179179                                futil->cb->create_dir(futil->cb_arg, destp);
    180180                        rc = vfs_link_path(destp, KIND_DIRECTORY, NULL);
    181                         if (rc != EOK && rc != EEXIST)
     181                        if (rc != EOK)
    182182                                goto error;
    183183                        rc = futil_rcopy_contents(futil, srcp, destp);
     
    199199}
    200200
     201/** Return file contents as a heap-allocated block of bytes.
     202 *
     203 * @param futil File utility instance
     204 * @param srcp File path
     205 * @param rdata Place to store pointer to data
     206 * @param rsize Place to store size of data
     207 *
     208 * @return EOK on success, ENOENT if failed to open file, EIO on other
     209 *         I/O error, ENOMEM if out of memory
     210 */
     211errno_t futil_get_file(futil_t *futil, const char *srcp, void **rdata,
     212    size_t *rsize)
     213{
     214        int sf;
     215        size_t nr;
     216        errno_t rc;
     217        size_t fsize;
     218        char *data;
     219        vfs_stat_t st;
     220
     221        rc = vfs_lookup_open(srcp, WALK_REGULAR, MODE_READ, &sf);
     222        if (rc != EOK)
     223                return ENOENT;
     224
     225        if (vfs_stat(sf, &st) != EOK) {
     226                vfs_put(sf);
     227                return EIO;
     228        }
     229
     230        fsize = st.size;
     231
     232        data = calloc(fsize, 1);
     233        if (data == NULL) {
     234                vfs_put(sf);
     235                return ENOMEM;
     236        }
     237
     238        rc = vfs_read(sf, (aoff64_t []) { 0 }, data, fsize, &nr);
     239        if (rc != EOK || nr != fsize) {
     240                vfs_put(sf);
     241                free(data);
     242                return EIO;
     243        }
     244
     245        (void) vfs_put(sf);
     246        *rdata = data;
     247        *rsize = fsize;
     248
     249        return EOK;
     250}
     251
    201252/** @}
    202253 */
Note: See TracChangeset for help on using the changeset viewer.