Changeset 0cf3d5f in mainline for uspace


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
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/nav/dlg/newfiledlg.c

    rcfd04c4 r0cf3d5f  
    3737#include <fmgt.h>
    3838#include <mem.h>
     39#include <stdbool.h>
    3940#include <stdlib.h>
    4041#include <ui/entry.h>
     
    8182        ui_label_t *label = NULL;
    8283        ui_entry_t *entry = NULL;
     84        ui_checkbox_t *checkbox = NULL;
    8385        ui_pbutton_t *bok = NULL;
    8486        ui_pbutton_t *bcancel = NULL;
     
    101103                wparams.rect.p0.y = 0;
    102104                wparams.rect.p1.x = 40;
    103                 wparams.rect.p1.y = 11;
     105                wparams.rect.p1.y = 13;
    104106        } else {
    105107                wparams.rect.p0.x = 0;
    106108                wparams.rect.p0.y = 0;
    107109                wparams.rect.p1.x = 300;
    108                 wparams.rect.p1.y = 135;
     110                wparams.rect.p1.y = 155;
    109111        }
    110112
     
    234236        entry = NULL;
    235237
     238        rc = ui_checkbox_create(ui_res, "Sparse", &checkbox);
     239        if (rc != EOK)
     240                goto error;
     241
     242        /* FIXME: Auto layout */
     243        if (ui_is_textmode(ui)) {
     244                rect.p0.x = 3;
     245                rect.p0.y = 8;
     246                rect.p1.x = 17;
     247                rect.p1.y = 9;
     248        } else {
     249                rect.p0.x = 10;
     250                rect.p0.y = 100;
     251                rect.p1.x = 190;
     252                rect.p1.y = 120;
     253        }
     254
     255        ui_checkbox_set_rect(checkbox, &rect);
     256
     257        rc = ui_fixed_add(fixed, ui_checkbox_ctl(checkbox));
     258        if (rc != EOK)
     259                goto error;
     260
     261        dialog->sparse = checkbox;
     262        checkbox = NULL;
     263
    236264        rc = ui_pbutton_create(ui_res, "OK", &bok);
    237265        if (rc != EOK)
     
    243271        if (ui_is_textmode(ui)) {
    244272                rect.p0.x = 10;
    245                 rect.p0.y = 8;
     273                rect.p0.y = 10;
    246274                rect.p1.x = 20;
    247                 rect.p1.y = 9;
     275                rect.p1.y = 11;
    248276        } else {
    249277                rect.p0.x = 55;
    250                 rect.p0.y = 90;
     278                rect.p0.y = 120;
    251279                rect.p1.x = 145;
    252                 rect.p1.y = 118;
     280                rect.p1.y = 148;
    253281        }
    254282
     
    273301        if (ui_is_textmode(ui)) {
    274302                rect.p0.x = 22;
    275                 rect.p0.y = 8;
     303                rect.p0.y = 10;
    276304                rect.p1.x = 32;
    277                 rect.p1.y = 9;
     305                rect.p1.y = 11;
    278306        } else {
    279307                rect.p0.x = 155;
    280                 rect.p0.y = 90;
     308                rect.p0.y = 120;
    281309                rect.p1.x = 245;
    282                 rect.p1.y = 118;
     310                rect.p1.y = 148;
    283311        }
    284312
     
    307335        if (entry != NULL)
    308336                ui_entry_destroy(entry);
     337        if (checkbox != NULL)
     338                ui_checkbox_destroy(checkbox);
    309339        if (bok != NULL)
    310340                ui_pbutton_destroy(bok);
     
    375405        const char *fname;
    376406        const char *fsize;
     407        bool sparse;
    377408
    378409        if (event->type == KEY_PRESS &&
     
    383414                                fname = ui_entry_get_text(dialog->ename);
    384415                                fsize = ui_entry_get_text(dialog->esize);
     416                                sparse =
     417                                    ui_checkbox_get_checked(dialog->sparse);
    385418                                dialog->cb->bok(dialog, dialog->arg, fname,
    386                                     fsize);
     419                                    fsize, sparse);
    387420                                return;
    388421                        }
     
    409442        const char *fname;
    410443        const char *fsize;
     444        bool sparse;
    411445
    412446        if (dialog->cb != NULL && dialog->cb->bok != NULL) {
    413447                fname = ui_entry_get_text(dialog->ename);
    414448                fsize = ui_entry_get_text(dialog->esize);
    415                 dialog->cb->bok(dialog, dialog->arg, fname, fsize);
     449                sparse = ui_checkbox_get_checked(dialog->sparse);
     450                dialog->cb->bok(dialog, dialog->arg, fname, fsize, sparse);
    416451        }
    417452}
  • uspace/app/nav/newfile.c

    rcfd04c4 r0cf3d5f  
    4444#include <ui/ui.h>
    4545#include <ui/window.h>
     46#include <stdbool.h>
    4647#include <str.h>
    4748#include "dlg/newfiledlg.h"
     
    5253#include "types/newfile.h"
    5354
    54 static void new_file_bok(new_file_dlg_t *, void *, const char *, const char *);
     55static void new_file_bok(new_file_dlg_t *, void *, const char *, const char *,
     56    bool);
    5557static void new_file_bcancel(new_file_dlg_t *, void *);
    5658static void new_file_close(new_file_dlg_t *, void *);
     
    104106        fmgt_set_init_update(fmgt, true);
    105107
    106         rc = fmgt_new_file(fmgt, job->fname, job->nbytes);
     108        rc = fmgt_new_file(fmgt, job->fname, job->nbytes,
     109            job->sparse ? nf_sparse : nf_none);
    107110        if (rc != EOK) {
    108111                rv = asprintf(&msg, "Error creating file (%s).",
     
    137140 * @param fname New file name
    138141 * @param fsize New file size
     142 * @param sparse @c true to create a sparse file
    139143 */
    140144static void new_file_bok(new_file_dlg_t *dlg, void *arg, const char *fname,
    141     const char *fsize)
     145    const char *fsize, bool sparse)
    142146{
    143147        navigator_t *nav = (navigator_t *)arg;
     
    175179        job->fname = fname;
    176180        job->nbytes = nbytes;
     181        job->sparse = sparse;
    177182
    178183        progress_dlg_params_init(&pd_params);
  • uspace/app/nav/types/dlg/newfiledlg.h

    rcfd04c4 r0cf3d5f  
    3838
    3939#include <errno.h>
     40#include <ui/checkbox.h>
    4041#include <ui/entry.h>
    4142#include <ui/pbutton.h>
    4243#include <ui/window.h>
     44#include <stdbool.h>
    4345
    4446/** New File dialog */
     
    5052        /** File size text entry */
    5153        ui_entry_t *esize;
     54        /** Sparse checkbox */
     55        ui_checkbox_t *sparse;
    5256        /** OK button */
    5357        ui_pbutton_t *bok;
     
    6367typedef struct new_file_dlg_cb {
    6468        /** OK button was pressed */
    65         void (*bok)(new_file_dlg_t *, void *, const char *, const char *);
     69        void (*bok)(new_file_dlg_t *, void *, const char *, const char *, bool);
    6670        /** Cancel button was pressed */
    6771        void (*bcancel)(new_file_dlg_t *, void *);
  • uspace/app/nav/types/newfile.h

    rcfd04c4 r0cf3d5f  
    3737#define TYPES_NEWFILE_H
    3838
     39#include <stdbool.h>
    3940#include <stdint.h>
    4041
     
    4748        /** New file size */
    4849        uint64_t nbytes;
     50        /** @c true to create a sparse file */
     51        bool sparse;
    4952} navigator_new_file_job_t;
    5053
  • uspace/app/newfile/newfile.c

    rcfd04c4 r0cf3d5f  
    166166        fmgt_set_cb(fmgt, &newfile_fmgt_cb, NULL);
    167167
    168         rc = fmgt_new_file(fmgt, fname, nbytes);
     168        rc = fmgt_new_file(fmgt, fname, nbytes, sparse ? nf_sparse : nf_none);
    169169        if (rc != EOK) {
    170170                printf("Error creating file: %s.\n", str_error(rc));
  • 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.