Changeset 59ed424e in mainline
- Timestamp:
- 2026-02-11T12:02:03Z (28 hours ago)
- Branches:
- master
- Children:
- f9c30b9a
- Parents:
- 857fba8
- git-author:
- Jiri Svoboda <jiri@…> (2026-02-10 20:01:03)
- git-committer:
- Jiri Svoboda <jiri@…> (2026-02-11 12:02:03)
- Location:
- uspace
- Files:
-
- 9 edited
-
app/copy/copy.c (modified) (1 diff)
-
lib/fmgt/include/types/fmgt.h (modified) (2 diffs)
-
lib/fmgt/private/fsops.h (modified) (1 diff)
-
lib/fmgt/src/copy.c (modified) (5 diffs)
-
lib/fmgt/src/fsops.c (modified) (3 diffs)
-
lib/fmgt/src/verify.c (modified) (3 diffs)
-
lib/fmgt/src/walk.c (modified) (15 diffs)
-
lib/fmgt/test/fsops.c (modified) (1 diff)
-
lib/fmgt/test/walk.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/copy/copy.c
r857fba8 r59ed424e 210 210 211 211 if (nonint) 212 return fmgt_exr_ abort;212 return fmgt_exr_fail; 213 213 214 214 if (prog_upd) -
uspace/lib/fmgt/include/types/fmgt.h
r857fba8 r59ed424e 103 103 fmgt_exr_skip, 104 104 /** Abort */ 105 fmgt_exr_abort 105 fmgt_exr_abort, 106 /** Fail */ 107 fmgt_exr_fail 106 108 } fmgt_exists_action_t; 107 109 … … 159 161 } fmgt_flist_entry_t; 160 162 163 /** File system tree walk. */ 164 typedef struct { 165 /** Parameters */ 166 struct fmgt_walk_params *params; 167 /** Stop walk. */ 168 bool stop; 169 } fmgt_walk_t; 170 161 171 /** File system tree walk callbacks */ 162 172 typedef struct { 163 errno_t (*dir_enter)( void*, const char *, const char *);164 errno_t (*dir_leave)( void*, const char *, const char *);165 errno_t (*file)( void*, const char *, const char *);173 errno_t (*dir_enter)(fmgt_walk_t *, const char *, const char *); 174 errno_t (*dir_leave)(fmgt_walk_t *, const char *, const char *); 175 errno_t (*file)(fmgt_walk_t *, const char *, const char *); 166 176 } fmgt_walk_cb_t; 167 177 168 178 /** File system tree walk parameters */ 169 typedef struct {179 typedef struct fmgt_walk_params { 170 180 /** List of files or directories (walk roots) */ 171 181 fmgt_flist_t *flist; -
uspace/lib/fmgt/private/fsops.h
r857fba8 r59ed424e 44 44 45 45 errno_t fmgt_open(fmgt_t *, const char *, int *); 46 errno_t fmgt_create_file(fmgt_t *, const char *, int *, bool*);46 errno_t fmgt_create_file(fmgt_t *, const char *, int *, fmgt_exists_action_t *); 47 47 errno_t fmgt_create_dir(fmgt_t *, const char *); 48 48 errno_t fmgt_read(fmgt_t *, int, const char *, aoff64_t *, void *, size_t, -
uspace/lib/fmgt/src/copy.c
r857fba8 r59ed424e 43 43 #include "../private/fsops.h" 44 44 45 static errno_t fmgt_copy_dir_enter( void*, const char *, const char *);46 static errno_t fmgt_copy_file( void*, const char *, const char *);45 static errno_t fmgt_copy_dir_enter(fmgt_walk_t *, const char *, const char *); 46 static errno_t fmgt_copy_file(fmgt_walk_t *, const char *, const char *); 47 47 48 48 static fmgt_walk_cb_t fmgt_copy_cb = { … … 53 53 /** Copy operation - enter directory. 54 54 * 55 * @param arg Argument (fmgt_t *)55 * @param walk Walk 56 56 * @param fname Source directory name 57 57 * @param dest Destination directory name 58 58 * @return EOK on success or an error code 59 59 */ 60 static errno_t fmgt_copy_dir_enter(void *arg, const char *src, const char *dest) 60 static errno_t fmgt_copy_dir_enter(fmgt_walk_t *walk, const char *src, 61 const char *dest) 61 62 { 62 fmgt_t *fmgt = (fmgt_t *) arg;63 fmgt_t *fmgt = (fmgt_t *)walk->params->arg; 63 64 64 65 (void)dest; … … 68 69 /** Copy single file. 69 70 * 70 * @param arg Argument (fmgt_t *)71 * @param walk Walk 71 72 * @param fname Source file name 72 73 * @param dest Destination file name 73 74 * @return EOK on success or an error code 74 75 */ 75 static errno_t fmgt_copy_file(void *arg, const char *src, const char *dest) 76 static errno_t fmgt_copy_file(fmgt_walk_t *walk, const char *src, 77 const char *dest) 76 78 { 77 fmgt_t *fmgt = (fmgt_t *)arg; 79 fmgt_t *fmgt = (fmgt_t *)walk->params->arg; 80 fmgt_exists_action_t exaction; 78 81 int rfd; 79 82 int wfd; … … 82 85 aoff64_t wpos = 0; 83 86 char *buffer; 84 bool skip;85 87 errno_t rc; 86 88 … … 95 97 } 96 98 97 rc = fmgt_create_file(fmgt, dest, &wfd, & skip);99 rc = fmgt_create_file(fmgt, dest, &wfd, &exaction); 98 100 if (rc != EOK) { 99 101 free(buffer); 100 102 vfs_put(rfd); 101 103 102 /* User decided to skip and continue. */ 103 if (rc == EEXIST && skip) 104 if (rc == EEXIST && exaction != fmgt_exr_fail) { 105 if (exaction == fmgt_exr_abort) 106 walk->stop = true; 104 107 return EOK; 108 } 109 105 110 return rc; 106 111 } -
uspace/lib/fmgt/src/fsops.c
r857fba8 r59ed424e 81 81 * @param fname Destination file name 82 82 * @param rfd Place to store file descriptor 83 * @param rskip If @c true, skip existing file and continue 84 * @return EOK on success or an error code 85 */ 86 errno_t fmgt_create_file(fmgt_t *fmgt, const char *fname, int *rfd, bool *rskip) 83 * @param raction If return value is EEXIST, fills in the action to take. 84 * @return EOK on success or an error code 85 */ 86 errno_t fmgt_create_file(fmgt_t *fmgt, const char *fname, int *rfd, 87 fmgt_exists_action_t *raction) 87 88 { 88 89 fmgt_io_error_t err; … … 93 94 unsigned flags; 94 95 errno_t rc; 95 96 *rskip = false;97 96 98 97 do { … … 110 109 fmgt_timer_start(fmgt); 111 110 112 if (exaction == fmgt_exr_skip) 113 *rskip = true; 111 *raction = exaction; 114 112 if (exaction != fmgt_exr_overwrite) 115 113 break; -
uspace/lib/fmgt/src/verify.c
r857fba8 r59ed424e 1 1 /* 2 * Copyright (c) 202 5Jiri Svoboda2 * Copyright (c) 2026 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 42 42 #include "../private/fmgt.h" 43 43 44 static errno_t fmgt_verify_file( void*, const char *, const char *);44 static errno_t fmgt_verify_file(fmgt_walk_t *, const char *, const char *); 45 45 46 46 static fmgt_walk_cb_t fmgt_verify_cb = { … … 50 50 /** Verify a single file. 51 51 * 52 * @param arg Argument (fmgt_t *)52 * @param walk Walk 53 53 * @param fname File name 54 54 * @param unused Unused 55 55 * @return EOK on success or an error code 56 56 */ 57 static errno_t fmgt_verify_file( void *arg, const char *fname,57 static errno_t fmgt_verify_file(fmgt_walk_t *walk, const char *fname, 58 58 const char *unused) 59 59 { 60 fmgt_t *fmgt = (fmgt_t *) arg;60 fmgt_t *fmgt = (fmgt_t *)walk->params->arg; 61 61 int fd; 62 62 size_t nr; -
uspace/lib/fmgt/src/walk.c
r857fba8 r59ed424e 1 1 /* 2 * Copyright (c) 202 5Jiri Svoboda2 * Copyright (c) 2026 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 46 46 #include "fmgt/walk.h" 47 47 48 static errno_t fmgt_walk_subtree(fmgt_walk_params_t *, const char *, 49 const char *); 48 static errno_t fmgt_walk_subtree(fmgt_walk_t *, const char *, const char *); 50 49 51 50 /** Initialize walk parameters. … … 63 62 /** Walk file (invoke file callback). 64 63 * 65 * @param params Walk parameters64 * @param walk Walk 66 65 * @param fname Source path 67 66 * @param dest Destination path … … 69 68 * @return EOK on success or an error code 70 69 */ 71 static errno_t fmgt_walk_file(fmgt_walk_ params_t *params, const char *fname,72 const char *dest) 73 { 74 if ( params->cb->file != NULL)75 return params->cb->file(params->arg, fname, dest);70 static errno_t fmgt_walk_file(fmgt_walk_t *walk, const char *fname, 71 const char *dest) 72 { 73 if (walk->params->cb->file != NULL) 74 return walk->params->cb->file(walk, fname, dest); 76 75 else 77 76 return EOK; … … 80 79 /** Enter directory (invoke directory entry callback). 81 80 * 82 * @param params Walk parameters81 * @param walk Walk 83 82 * @param dname Source directory 84 83 * @param dest Destination path 85 84 * @return EOK on success or an error code 86 85 */ 87 static errno_t fmgt_walk_dir_enter(fmgt_walk_ params_t *params,88 const char *d name, const char *dest)89 { 90 if ( params->cb->dir_enter != NULL)91 return params->cb->dir_enter(params->arg, dname, dest);86 static errno_t fmgt_walk_dir_enter(fmgt_walk_t *walk, const char *dname, 87 const char *dest) 88 { 89 if (walk->params->cb->dir_enter != NULL) 90 return walk->params->cb->dir_enter(walk, dname, dest); 92 91 else 93 92 return EOK; … … 96 95 /** Leave directory (invoke directory exit callback). 97 96 * 98 * @param params Walk parameters97 * @param walk Walk 99 98 * @param dname Directory path 100 99 * @param dest Destination path 101 100 * @return EOK on success or an error code 102 101 */ 103 static errno_t fmgt_walk_dir_leave(fmgt_walk_ params_t *params,104 const char *d name, const char *dest)105 { 106 if ( params->cb->dir_leave != NULL)107 return params->cb->dir_leave(params->arg, dname, dest);102 static errno_t fmgt_walk_dir_leave(fmgt_walk_t *walk, const char *dname, 103 const char *dest) 104 { 105 if (walk->params->cb->dir_leave != NULL) 106 return walk->params->cb->dir_leave(walk, dname, dest); 108 107 else 109 108 return EOK; … … 112 111 /** Walk directory. 113 112 * 114 * @param params Walk parameters113 * @param walk Walk 115 114 * @param dname Directory name 116 115 * @param dest Destination path or @c NULL 117 116 * @return EOK on success or an error code 118 117 */ 119 static errno_t fmgt_walk_dir(fmgt_walk_ params_t *params, const char *dname,118 static errno_t fmgt_walk_dir(fmgt_walk_t *walk, const char *dname, 120 119 const char *dest) 121 120 { … … 127 126 int rv; 128 127 129 rc = fmgt_walk_dir_enter( params, dname, dest);128 rc = fmgt_walk_dir_enter(walk, dname, dest); 130 129 if (rc != EOK) 131 130 goto error; … … 138 137 139 138 de = readdir(dir); 140 while ( de != NULL) {139 while (!walk->stop && de != NULL) { 141 140 rv = asprintf(&srcpath, "%s/%s", dname, de->d_name); 142 141 if (rv < 0) { … … 154 153 } 155 154 156 rc = fmgt_walk_subtree( params, srcpath, destpath);155 rc = fmgt_walk_subtree(walk, srcpath, destpath); 157 156 if (rc != EOK) { 158 157 free(srcpath); … … 168 167 } 169 168 170 rc = fmgt_walk_dir_leave( params, dname, dest);169 rc = fmgt_walk_dir_leave(walk, dname, dest); 171 170 if (rc != EOK) 172 171 return rc; … … 182 181 /** Walk subtree. 183 182 * 184 * @param params Walk parameters.185 * @param fname Subtree path .183 * @param walk Walk 184 * @param fname Subtree path 186 185 * @param dest Destination path 187 186 * 188 187 * @return EOK on success or an error code. 189 188 */ 190 static errno_t fmgt_walk_subtree(fmgt_walk_ params_t *params, const char *fname,189 static errno_t fmgt_walk_subtree(fmgt_walk_t *walk, const char *fname, 191 190 const char *dest) 192 191 { … … 200 199 if (stat.is_directory) { 201 200 /* Directory */ 202 rc = fmgt_walk_dir( params, fname, dest);201 rc = fmgt_walk_dir(walk, fname, dest); 203 202 if (rc != EOK) 204 203 return rc; 205 204 } else { 206 205 /* Not a directory */ 207 rc = fmgt_walk_file( params, fname, dest);206 rc = fmgt_walk_file(walk, fname, dest); 208 207 if (rc != EOK) 209 208 return rc; … … 225 224 { 226 225 fmgt_flist_entry_t *entry; 226 fmgt_walk_t walk; 227 227 char *destname; 228 228 errno_t rc; 229 229 int rv; 230 230 231 walk.params = params; 232 walk.stop = false; 233 231 234 entry = fmgt_flist_first(params->flist); 232 while ( entry != NULL) {235 while (!walk.stop && entry != NULL) { 233 236 if (params->into_dest) { 234 237 rv = asprintf(&destname, "%s/%s", … … 240 243 } 241 244 242 rc = fmgt_walk_subtree( params, entry->fname,245 rc = fmgt_walk_subtree(&walk, entry->fname, 243 246 destname != NULL ? destname : params->dest); 244 247 if (rc != EOK) -
uspace/lib/fmgt/test/fsops.c
r857fba8 r59ed424e 86 86 int fd; 87 87 int rv; 88 bool skip; 89 errno_t rc; 90 91 /* Create name for temporary file */ 92 p = tmpnam(buf); 93 PCUT_ASSERT_NOT_NULL(p); 94 95 rc = fmgt_create(&fmgt); 96 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 97 98 rc = fmgt_create_file(fmgt, p, &fd, &skip); 99 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 100 PCUT_ASSERT_FALSE(skip); 88 fmgt_exists_action_t exaction; 89 errno_t rc; 90 91 /* Create name for temporary file */ 92 p = tmpnam(buf); 93 PCUT_ASSERT_NOT_NULL(p); 94 95 rc = fmgt_create(&fmgt); 96 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 97 98 rc = fmgt_create_file(fmgt, p, &fd, &exaction); 99 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 101 100 102 101 fmgt_destroy(fmgt); -
uspace/lib/fmgt/test/walk.c
r857fba8 r59ed424e 39 39 PCUT_TEST_SUITE(walk); 40 40 41 static errno_t test_walk_dir_enter( void*, const char *, const char *);42 static errno_t test_walk_dir_leave( void*, const char *, const char *);43 static errno_t test_walk_file( void*, const char *, const char *);41 static errno_t test_walk_dir_enter(fmgt_walk_t *, const char *, const char *); 42 static errno_t test_walk_dir_leave(fmgt_walk_t *, const char *, const char *); 43 static errno_t test_walk_file(fmgt_walk_t *, const char *, const char *); 44 44 45 45 static fmgt_walk_cb_t test_walk_cb = { … … 207 207 } 208 208 209 errno_t test_walk_dir_enter(void *arg, const char *fname, const char *dest) 210 { 211 test_resp_t *resp = (test_resp_t *)arg; 209 errno_t test_walk_dir_enter(fmgt_walk_t *walk, const char *fname, 210 const char *dest) 211 { 212 test_resp_t *resp = (test_resp_t *)walk->params->arg; 212 213 resp->dir_enter = true; 213 214 resp->dirname = str_dup(fname); … … 216 217 } 217 218 218 errno_t test_walk_dir_leave(void *arg, const char *fname, const char *dest) 219 { 220 test_resp_t *resp = (test_resp_t *)arg; 219 errno_t test_walk_dir_leave(fmgt_walk_t *walk, const char *fname, 220 const char *dest) 221 { 222 test_resp_t *resp = (test_resp_t *)walk->params->arg; 221 223 resp->dir_leave = true; 222 224 resp->dl_dest = (dest != NULL) ? str_dup(dest) : NULL; … … 224 226 } 225 227 226 errno_t test_walk_file( void *arg, const char *fname, const char *dest)227 { 228 test_resp_t *resp = (test_resp_t *) arg;228 errno_t test_walk_file(fmgt_walk_t *walk, const char *fname, const char *dest) 229 { 230 test_resp_t *resp = (test_resp_t *)walk->params->arg; 229 231 resp->file_proc = true; 230 232 resp->fname = str_dup(fname);
Note:
See TracChangeset
for help on using the changeset viewer.
