15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) This file is not licenced under the GPL like the rest of the code. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Its is under the MIT license, to encourage reuse by cut-and-paste. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copyright (c) 2007 Red Hat, inc 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Permission is hereby granted, free of charge, to any person 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obtaining a copy of this software and associated documentation files 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (the "Software"), to deal in the Software without restriction, 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) including without limitation the rights to use, copy, modify, merge, 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) publish, distribute, sublicense, and/or sell copies of the Software, 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) and to permit persons to whom the Software is furnished to do so, 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subject to the following conditions: 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) The above copyright notice and this permission notice shall be 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) included in all copies or substantial portions of the Software. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOFTWARE. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xdg_user_dir_lookup_with_fallback: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: a string specifying the type of directory 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @fallback: value to use if the directory isn't specified by the user 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @returns: a newly allocated absolute pathname 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Looks up a XDG user directory of the specified type. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Example of types are "DESKTOP" and "DOWNLOAD". 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * In case the user hasn't specified any directory for the specified 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * type the value returned is @fallback. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The return value is newly allocated and must be freed with 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * free(). The return value is never NULL if @fallback != NULL, unless 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * out of memory. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) **/ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char * 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xdg_user_dir_lookup_with_fallback (const char *type, const char *fallback) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE *file; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *home_dir, *config_home, *config_file; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buffer[512]; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *user_dir; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *p, *d; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int relative; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) home_dir = getenv ("HOME"); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (home_dir == NULL) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_home = getenv ("XDG_CONFIG_HOME"); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (config_home == NULL || config_home[0] == 0) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_file = (char*) malloc (strlen (home_dir) + strlen ("/.config/user-dirs.dirs") + 1); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (config_file == NULL) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strcpy (config_file, home_dir); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strcat (config_file, "/.config/user-dirs.dirs"); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_file = (char*) malloc (strlen (config_home) + strlen ("/user-dirs.dirs") + 1); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (config_file == NULL) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strcpy (config_file, config_home); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strcat (config_file, "/user-dirs.dirs"); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file = fopen (config_file, "r"); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) free (config_file); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file == NULL) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_dir = NULL; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (fgets (buffer, sizeof (buffer), file)) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Remove newline at end */ 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = strlen (buffer); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (len > 0 && buffer[len-1] == '\n') 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer[len-1] = 0; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = buffer; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*p == ' ' || *p == '\t') 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strncmp (p, "XDG_", 4) != 0) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p += 4; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strncmp (p, type, strlen (type)) != 0) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p += strlen (type); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strncmp (p, "_DIR", 4) != 0) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p += 4; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*p == ' ' || *p == '\t') 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*p != '=') 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*p == ' ' || *p == '\t') 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*p != '"') 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relative = 0; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strncmp (p, "$HOME/", 6) == 0) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p += 6; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relative = 1; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (*p != '/') 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (relative) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_dir = (char*) malloc (strlen (home_dir) + 1 + strlen (p) + 1); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_dir == NULL) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error2; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strcpy (user_dir, home_dir); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strcat (user_dir, "/"); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_dir = (char*) malloc (strlen (p) + 1); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_dir == NULL) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error2; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *user_dir = 0; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d = user_dir + strlen (user_dir); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*p && *p != '"') 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*p == '\\') && (*(p+1) != 0)) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *d++ = *p++; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *d = 0; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error2: 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fclose (file); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_dir) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return user_dir; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error: 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fallback) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return strdup (fallback); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xdg_user_dir_lookup: 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: a string specifying the type of directory 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @returns: a newly allocated absolute pathname 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Looks up a XDG user directory of the specified type. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Example of types are "DESKTOP" and "DOWNLOAD". 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The return value is always != NULL (unless out of memory), 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and if a directory 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for the type is not specified by the user the default 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is the home directory. Except for DESKTOP which defaults 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to ~/Desktop. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The return value is newly allocated and must be freed with 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * free(). 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) **/ 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char * 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xdg_user_dir_lookup (const char *type) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *dir, *home_dir, *user_dir; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dir = xdg_user_dir_lookup_with_fallback (type, NULL); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dir != NULL) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dir; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) home_dir = getenv ("HOME"); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (home_dir == NULL) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return strdup ("/tmp"); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Special case desktop for historical compatibility */ 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp (type, "DESKTOP") == 0) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_dir = (char*) malloc (strlen (home_dir) + strlen ("/Desktop") + 1); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_dir == NULL) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strcpy (user_dir, home_dir); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strcat (user_dir, "/Desktop"); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return user_dir; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return strdup (home_dir); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef STANDALONE_XDG_USER_DIR_LOOKUP 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)main (int argc, char *argv[]) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (argc != 2) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf (stderr, "Usage %s <dir-type>\n", argv[0]); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit (1); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf ("%s\n", xdg_user_dir_lookup (argv[1])); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 233