Changeset 0cf3d5f in mainline for uspace/lib


Ignore:
Timestamp:
2025-10-10T08:45:43Z (3 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
c3db721
Parents:
cfd04c4
git-author:
Jiri Svoboda <jiri@…> (2025-10-09 18:45:33)
git-committer:
Jiri Svoboda <jiri@…> (2025-10-10 08:45:43)
Message:

Allow creating sparse files in Navigator and newfile.

Location:
uspace/lib/fmgt
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/fmgt/include/fmgt.h

    rcfd04c4 r0cf3d5f  
    4949extern void fmgt_set_init_update(fmgt_t *, bool);
    5050extern errno_t fmgt_new_file_suggest(char **);
    51 extern errno_t fmgt_new_file(fmgt_t *, const char *, uint64_t);
     51extern errno_t fmgt_new_file(fmgt_t *, const char *, uint64_t, fmgt_nf_flags_t);
    5252
    5353#endif
  • uspace/lib/fmgt/include/types/fmgt.h

    rcfd04c4 r0cf3d5f  
    7575} fmgt_t;
    7676
     77/** New file flags. */
     78typedef enum {
     79        nf_none = 0x0,
     80        nf_sparse = 0x1
     81} fmgt_nf_flags_t;
     82
    7783#endif
    7884
  • uspace/lib/fmgt/src/fmgt.c

    rcfd04c4 r0cf3d5f  
    226226 * @param fname File name
    227227 * @param fsize Size of new file (number of zero bytes to fill in)
     228 * @param flags New file flags
    228229 * @return EOK on success or an error code
    229230 */
    230 errno_t fmgt_new_file(fmgt_t *fmgt, const char *fname, uint64_t fsize)
     231errno_t fmgt_new_file(fmgt_t *fmgt, const char *fname, uint64_t fsize,
     232    fmgt_nf_flags_t flags)
    231233{
    232234        int fd;
     
    254256
    255257        fmgt_initial_progress_update(fmgt);
     258
     259        if ((flags & nf_sparse) != 0) {
     260                fmgt->curf_procb = fsize - 1;
     261                pos = fsize - 1;
     262        }
    256263
    257264        while (fmgt->curf_procb < fsize) {
  • uspace/lib/fmgt/test/fmgt.c

    rcfd04c4 r0cf3d5f  
    116116        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    117117
    118         rc = fmgt_new_file(fmgt, fname, 0);
     118        rc = fmgt_new_file(fmgt, fname, 0, nf_none);
    119119        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    120120
     
    150150        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    151151
    152         rc = fmgt_new_file(fmgt, fname, 20000);
     152        rc = fmgt_new_file(fmgt, fname, 20000, nf_none);
    153153        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    154154
     
    177177}
    178178
    179 /** Initial update provided when requested while creating new file. */
    180 PCUT_TEST(new_file_init_upd)
     179/** New sparse file can be created. */
     180PCUT_TEST(new_file_sparse)
    181181{
    182182        FILE *f = NULL;
     
    188188        size_t total_rd;
    189189        size_t i;
    190         test_resp_t resp;
    191         int rv;
    192 
    193         rc = vfs_cwd_set(TEMP_DIR);
    194         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    195 
    196         rc = fmgt_create(&fmgt);
    197         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    198 
    199         fmgt_set_cb(fmgt, &test_fmgt_cb, (void *)&resp);
    200         resp.nupdates = 0;
    201 
    202         fmgt_set_init_update(fmgt, true);
    203 
    204         /* Suggest unique file name. */
    205         rc = fmgt_new_file_suggest(&fname);
    206         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    207 
    208         rc = fmgt_new_file(fmgt, fname, 20000);
     190        int rv;
     191
     192        rc = vfs_cwd_set(TEMP_DIR);
     193        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     194
     195        rc = fmgt_create(&fmgt);
     196        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     197
     198        /* Suggest unique file name. */
     199        rc = fmgt_new_file_suggest(&fname);
     200        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     201
     202        rc = fmgt_new_file(fmgt, fname, 20000, nf_sparse);
    209203        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    210204
     
    225219        (void)fclose(f);
    226220
     221        /* Remove the file. */
     222        rv = remove(fname);
     223        PCUT_ASSERT_INT_EQUALS(0, rv);
     224
     225        free(fname);
     226        fmgt_destroy(fmgt);
     227}
     228
     229/** Initial update provided when requested while creating new file. */
     230PCUT_TEST(new_file_init_upd)
     231{
     232        FILE *f = NULL;
     233        fmgt_t *fmgt = NULL;
     234        char *fname = NULL;
     235        char buf[128];
     236        errno_t rc;
     237        size_t nr;
     238        size_t total_rd;
     239        size_t i;
     240        test_resp_t resp;
     241        int rv;
     242
     243        rc = vfs_cwd_set(TEMP_DIR);
     244        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     245
     246        rc = fmgt_create(&fmgt);
     247        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     248
     249        fmgt_set_cb(fmgt, &test_fmgt_cb, (void *)&resp);
     250        resp.nupdates = 0;
     251
     252        fmgt_set_init_update(fmgt, true);
     253
     254        /* Suggest unique file name. */
     255        rc = fmgt_new_file_suggest(&fname);
     256        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     257
     258        rc = fmgt_new_file(fmgt, fname, 20000, nf_none);
     259        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     260
     261        /* Verify the file. */
     262        f = fopen(fname, "rb");
     263        PCUT_ASSERT_NOT_NULL(f);
     264        total_rd = 0;
     265        do {
     266                nr = fread(buf, 1, sizeof(buf), f);
     267                for (i = 0; i < nr; i++)
     268                        PCUT_ASSERT_INT_EQUALS(0, buf[i]);
     269
     270                total_rd += nr;
     271        } while (nr > 0);
     272
     273        PCUT_ASSERT_INT_EQUALS(20000, total_rd);
     274
     275        (void)fclose(f);
     276
    227277        PCUT_ASSERT_TRUE(resp.nupdates > 0);
    228278
Note: See TracChangeset for help on using the changeset viewer.