[pulseaudio-discuss] [PATCH] modules: support XDG_DATA_DIRS when find desktop files

Tanu Kaskinen tanuk at iki.fi
Wed Nov 1 10:19:01 UTC 2017


On Tue, 2017-10-31 at 11:46 +0800, Iceyer wrote:
> ---
>  src/modules/module-augment-properties.c | 63 +++++++++++++++++++++------------
>  1 file changed, 40 insertions(+), 23 deletions(-)
> 
> diff --git a/src/modules/module-augment-properties.c b/src/modules/module-augment-properties.c
> index 541f0e79..56217d51 100644
> --- a/src/modules/module-augment-properties.c
> +++ b/src/modules/module-augment-properties.c
> @@ -144,37 +144,54 @@ static void update_rule(struct rule *r) {
>          { NULL, NULL, NULL, NULL },
>      };
>      bool found = false;
> +    const char *state = NULL;
> +    const char *xdg_data_dirs = NULL;
> +    char *data_dir = NULL;
> +    char *desktop_file_dir = NULL;
>  
>      pa_assert(r);
> -    fn = pa_sprintf_malloc(DESKTOPFILEDIR PA_PATH_SEP "%s.desktop", r->process_name);
>  
> -    if (stat(fn, &st) == 0)
> -        found = true;
> -    else {
> +    if ((xdg_data_dirs = getenv("XDG_DATA_DIRS"))) {

The case where XDG_DATA_DIRS is not set needs to be handled too. Now
you just give up entirely if XDG_DATA_DIRS is not set.

> +      while(data_dir = pa_split(xdg_data_dirs, ":", &state)) {

Please use 4 spaces for indenting, and a space between "while" and "(".

> +        desktop_file_dir = pa_sprintf_malloc("%s" PA_PATH_SEP "applications", data_dir);
> +        fn = pa_sprintf_malloc("%s" PA_PATH_SEP "%s.desktop", desktop_file_dir, r->process_name);
> +        if (stat(fn, &st) == 0) {
> +            found = true;
> +            break;

desktop_file_dir has to be freed.

> +        } else {
>  #ifdef DT_DIR
> -        DIR *desktopfiles_dir;
> -        struct dirent *dir;
> -
> -        /* Let's try a more aggressive search, but only one level */
> -        if ((desktopfiles_dir = opendir(DESKTOPFILEDIR))) {
> -            while ((dir = readdir(desktopfiles_dir))) {
> -                if (dir->d_type != DT_DIR
> -                    || pa_streq(dir->d_name, ".")
> -                    || pa_streq(dir->d_name, ".."))
> -                    continue;
> -
> -                pa_xfree(fn);
> -                fn = pa_sprintf_malloc(DESKTOPFILEDIR PA_PATH_SEP "%s" PA_PATH_SEP "%s.desktop", dir->d_name, r->process_name);
> -
> -                if (stat(fn, &st) == 0) {
> -                    found = true;
> -                    break;
> +            DIR *desktopfiles_dir;
> +            struct dirent *dir;
> +
> +            /* Let's try a more aggressive search, but only one level */
> +            if ((desktopfiles_dir = opendir(desktop_file_dir))) {
> +                while ((dir = readdir(desktopfiles_dir))) {
> +                    if (dir->d_type != DT_DIR
> +                        || pa_streq(dir->d_name, ".")
> +                        || pa_streq(dir->d_name, ".."))
> +                        continue;
> +
> +                    pa_xfree(fn);
> +                    fn = pa_sprintf_malloc("%s" PA_PATH_SEP "%s" PA_PATH_SEP "%s.desktop", desktop_file_dir, dir->d_name, r->process_name);
> +
> +                    if (stat(fn, &st) == 0) {
> +                        found = true;
> +                        break;
> +                    }
>                  }
> +                closedir(desktopfiles_dir);
> +                if (found)
> +                    break;

desktop_file_dir has to be freed.

>              }
> -            closedir(desktopfiles_dir);
> -        }
>  #endif
> +        }
> +        pa_xfree(desktop_file_dir);

data_dir and fn have to be freed.

-- 
Tanu

https://www.patreon.com/tanuk


More information about the pulseaudio-discuss mailing list