@@ -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