Changeset c111da2 in mainline for uspace/app
- Timestamp:
- 2025-10-09T15:44:52Z (3 months ago)
- Branches:
- master
- Children:
- cfd04c4
- Parents:
- 1a96db9
- Location:
- uspace/app
- Files:
-
- 7 added
- 10 edited
-
bdsh/cmds/modules/ls/ls.c (modified) (3 diffs)
-
df/df.c (modified) (8 diffs)
-
meson.build (modified) (2 diffs)
-
nav/dlg/newfiledlg.c (modified) (4 diffs)
-
nav/dlg/progress.c (added)
-
nav/dlg/progress.h (added)
-
nav/meson.build (modified) (2 diffs)
-
nav/nav.c (modified) (2 diffs)
-
nav/nav.h (modified) (1 diff)
-
nav/newfile.c (modified) (6 diffs)
-
nav/types/dlg/newfiledlg.h (modified) (1 diff)
-
nav/types/dlg/progress.h (added)
-
nav/types/nav.h (modified) (3 diffs)
-
nav/types/newfile.h (added)
-
newfile/doc/doxygroups.h (added)
-
newfile/meson.build (added)
-
newfile/newfile.c (added)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bdsh/cmds/modules/ls/ls.c
r1a96db9 rc111da2 1 1 /* 2 * Copyright (c) 2025 Jiri Svoboda 2 3 * Copyright (c) 2008 Tim Post 3 4 * All rights reserved. … … 106 107 } 107 108 108 capa_spec_t capa; 109 capa_from_blocks(de->s.size, 1, &capa); 110 capa_simplify(&capa); 111 112 char *rptr; 113 errno_t rc = capa_format(&capa, &rptr); 114 if (rc != EOK) { 115 return rc; 116 } 117 118 char *sep = str_rchr(rptr, ' '); 109 char fsize[CAPA_BLOCKS_BUFSIZE]; 110 capa_blocks_format_buf(de->s.size, 1, fsize, sizeof(fsize)); 111 112 char *sep = str_rchr(fsize, ' '); 119 113 if (sep == NULL) { 120 free(rptr);121 114 return ENOENT; 122 115 } … … 124 117 *sep = '\0'; 125 118 126 printf("%-40s\t%*s %2s\n", de->name, width - 3, rptr, sep + 1); 127 free(rptr); 119 printf("%-40s\t%*s %2s\n", de->name, width - 3, fsize, sep + 1); 128 120 } else if (de->s.is_directory) 129 121 printf("%-40s\t%*s\n", de->name, width, "<dir>"); -
uspace/app/df/df.c
r1a96db9 rc111da2 1 1 /* 2 * Copyright (c) 2025 Jiri Svoboda 2 3 * Copyright (c) 2013 Manuele Conti 3 4 * All rights reserved. … … 56 57 static bool display_blocks; 57 58 58 static errno_t size_to_human_readable(uint64_t, size_t, char **);59 59 static void print_header(void); 60 static errno_tprint_statfs(vfs_statfs_t *, char *, char *);60 static void print_statfs(vfs_statfs_t *, char *, char *); 61 61 static void print_usage(void); 62 62 … … 65 65 int optres, errflg = 0; 66 66 vfs_statfs_t st; 67 errno_t rc;68 67 69 68 display_blocks = false; … … 109 108 list_foreach(mtab_list, link, mtab_ent_t, mtab_ent) { 110 109 if (vfs_statfs_path(mtab_ent->mp, &st) == 0) { 111 rc = print_statfs(&st, mtab_ent->fs_name, mtab_ent->mp); 112 if (rc != EOK) 113 return 1; 110 print_statfs(&st, mtab_ent->fs_name, mtab_ent->mp); 114 111 } else { 115 112 fprintf(stderr, "Cannot get information for '%s' (%s).\n", … … 120 117 putchar('\n'); 121 118 return 0; 122 }123 124 static errno_t size_to_human_readable(uint64_t nblocks, size_t block_size, char **rptr)125 {126 capa_spec_t capa;127 128 capa_from_blocks(nblocks, block_size, &capa);129 capa_simplify(&capa);130 return capa_format(&capa, rptr);131 119 } 132 120 … … 141 129 } 142 130 143 static errno_tprint_statfs(vfs_statfs_t *st, char *name, char *mountpoint)131 static void print_statfs(vfs_statfs_t *st, char *name, char *mountpoint) 144 132 { 145 133 uint64_t const used_blocks = st->f_blocks - st->f_bfree; 146 134 unsigned const perc_used = PERCENTAGE(used_blocks, st->f_blocks); 147 char *str; 148 errno_t rc; 135 char str[CAPA_BLOCKS_BUFSIZE]; 149 136 150 137 printf("%10s", name); … … 152 139 if (!display_blocks) { 153 140 /* Print size */ 154 rc = size_to_human_readable(st->f_blocks, st->f_bsize, &str); 155 if (rc != EOK) 156 goto error; 141 capa_blocks_format_buf(st->f_blocks, st->f_bsize, str, 142 sizeof(str)); 157 143 printf(" %14s", str); 158 free(str);159 144 160 145 /* Number of used blocks */ 161 rc = size_to_human_readable(used_blocks, st->f_bsize, &str); 162 if (rc != EOK) 163 goto error; 146 capa_blocks_format_buf(used_blocks, st->f_bsize, str, 147 sizeof(str)); 164 148 printf(" %14s", str); 165 free(str);166 149 167 150 /* Number of available blocks */ 168 rc = size_to_human_readable(st->f_bfree, st->f_bsize, &str); 169 if (rc != EOK) 170 goto error; 151 capa_blocks_format_buf(st->f_bfree, st->f_bsize, str, 152 sizeof(str)); 171 153 printf(" %14s", str); 172 free(str);173 154 174 155 /* Percentage of used blocks */ … … 183 164 perc_used, mountpoint); 184 165 } 185 186 return EOK;187 error:188 printf("\nError: Out of memory.\n");189 return ENOMEM;190 166 } 191 167 -
uspace/app/meson.build
r1a96db9 rc111da2 1 1 # 2 # Copyright (c) 2025 Jiri Svoboda 2 3 # Copyright (c) 2019 Jiří Zárevúcky 3 4 # All rights reserved. … … 69 70 'nav', 70 71 'netecho', 72 'newfile', 71 73 'nic', 72 74 'nterm', -
uspace/app/nav/dlg/newfiledlg.c
r1a96db9 rc111da2 358 358 359 359 (void)window; 360 if (dialog->cb != NULL && dialog->cb-> bcancel!= NULL) {360 if (dialog->cb != NULL && dialog->cb->close != NULL) { 361 361 dialog->cb->close(dialog, dialog->arg); 362 362 } … … 373 373 { 374 374 new_file_dlg_t *dialog = (new_file_dlg_t *) arg; 375 const char *text; 375 const char *fname; 376 const char *fsize; 376 377 377 378 if (event->type == KEY_PRESS && … … 380 381 /* Confirm */ 381 382 if (dialog->cb != NULL && dialog->cb->bok != NULL) { 382 text = ui_entry_get_text(dialog->ename); 383 dialog->cb->bok(dialog, dialog->arg, text); 383 fname = ui_entry_get_text(dialog->ename); 384 fsize = ui_entry_get_text(dialog->esize); 385 dialog->cb->bok(dialog, dialog->arg, fname, 386 fsize); 384 387 return; 385 388 } … … 404 407 { 405 408 new_file_dlg_t *dialog = (new_file_dlg_t *) arg; 406 const char *text; 409 const char *fname; 410 const char *fsize; 407 411 408 412 if (dialog->cb != NULL && dialog->cb->bok != NULL) { 409 text = ui_entry_get_text(dialog->ename); 410 dialog->cb->bok(dialog, dialog->arg, text); 413 fname = ui_entry_get_text(dialog->ename); 414 fsize = ui_entry_get_text(dialog->esize); 415 dialog->cb->bok(dialog, dialog->arg, fname, fsize); 411 416 } 412 417 } -
uspace/app/nav/meson.build
r1a96db9 rc111da2 30 30 src = files( 31 31 'dlg/newfiledlg.c', 32 'dlg/progress.c', 32 33 'main.c', 33 34 'menu.c', … … 39 40 test_src = files( 40 41 'dlg/newfiledlg.c', 42 'dlg/progress.c', 41 43 'menu.c', 42 44 'nav.c', -
uspace/app/nav/nav.c
r1a96db9 rc111da2 35 35 */ 36 36 37 #include <fibril.h> 37 38 #include <gfx/coord.h> 38 39 #include <stdio.h> … … 535 536 } 536 537 538 /** Wrapper fibril function for worker function. 539 * 540 * This is the main fibril function for the worker fibril. It executes 541 * the worker function, then clears worker FID to indicate the worker 542 * is finished. 543 * 544 * @param arg Argument (navigator_worker_job_t *) 545 * @return EOK 546 */ 547 static errno_t navigator_worker_func(void *arg) 548 { 549 navigator_worker_job_t *job = (navigator_worker_job_t *)arg; 550 551 job->wfunc(job->arg); 552 job->navigator->worker_fid = 0; 553 free(job); 554 return EOK; 555 } 556 557 /** Start long-time work in a worker fibril. 558 * 559 * Actions which can take time (file operations) cannot block the main UI 560 * fibril. This function will start an action in the worker fibril, i.e., 561 * in the background. At the same time the caller should create a modal 562 * progress dialog that will be shown until the work is completed. 563 * 564 * (Only a single worker can execute at any given time). 565 * 566 * @param nav Navigator 567 * @param wfunc Worker main function 568 * @param arg Argument to worker function 569 * 570 * @return EOK on success or an error code 571 */ 572 errno_t navigator_worker_start(navigator_t *nav, void (*wfunc)(void *), 573 void *arg) 574 { 575 navigator_worker_job_t *job; 576 577 if (nav->worker_fid != 0) 578 return EBUSY; 579 580 job = calloc(1, sizeof(navigator_worker_job_t)); 581 if (job == NULL) 582 return ENOMEM; 583 584 job->navigator = nav; 585 job->wfunc = wfunc; 586 job->arg = arg; 587 588 nav->worker_fid = fibril_create(navigator_worker_func, (void *)job); 589 if (nav->worker_fid == 0) { 590 free(job); 591 return ENOMEM; 592 } 593 594 fibril_add_ready(nav->worker_fid); 595 return EOK; 596 } 597 537 598 /** @} 538 599 */ -
uspace/app/nav/nav.h
r1a96db9 rc111da2 47 47 extern void navigator_switch_panel(navigator_t *); 48 48 extern void navigator_refresh_panels(navigator_t *); 49 extern errno_t navigator_worker_start(navigator_t *, void (*)(void *), 50 void *); 49 51 50 52 #endif -
uspace/app/nav/newfile.c
r1a96db9 rc111da2 34 34 */ 35 35 36 #include <capa.h> 37 #include <fmgt.h> 36 38 #include <stdlib.h> 37 39 #include <str_error.h> … … 42 44 #include <ui/ui.h> 43 45 #include <ui/window.h> 46 #include <str.h> 44 47 #include "dlg/newfiledlg.h" 48 #include "dlg/progress.h" 45 49 #include "menu.h" 46 50 #include "newfile.h" 47 51 #include "nav.h" 48 49 static void new_file_bok(new_file_dlg_t *, void *, const char *); 52 #include "types/newfile.h" 53 54 static void new_file_bok(new_file_dlg_t *, void *, const char *, const char *); 50 55 static void new_file_bcancel(new_file_dlg_t *, void *); 51 56 static void new_file_close(new_file_dlg_t *, void *); … … 57 62 }; 58 63 64 static void new_file_progress(void *, fmgt_progress_t *); 65 66 static fmgt_cb_t new_file_fmgt_cb = { 67 .progress = new_file_progress 68 }; 69 59 70 /** Open New File dialog. 60 71 * … … 69 80 } 70 81 82 /** New file worker function. 83 * 84 * @param arg Argument (navigator_new_file_job_t) 85 */ 86 static void new_file_wfunc(void *arg) 87 { 88 fmgt_t *fmgt = NULL; 89 navigator_new_file_job_t *job = (navigator_new_file_job_t *)arg; 90 char *msg = NULL; 91 navigator_t *nav = job->navigator; 92 ui_msg_dialog_t *dialog = NULL; 93 ui_msg_dialog_params_t params; 94 errno_t rc; 95 int rv; 96 97 rc = fmgt_create(&fmgt); 98 if (rc != EOK) { 99 /* out of memory */ 100 return; 101 } 102 103 fmgt_set_cb(fmgt, &new_file_fmgt_cb, (void *)nav); 104 fmgt_set_init_update(fmgt, true); 105 106 rc = fmgt_new_file(fmgt, job->fname, job->nbytes); 107 if (rc != EOK) { 108 rv = asprintf(&msg, "Error creating file (%s).", 109 str_error(rc)); 110 if (rv < 0) 111 return; 112 goto error; 113 } 114 115 fmgt_destroy(fmgt); 116 ui_lock(nav->ui); 117 progress_dlg_destroy(nav->progress_dlg); 118 navigator_refresh_panels(nav); 119 ui_unlock(nav->ui); 120 free(job); 121 return; 122 error: 123 ui_lock(nav->ui); 124 progress_dlg_destroy(nav->progress_dlg); 125 ui_msg_dialog_params_init(¶ms); 126 params.caption = "Error"; 127 params.text = msg; 128 (void) ui_msg_dialog_create(nav->ui, ¶ms, &dialog); 129 ui_unlock(nav->ui); 130 free(msg); 131 } 132 71 133 /** New file dialog confirmed. 72 134 * … … 74 136 * @param arg Argument (navigator_t *) 75 137 * @param fname New file name 76 */ 77 static void new_file_bok(new_file_dlg_t *dlg, void *arg, const char *fname) 138 * @param fsize New file size 139 */ 140 static void new_file_bok(new_file_dlg_t *dlg, void *arg, const char *fname, 141 const char *fsize) 78 142 { 79 143 navigator_t *nav = (navigator_t *)arg; 80 144 ui_msg_dialog_t *dialog = NULL; 145 navigator_new_file_job_t *job; 81 146 ui_msg_dialog_params_t params; 147 progress_dlg_params_t pd_params; 148 capa_spec_t fcap; 82 149 char *msg = NULL; 150 errno_t rc; 151 uint64_t nbytes; 83 152 int rv; 84 FILE *f; 153 154 rc = capa_parse(fsize, &fcap); 155 if (rc != EOK) { 156 /* invalid file size */ 157 return; 158 } 85 159 86 160 new_file_dlg_destroy(dlg); 87 f = fopen(fname, "wx"); 88 if (f == NULL) {89 rv = asprintf(&msg, "Error creating file (%s).",90 str_error(errno));161 162 rc = capa_to_blocks(&fcap, cv_nom, 1, &nbytes); 163 if (rc != EOK) { 164 rv = asprintf(&msg, "File size too large (%s).", fsize); 91 165 if (rv < 0) 92 166 return; 93 94 ui_msg_dialog_params_init(¶ms); 95 params.caption = "Error"; 96 params.text = msg; 97 (void) ui_msg_dialog_create(nav->ui, ¶ms, &dialog); 98 free(msg); 167 goto error; 168 } 169 170 job = calloc(1, sizeof(navigator_new_file_job_t)); 171 if (job == NULL) 99 172 return; 100 } 101 102 fclose(f); 103 navigator_refresh_panels(nav); 173 174 job->navigator = nav; 175 job->fname = fname; 176 job->nbytes = nbytes; 177 178 progress_dlg_params_init(&pd_params); 179 pd_params.caption = "Creating new file"; 180 181 rc = progress_dlg_create(nav->ui, &pd_params, &nav->progress_dlg); 182 if (rc != EOK) { 183 msg = str_dup("Out of memory."); 184 if (msg == NULL) 185 return; 186 goto error; 187 } 188 189 rc = navigator_worker_start(nav, new_file_wfunc, (void *)job); 190 if (rc != EOK) { 191 msg = str_dup("Out of memory."); 192 if (msg == NULL) 193 return; 194 goto error; 195 } 196 197 return; 198 error: 199 ui_msg_dialog_params_init(¶ms); 200 params.caption = "Error"; 201 params.text = msg; 202 (void) ui_msg_dialog_create(nav->ui, ¶ms, &dialog); 203 free(msg); 104 204 } 105 205 … … 126 226 } 127 227 228 /** New file progress update. 229 * 230 * @param arg Argument (navigator_t *) 231 * @param progress Progress update 232 */ 233 static void new_file_progress(void *arg, fmgt_progress_t *progress) 234 { 235 navigator_t *nav = (navigator_t *)arg; 236 char buf[128]; 237 238 snprintf(buf, sizeof(buf), "Written %s of %s (%s done).", 239 progress->curf_procb, progress->curf_totalb, 240 progress->curf_percent); 241 progress_dlg_set_curf_prog(nav->progress_dlg, buf); 242 } 243 128 244 /** @} 129 245 */ -
uspace/app/nav/types/dlg/newfiledlg.h
r1a96db9 rc111da2 60 60 } new_file_dlg_t; 61 61 62 /** Prompt dialog callback*/62 /** New File dialog callbacks */ 63 63 typedef struct new_file_dlg_cb { 64 64 /** OK button was pressed */ 65 void (*bok)(new_file_dlg_t *, void *, const char * );65 void (*bok)(new_file_dlg_t *, void *, const char *, const char *); 66 66 /** Cancel button was pressed */ 67 67 void (*bcancel)(new_file_dlg_t *, void *); -
uspace/app/nav/types/nav.h
r1a96db9 rc111da2 1 1 /* 2 * Copyright (c) 202 1Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 37 37 #define TYPES_NAV_H 38 38 39 #include <fibril.h> 39 40 #include <ui/fixed.h> 40 41 #include <ui/ui.h> … … 57 58 /** Panels */ 58 59 struct panel *panel[navigator_panels]; 60 /** Progress dialog */ 61 struct progress_dlg *progress_dlg; 62 /** Worker fibril ID */ 63 fid_t worker_fid; 59 64 } navigator_t; 65 66 /** Navigator worker job */ 67 typedef struct { 68 /** Navigator */ 69 navigator_t *navigator; 70 /** Worker function */ 71 void (*wfunc)(void *); 72 /** Worker argument */ 73 void *arg; 74 } navigator_worker_job_t; 60 75 61 76 #endif
Note:
See TracChangeset
for help on using the changeset viewer.
