[LIBREPORT PATCH] fixed the symlinks handling in get_file_list abrt/abrt#686

Richard Marko rmarko at redhat.com
Mon Sep 2 08:01:51 UTC 2013


Pushed all of them. Thanks! I've only removed the FIXME "why xml" note
from this patch as it was no longer valid.

R.

On 08/28/2013 06:44 PM, Jiri Moskovcak wrote:
> Signed-off-by: Jiri Moskovcak <jmoskovc at redhat.com>
> ---
>  src/include/file_obj.h |  4 ++++
>  src/lib/file_list.c    | 50 ++++++++++++++++++++++++++++++++++----------------
>  src/lib/file_obj.c     | 10 ++++++++++
>  3 files changed, 48 insertions(+), 16 deletions(-)
>
> diff --git a/src/include/file_obj.h b/src/include/file_obj.h
> index 08823af..4f46bf6 100644
> --- a/src/include/file_obj.h
> +++ b/src/include/file_obj.h
> @@ -30,3 +30,7 @@ typedef struct file_obj
>      char *filename;
>      char *fullpath; //the full path with extension
>  } file_obj_t;
> +
> +void free_file_obj(file_obj_t *f);
> +const char *fo_get_fullpath(file_obj_t *fo);
> +const char *fo_get_filename(file_obj_t *fo);
> diff --git a/src/lib/file_list.c b/src/lib/file_list.c
> index 49cc4e1..3d0e43d 100644
> --- a/src/lib/file_list.c
> +++ b/src/lib/file_list.c
> @@ -31,14 +31,21 @@ GList *get_file_list(const char *path, const char *ext_filter)
>      struct dirent *dent;
>      while ((dent = readdir(dir)) != NULL)
>      {
> -        char *ext = strrchr(dent->d_name, '.');
> -        if (!ext)
> +        /* skip . and .. */
> +        if (strcmp(dent->d_name, ".") == 0 || strcmp(dent->d_name, "..") == 0)
>              continue;
> -        if (ext_filter && strcmp(ext + 1, ext_filter) != 0)
> -            continue;
> -
>          char *fullname = concat_path_file(path, dent->d_name);
> -        *ext = '\0';
> +        char *ext = NULL;
> +
> +        if (ext_filter)
> +        {
> +            ext = strrchr(dent->d_name, '.');
> +            if (!ext)
> +                continue;
> +            if (ext_filter && strcmp(ext + 1, ext_filter) != 0)
> +                continue;
> +            *ext = '\0';
> +        }
>  
>  //TODO: get rid of special handling of symlinks?
>          struct stat buf;
> @@ -50,20 +57,31 @@ GList *get_file_list(const char *path, const char *ext_filter)
>              GError *error = NULL;
>              gchar *link = g_file_read_link(fullname, &error);
>              if (error != NULL)
> -                error_msg_and_die("Error reading symlink '%s': %s", fullname, error->message);
> +            {
> +                error_msg("Error reading symlink '%s': %s", fullname, error->message);
> +                goto next;
> +            }
>  
>              gchar *target = g_path_get_basename(link);
> -            char *ext = strrchr(target, '.');
> +            VERB3 log("Symlink '%s' is pointing to '%s'", link, target);
> +            if (ext_filter)
> +            {
> +                char *ext = strrchr(target, '.');
>  
> -//FIXME: why "xml"? Shouldn't it be ext_filter?
> -            if (!ext || 0 != strcmp(ext + 1, "xml"))
> -                error_msg_and_die("Invalid event symlink '%s': expected it to"
> -                                  " point to another xml file", fullname);
> -            *ext = '\0';
> -            //@@TODO symlink handling is broken!!
> -            //g_hash_table_replace(g_event_config_symlinks, xstrdup(dent->d_name), target);
> +    //FIXME: why "xml"? Shouldn't it be ext_filter?
> +                if (!ext || 0 != strcmp(ext + 1, ext_filter))
> +                {
> +                    error_msg("Invalid event symlink '%s': expected it to"
> +                              " point to another '%s' file", fullname, ext_filter);
> +                    goto next;
> +                }
> +                *ext = '\0';
> +            }
> +            free(fullname);
> +            fullname = concat_path_file(path, target);
> +            files = g_list_prepend(files, new_file_obj(fullname, target));
>              g_free(link);
> -            /* don't free target, it is owned by the hash table now */
> +            g_free(target);
>  
>              goto next;
>          }
> diff --git a/src/lib/file_obj.c b/src/lib/file_obj.c
> index 4aaffb8..bbb5b9f 100644
> --- a/src/lib/file_obj.c
> +++ b/src/lib/file_obj.c
> @@ -36,3 +36,13 @@ void free_file_obj(file_obj_t *f)
>      free(f->filename);
>      free(f);
>  }
> +
> +const char *fo_get_fullpath(file_obj_t *fo)
> +{
> +    return fo->fullpath;
> +}
> +
> +const char *fo_get_filename(file_obj_t *fo)
> +{
> +    return fo->filename;
> +}
> \ No newline at end of file



More information about the Crash-catcher mailing list