Skip to content

Commit aeaa474

Browse files
committed
Initial work on migrating to XDG/Windows/macOS standard directory locations.
1 parent 17316a3 commit aeaa474

2 files changed

Lines changed: 67 additions & 31 deletions

File tree

cups/cups-private.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,9 @@ typedef enum _cups_uatokens_e /**** UserAgentTokens values */
7575
typedef struct _cups_globals_s /**** CUPS global state data ****/
7676
{
7777
/* Multiple places... */
78-
const char *cups_datadir, /* CUPS_DATADIR environment var */
79-
*cups_serverbin,/* CUPS_SERVERBIN environment var */
80-
*cups_serverroot,
81-
/* CUPS_SERVERROOT environment var */
82-
*cups_statedir, /* CUPS_STATEDIR environment var */
83-
*home, /* HOME environment var */
84-
*localedir; /* LOCALDIR environment var */
78+
const char *datadir, // Data directory (CUPS_DATADIR environment var)
79+
*sysconfig, // System config files (CUPS_SERVERROOT environment var)
80+
*userconfig; // User-specific config files (various environment vars)
8581
#ifndef _WIN32
8682
#define PW_BUF_SIZE 16384 /* As per glibc manual page */
8783
char pw_buf[PW_BUF_SIZE];

cups/globals.c

Lines changed: 64 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ cups_globals_alloc(void)
269269

270270
DEBUG_printf(("cups_globals_alloc: USERPROFILE=\"%s\"", userprofile));
271271

272-
strlcpy(homedir, userprofile, sizeof(homedir));
272+
snprintf(homedir, sizeof(homedir), "%s/AppData/Local/cups", userprofile);
273273
for (homeptr = homedir; *homeptr; homeptr ++)
274274
{
275275
// Convert back slashes to forward slashes
@@ -283,6 +283,15 @@ cups_globals_alloc(void)
283283
cg->home = homedir;
284284

285285
#else
286+
const char *home = getenv("HOME"); // HOME environment variable
287+
char homedir[1024], // Home directory from account
288+
temp[1024]; // Temporary directory string
289+
# ifndef __APPLE__
290+
const char *snap_common = getenv("SNAP_COMMON"),
291+
*xdg_config_home = getenv("XDG_CONFIG_HOME");
292+
// Environment variables
293+
# endif // !__APPLE__
294+
286295
# ifdef HAVE_GETEUID
287296
if ((geteuid() != getuid() && getuid()) || getegid() != getgid())
288297
# else
@@ -291,48 +300,79 @@ cups_globals_alloc(void)
291300
{
292301
/*
293302
* When running setuid/setgid, don't allow environment variables to override
294-
* the directories...
303+
* the system directories...
295304
*/
296305

297-
cg->cups_datadir = CUPS_DATADIR;
298-
cg->cups_serverbin = CUPS_SERVERBIN;
299-
cg->cups_serverroot = CUPS_SERVERROOT;
300-
cg->cups_statedir = CUPS_STATEDIR;
301-
cg->localedir = CUPS_LOCALEDIR;
306+
cg->datadir = CUPS_DATADIR;
307+
cg->sysconfig = CUPS_SERVERROOT;
302308
}
303309
else
304310
{
305311
/*
306312
* Allow directories to be overridden by environment variables.
307313
*/
308314

309-
if ((cg->cups_datadir = getenv("CUPS_DATADIR")) == NULL)
310-
cg->cups_datadir = CUPS_DATADIR;
311-
312-
if ((cg->cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL)
313-
cg->cups_serverbin = CUPS_SERVERBIN;
314-
315-
if ((cg->cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL)
316-
cg->cups_serverroot = CUPS_SERVERROOT;
317-
318-
if ((cg->cups_statedir = getenv("CUPS_STATEDIR")) == NULL)
319-
cg->cups_statedir = CUPS_STATEDIR;
315+
if ((cg->datadir = getenv("CUPS_DATADIR")) == NULL)
316+
cg->datadir = CUPS_DATADIR;
320317

321-
if ((cg->localedir = getenv("LOCALEDIR")) == NULL)
322-
cg->localedir = CUPS_LOCALEDIR;
323-
324-
cg->home = getenv("HOME");
318+
if ((cg->sysconfig = getenv("CUPS_SERVERROOT")) == NULL)
319+
cg->sysconfig = CUPS_SERVERROOT;
325320
}
326321

327-
if (!cg->home)
322+
# ifdef __APPLE__
323+
if (!home)
324+
#else
325+
if (!home && (!xdg_config_home || !xdg_state_home))
326+
# endif // __APPLE__
328327
{
329328
struct passwd pw; // User info
330329
struct passwd *result; // Auxiliary pointer
331330

332331
getpwuid_r(getuid(), &pw, cg->pw_buf, PW_BUF_SIZE, &result);
333332
if (result)
334-
cg->home = _cupsStrAlloc(pw.pw_dir);
333+
{
334+
cupsCopyString(homedir, pw.pw_dir, sizeof(homedir));
335+
home = homedir;
336+
}
337+
}
338+
339+
# ifdef __APPLE__
340+
if (home)
341+
{
342+
snprintf(temp, sizeof(temp), "%s/Library/Application Support/cups", home);
343+
cg->userconfig = _cupsStrAlloc(temp);
344+
}
345+
else
346+
{
347+
snprintf(temp, sizeof(temp), "/private/tmp/cups%u", (unsigned)getuid());
348+
cg->userconfig = _cupsStrAlloc(temp);
349+
}
350+
351+
# else
352+
if (snap_common)
353+
{
354+
snprintf(temp, sizeof(temp), "%s/cups", snap_common);
355+
cg->userconfig = _cupsStrAlloc(temp);
356+
}
357+
else if (xdg_config_home)
358+
{
359+
snprintf(temp, sizeof(temp), "%s/cups", xdg_config_home);
360+
cg->userconfig = _cupsStrAlloc(temp);
361+
}
362+
else if (home)
363+
{
364+
// Use ~/.cups if it exists, otherwise ~/.config/cups
365+
snprintf(temp, sizeof(temp), "%s/.cups", home);
366+
if (access(temp, 0))
367+
snprintf(temp, sizeof(temp), "%s/.config/cups", home);
368+
cg->userconfig = _cupsStrAlloc(temp);
369+
}
370+
else
371+
{
372+
snprintf(temp, sizeof(temp), "/tmp/cups%u", (unsigned)getuid());
373+
cg->userconfig = _cupsStrAlloc(temp);
335374
}
375+
# endif // __APPLE__
336376
#endif // _WIN32
337377

338378
return (cg);

0 commit comments

Comments
 (0)