Changeset 2309891 in mainline for uspace/lib/fmgt/src/walk.c
- Timestamp:
- 2025-12-14T17:15:57Z (2 days ago)
- Branches:
- master
- Children:
- 79b77ce
- Parents:
- 144fafd
- File:
-
- 1 edited
-
uspace/lib/fmgt/src/walk.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
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.
