#include #include #include #include #include #include #include int main() { FILE *fd; char buffer[BUFSIZ]; char dest[PATH_MAX]; char *dirfile = ".config/user-dirs.dirs"; char *configfile = getenv("XDG_CONFIG_FILE"); char *home = getenv("HOME"); char picturesdir[PATH_MAX]; if ( !configfile ) { if ( home ) { snprintf( dest, sizeof(dest), "%s/%s", home, dirfile); } else { printf( "no $HOME defined, bailing out!\n"); return -1; } configfile = dest; } if ( ( fd = fopen( configfile, "r" ) ) < 0) { printf( "Failed to open %s\n", configfile ); return -1; } while(!feof(fd)){ fgets(buffer, sizeof(buffer), fd); if(strncmp(buffer, "XDG_PICTURES_DIR", sizeof("XDG_PICTURES_DIR")-1) == 0) { int relative = 0; int len =0; char *p; char *d; p = buffer; p += sizeof("XDG_PICTURES_DIR")-1; if (*p != '=') break; p++; if (*p != '"') break; p++; if (strncmp (p, "$HOME", 5) == 0) { p+=5; relative=1; } else if (*p != '/') { break; } d = strrchr (p, '"'); if (!d) break; *d = 0; d = p; len = strlen(d); if (d[len-1] == '/') d[len-1] =0; if (relative) { snprintf( picturesdir, sizeof(picturesdir), "%s%s", home, d); } else snprintf( picturesdir, sizeof(picturesdir), "%s", d); } } if (strlen(picturesdir) >0) { printf ("XDG_PICTURES_DIR is: %s\n", picturesdir); } else { printf ("XDG_PICTURES_DIR not found or invalid!\n"); } return 0; } ~/.config/user-dirs.dirs # This file is written by xdg-user-dirs-update # If you want to change or add directories, just edit the line you're # interested in. All local changes will be retained on the next run # Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped # homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an # absolute path. No other format is supported. # XDG_PICTURES_DIR="$HOME/Desktop" XDG_DESKTOP_DIR="$HOME/Desktop" XDG_DOWNLOAD_DIR="$HOME/Загрузки" XDG_TEMPLATES_DIR="$HOME/Шаблоны" XDG_PUBLICSHARE_DIR="$HOME/Общедоступные" XDG_DOCUMENTS_DIR="$HOME/Документы" XDG_MUSIC_DIR="$HOME/Музыка" XDG_VIDEOS_DIR="$HOME/Видео"