Changeset 2309891 in mainline for uspace/lib/fmgt/src/walk.c


Ignore:
Timestamp:
2025-12-14T17:15:57Z (2 days ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
79b77ce
Parents:
144fafd
Message:

Copy files (Navigator and command line).

TODO Overwrite query, new I/O error types.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/fmgt/src/walk.c

    r144fafd r2309891  
    4646#include "fmgt/walk.h"
    4747
    48 static errno_t fmgt_walk_subtree(fmgt_walk_params_t *, const char *);
     48static errno_t fmgt_walk_subtree(fmgt_walk_params_t *, const char *,
     49    const char *);
    4950
    5051/** Initialize walk parameters.
     
    6364 *
    6465 * @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 */
     71static errno_t fmgt_walk_file(fmgt_walk_params_t *params, const char *fname,
     72    const char *dest)
    7073{
    7174        if (params->cb->file != NULL)
    72                 return params->cb->file(params->arg, fname);
     75                return params->cb->file(params->arg, fname, dest);
    7376        else
    7477                return EOK;
     
    7881 *
    7982 * @param params Walk parameters
    80  * @param dname Directory path
     83 * @param dname Source directory
     84 * @param dest Destination path
    8185 * @return EOK on success or an error code
    8286 */
    8387static errno_t fmgt_walk_dir_enter(fmgt_walk_params_t *params,
    84     const char *dname)
     88    const char *dname, const char *dest)
    8589{
    8690        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);
    8892        else
    8993                return EOK;
     
    9498 * @param params Walk parameters
    9599 * @param dname Directory path
     100 * @param dest Destination path
    96101 * @return EOK on success or an error code
    97102 */
    98103static 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);
    103108        else
    104109                return EOK;
     
    109114 * @param params Walk parameters
    110115 * @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 */
     119static errno_t fmgt_walk_dir(fmgt_walk_params_t *params, const char *dname,
     120    const char *dest)
    114121{
    115122        DIR *dir = NULL;
    116123        struct dirent *de;
    117124        errno_t rc;
    118         char *pathname = NULL;
     125        char *srcpath = NULL;
     126        char *destpath = NULL;
    119127        int rv;
    120128
    121         rc = fmgt_walk_dir_enter(params, dname);
     129        rc = fmgt_walk_dir_enter(params, dname, dest);
    122130        if (rc != EOK)
    123131                goto error;
     
    131139        de = readdir(dir);
    132140        while (de != NULL) {
    133                 rv = asprintf(&pathname, "%s/%s", dname, de->d_name);
     141                rv = asprintf(&srcpath, "%s/%s", dname, de->d_name);
    134142                if (rv < 0) {
    135143                        rc = ENOMEM;
     
    137145                }
    138146
    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);
    140157                if (rc != EOK) {
    141                         free(pathname);
     158                        free(srcpath);
     159                        if (destpath != NULL)
     160                                free(destpath);
    142161                        goto error;
    143162                }
    144163
    145                 free(pathname);
     164                free(srcpath);
     165                if (destpath != NULL)
     166                        free(destpath);
    146167                de = readdir(dir);
    147168        }
    148169
    149         rc = fmgt_walk_dir_leave(params, dname);
     170        rc = fmgt_walk_dir_leave(params, dname, dest);
    150171        if (rc != EOK)
    151172                return rc;
     
    161182/** Walk subtree.
    162183 *
    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
    165187 *
    166188 * @return EOK on success or an error code.
    167189 */
    168 static errno_t fmgt_walk_subtree(fmgt_walk_params_t *params, const char *fname)
     190static errno_t fmgt_walk_subtree(fmgt_walk_params_t *params, const char *fname,
     191    const char *dest)
    169192{
    170193        vfs_stat_t stat;
     
    177200        if (stat.is_directory) {
    178201                /* Directory */
    179                 rc = fmgt_walk_dir(params, fname);
     202                rc = fmgt_walk_dir(params, fname, dest);
    180203                if (rc != EOK)
    181204                        return rc;
    182205        } else {
    183206                /* Not a directory */
    184                 rc = fmgt_walk_file(params, fname);
     207                rc = fmgt_walk_file(params, fname, dest);
    185208                if (rc != EOK)
    186209                        return rc;
     
    202225{
    203226        fmgt_flist_entry_t *entry;
     227        char *destname;
    204228        errno_t rc;
     229        int rv;
    205230
    206231        entry = fmgt_flist_first(params->flist);
    207232        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);
    209244                if (rc != EOK)
    210245                        return rc;
Note: See TracChangeset for help on using the changeset viewer.