Changeset 2309891 in mainline for uspace/lib/fmgt/src
- Timestamp:
- 2025-12-14T17:15:57Z (4 weeks ago)
- Branches:
- master
- Children:
- 79b77ce
- Parents:
- 144fafd
- Location:
- uspace/lib/fmgt/src
- Files:
-
- 1 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/fmgt/src/fmgt.c
r144fafd r2309891 40 40 #include <stddef.h> 41 41 #include <str.h> 42 #include <str.h> 42 43 #include <vfs/vfs.h> 43 44 #include <dirent.h> … … 282 283 } 283 284 285 /** Return base name (without path component). 286 * 287 * @param path Pathname 288 * @return Base name without directory components 289 */ 290 const char *fmgt_basename(const char *path) 291 { 292 const char *p; 293 294 p = str_rchr(path, '/'); 295 if (p != NULL) 296 return p + 1; 297 else 298 return path; 299 } 300 301 /** Determine if pathname is an existing directory. 302 * 303 * @param path Pathname 304 * @return @c true if @a path exists and is a directory 305 */ 306 bool fmgt_is_dir(const char *path) 307 { 308 vfs_stat_t stat; 309 errno_t rc; 310 311 rc = vfs_stat_path(path, &stat); 312 if (rc != EOK) 313 return false; 314 315 return stat.is_directory; 316 } 317 284 318 /** @} 285 319 */ -
uspace/lib/fmgt/src/verify.c
r144fafd r2309891 33 33 */ 34 34 35 //#include <dirent.h>36 35 #include <errno.h> 37 36 #include <stdbool.h> 38 //#include <stdio.h>39 37 #include <stdlib.h> 40 //#include <stddef.h>41 //#include <str.h>42 38 #include <vfs/vfs.h> 43 //#include <dirent.h>44 39 45 40 #include "fmgt.h" … … 47 42 #include "../private/fmgt.h" 48 43 49 static errno_t fmgt_verify_file(void *, const char * );44 static errno_t fmgt_verify_file(void *, const char *, const char *); 50 45 51 46 static fmgt_walk_cb_t fmgt_verify_cb = { … … 53 48 }; 54 49 55 static errno_t fmgt_verify_file(void *arg, const char *fname) 50 /** Verify a single file. 51 * 52 * @param arg Argument (fmgt_t *) 53 * @param fname File name 54 * @param unused Unused 55 * @return EOK on success or an error code 56 */ 57 static errno_t fmgt_verify_file(void *arg, const char *fname, 58 const char *unused) 56 59 { 57 60 fmgt_t *fmgt = (fmgt_t *)arg; … … 63 66 fmgt_error_action_t action; 64 67 errno_t rc; 68 69 (void)unused; 65 70 66 71 buffer = calloc(BUFFER_SIZE, 1); … … 95 100 free(buffer); 96 101 vfs_put(fd); 102 fmgt_final_progress_update(fmgt); 97 103 return rc; 98 104 } … … 104 110 free(buffer); 105 111 vfs_put(fd); 112 fmgt_final_progress_update(fmgt); 106 113 return EINTR; 107 114 } -
uspace/lib/fmgt/src/walk.c
r144fafd r2309891 46 46 #include "fmgt/walk.h" 47 47 48 static errno_t fmgt_walk_subtree(fmgt_walk_params_t *, const char *); 48 static errno_t fmgt_walk_subtree(fmgt_walk_params_t *, const char *, 49 const char *); 49 50 50 51 /** Initialize walk parameters. … … 63 64 * 64 65 * @param params Walk parameters 65 * @param fname File path 66 * 67 * @return EOK on success or an error code 68 */ 69 static errno_t fmgt_walk_file(fmgt_walk_params_t *params, const char *fname) 66 * @param fname Source path 67 * @param dest Destination path 68 * 69 * @return EOK on success or an error code 70 */ 71 static errno_t fmgt_walk_file(fmgt_walk_params_t *params, const char *fname, 72 const char *dest) 70 73 { 71 74 if (params->cb->file != NULL) 72 return params->cb->file(params->arg, fname );75 return params->cb->file(params->arg, fname, dest); 73 76 else 74 77 return EOK; … … 78 81 * 79 82 * @param params Walk parameters 80 * @param dname Directory path 83 * @param dname Source directory 84 * @param dest Destination path 81 85 * @return EOK on success or an error code 82 86 */ 83 87 static errno_t fmgt_walk_dir_enter(fmgt_walk_params_t *params, 84 const char *dname )88 const char *dname, const char *dest) 85 89 { 86 90 if (params->cb->dir_enter != NULL) 87 return params->cb->dir_enter(params->arg, dname );91 return params->cb->dir_enter(params->arg, dname, dest); 88 92 else 89 93 return EOK; … … 94 98 * @param params Walk parameters 95 99 * @param dname Directory path 100 * @param dest Destination path 96 101 * @return EOK on success or an error code 97 102 */ 98 103 static errno_t fmgt_walk_dir_leave(fmgt_walk_params_t *params, 99 const char *dname )100 { 101 if (params->cb->dir_ enter!= NULL)102 return params->cb->dir_leave(params->arg, dname );104 const char *dname, const char *dest) 105 { 106 if (params->cb->dir_leave != NULL) 107 return params->cb->dir_leave(params->arg, dname, dest); 103 108 else 104 109 return EOK; … … 109 114 * @param params Walk parameters 110 115 * @param dname Directory name 111 * @return EOK on success or an error code 112 */ 113 static errno_t fmgt_walk_dir(fmgt_walk_params_t *params, const char *dname) 116 * @param dest Destination path or @c NULL 117 * @return EOK on success or an error code 118 */ 119 static errno_t fmgt_walk_dir(fmgt_walk_params_t *params, const char *dname, 120 const char *dest) 114 121 { 115 122 DIR *dir = NULL; 116 123 struct dirent *de; 117 124 errno_t rc; 118 char *pathname = NULL; 125 char *srcpath = NULL; 126 char *destpath = NULL; 119 127 int rv; 120 128 121 rc = fmgt_walk_dir_enter(params, dname );129 rc = fmgt_walk_dir_enter(params, dname, dest); 122 130 if (rc != EOK) 123 131 goto error; … … 131 139 de = readdir(dir); 132 140 while (de != NULL) { 133 rv = asprintf(& pathname, "%s/%s", dname, de->d_name);141 rv = asprintf(&srcpath, "%s/%s", dname, de->d_name); 134 142 if (rv < 0) { 135 143 rc = ENOMEM; … … 137 145 } 138 146 139 rc = fmgt_walk_subtree(params, pathname); 147 if (dest != NULL) { 148 rv = asprintf(&destpath, "%s/%s", dest, de->d_name); 149 if (rv < 0) { 150 rc = ENOMEM; 151 free(srcpath); 152 goto error; 153 } 154 } 155 156 rc = fmgt_walk_subtree(params, srcpath, destpath); 140 157 if (rc != EOK) { 141 free(pathname); 158 free(srcpath); 159 if (destpath != NULL) 160 free(destpath); 142 161 goto error; 143 162 } 144 163 145 free(pathname); 164 free(srcpath); 165 if (destpath != NULL) 166 free(destpath); 146 167 de = readdir(dir); 147 168 } 148 169 149 rc = fmgt_walk_dir_leave(params, dname );170 rc = fmgt_walk_dir_leave(params, dname, dest); 150 171 if (rc != EOK) 151 172 return rc; … … 161 182 /** Walk subtree. 162 183 * 163 * @params params Walk parameters. 164 * @params fname Subtree path. 184 * @param params Walk parameters. 185 * @param fname Subtree path. 186 * @param dest Destination path 165 187 * 166 188 * @return EOK on success or an error code. 167 189 */ 168 static errno_t fmgt_walk_subtree(fmgt_walk_params_t *params, const char *fname) 190 static errno_t fmgt_walk_subtree(fmgt_walk_params_t *params, const char *fname, 191 const char *dest) 169 192 { 170 193 vfs_stat_t stat; … … 177 200 if (stat.is_directory) { 178 201 /* Directory */ 179 rc = fmgt_walk_dir(params, fname );202 rc = fmgt_walk_dir(params, fname, dest); 180 203 if (rc != EOK) 181 204 return rc; 182 205 } else { 183 206 /* Not a directory */ 184 rc = fmgt_walk_file(params, fname );207 rc = fmgt_walk_file(params, fname, dest); 185 208 if (rc != EOK) 186 209 return rc; … … 202 225 { 203 226 fmgt_flist_entry_t *entry; 227 char *destname; 204 228 errno_t rc; 229 int rv; 205 230 206 231 entry = fmgt_flist_first(params->flist); 207 232 while (entry != NULL) { 208 rc = fmgt_walk_subtree(params, entry->fname); 233 if (params->into_dest) { 234 rv = asprintf(&destname, "%s/%s", 235 params->dest, fmgt_basename(entry->fname)); 236 if (rv < 0) 237 return ENOMEM; 238 } else { 239 destname = NULL; 240 } 241 242 rc = fmgt_walk_subtree(params, entry->fname, 243 destname != NULL ? destname : params->dest); 209 244 if (rc != EOK) 210 245 return rc;
Note:
See TracChangeset
for help on using the changeset viewer.
