[PATCH] xfree86: support multiple sysconfigdir paths
Peter Hutterer
peter.hutterer at who-t.net
Thu Jul 10 17:56:41 PDT 2014
On Thu, Jul 10, 2014 at 04:04:40PM -0700, Aaron Plattner wrote:
> When the X server is compiled with --prefix set to something other than /usr,
> then it ends up with a nonstandard sysconfigdir in its .pc file. This causes
> various other components to install their xorg.conf.d snippets there.
>
> However, the X server first looks for /usr/share/X11/xorg.conf.d before looking
> in sysconfigdir. That means that if the system administrator installed anything
> that created that path, the user's custom sysconfigdir is not searched.
>
> Modify OpenConfigDir to scan for config files in all of the directories in
> SYS_CONFIGDIRPATH, rather than only looking in the first one that exists. Build
> the search path string based on the directories it finds.
>
> Signed-off-by: Aaron Plattner <aplattner at nvidia.com>
> ---
> An alternative would be to just drop the /usr/share/X11/%X hardcode and always
> look only in %D/X11/%X.
tbh, I'd prefer that, it seems to be a much more obvious behaviour
Cheers,
Peter
>
> hw/xfree86/common/xf86Config.c | 14 +++++-----
> hw/xfree86/parser/scan.c | 62 +++++++++++++++++++++++++++++++++++-------
> 2 files changed, 59 insertions(+), 17 deletions(-)
>
> diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
> index 481674de2955..49344ef8a471 100644
> --- a/hw/xfree86/common/xf86Config.c
> +++ b/hw/xfree86/common/xf86Config.c
> @@ -2372,7 +2372,7 @@ xf86HandleConfigFile(Bool autoconfig)
> XF86ConfLayoutPtr layout;
>
> if (!autoconfig) {
> - char *filename, *dirname, *sysdirname;
> + char *filename, *dirname, *sysdirpath;
> const char *filesearch, *dirsearch;
> MessageType filefrom = X_DEFAULT;
> MessageType dirfrom = X_DEFAULT;
> @@ -2392,7 +2392,7 @@ xf86HandleConfigFile(Bool autoconfig)
> dirfrom = X_CMDLINE;
>
> xf86initConfigFiles();
> - sysdirname = xf86openConfigDirFiles(SYS_CONFIGDIRPATH, NULL,
> + sysdirpath = xf86openConfigDirFiles(SYS_CONFIGDIRPATH, NULL,
> PROJECTROOT);
> dirname = xf86openConfigDirFiles(dirsearch, xf86ConfigDir, PROJECTROOT);
> filename = xf86openConfigFile(filesearch, xf86ConfigFile, PROJECTROOT);
> @@ -2416,15 +2416,15 @@ xf86HandleConfigFile(Bool autoconfig)
> "Unable to locate/open config directory: \"%s\"\n",
> xf86ConfigDir);
> }
> - if (sysdirname)
> - xf86MsgVerb(X_DEFAULT, 0, "Using system config directory \"%s\"\n",
> - sysdirname);
> - if (!filename && !dirname && !sysdirname)
> + if (sysdirpath)
> + xf86MsgVerb(X_DEFAULT, 0, "Using system config directory search "
> + "path \"%s\"\n", sysdirpath);
> + if (!filename && !dirname && !sysdirpath)
> return CONFIG_NOFILE;
>
> free(filename);
> free(dirname);
> - free(sysdirname);
> + free(sysdirpath);
> }
>
> if ((xf86configptr = xf86readConfigFile()) == NULL) {
> diff --git a/hw/xfree86/parser/scan.c b/hw/xfree86/parser/scan.c
> index a6c12957b5db..08784abb27d5 100644
> --- a/hw/xfree86/parser/scan.c
> +++ b/hw/xfree86/parser/scan.c
> @@ -786,6 +786,7 @@ AddConfigDirFiles(const char *dirpath, struct dirent **list, int num)
> for (i = 0; i < num; i++) {
> char *path;
> FILE *file;
> + int j;
>
> if (numFiles >= CONFIG_MAX_FILES) {
> if (!warnOnce) {
> @@ -797,6 +798,18 @@ AddConfigDirFiles(const char *dirpath, struct dirent **list, int num)
>
> path = malloc(PATH_MAX + 1);
> snprintf(path, PATH_MAX + 1, "%s/%s", dirpath, list[i]->d_name);
> +
> + /*
> + * Check if this config file was already opened. This can happen if the
> + * same config directory is scanned twice.
> + */
> + for (j = 0; j < numFiles; j++) {
> + if (!strcmp(configFiles[j].path, path)) {
> + free(path);
> + return 0;
> + }
> + }
> +
> file = fopen(path, "r");
> if (!file) {
> free(path);
> @@ -812,23 +825,40 @@ AddConfigDirFiles(const char *dirpath, struct dirent **list, int num)
> return openedFile;
> }
>
> +static char *
> +reallocStrCat(char *str, const char *append)
> +{
> + if (str) {
> + size_t newlen = strlen(str) + strlen(append) + 1;
> + char *newstr = realloc(str, newlen);
> +
> + if (newstr) {
> + strcat(newstr, append);
> + }
> +
> + return newstr;
> + } else {
> + return strdup(append);
> + }
> +}
> +
> /*
> * Given some searching parameters, locate and open the xorg config
> - * directory. The directory does not need to contain config files.
> + * directories. The directories do not need to contain config files.
> */
> static char *
> OpenConfigDir(const char *path, const char *cmdline, const char *projroot,
> const char *confname)
> {
> - char *dirpath = NULL, *pathcopy;
> + char *searchpath = NULL, *pathcopy;
> const char *template;
> - Bool found = FALSE;
> int cmdlineUsed = 0;
>
> pathcopy = strdup(path);
> - for (template = strtok(pathcopy, ","); template && !found;
> + for (template = strtok(pathcopy, ","); template;
> template = strtok(NULL, ",")) {
> struct dirent **list = NULL;
> + char *dirpath;
> int num;
>
> dirpath = DoSubstitution(template, cmdline, projroot,
> @@ -847,18 +877,30 @@ OpenConfigDir(const char *path, const char *cmdline, const char *projroot,
> list = NULL;
> num = 0;
> }
> - found = AddConfigDirFiles(dirpath, list, num);
> - if (!found) {
> - free(dirpath);
> - dirpath = NULL;
> + if (AddConfigDirFiles(dirpath, list, num)) {
> + /* append dirpath to the search path string */
> + char *newstr;
> +
> + if (searchpath) {
> + newstr = reallocStrCat(searchpath, ",");
> + if (newstr) {
> + searchpath = newstr;
> + }
> + }
> +
> + newstr = reallocStrCat(searchpath, dirpath);
> + if (newstr)
> + searchpath = newstr;
> +
> }
> + free(dirpath);
> while (num--)
> free(list[num]);
> free(list);
> }
>
> free(pathcopy);
> - return dirpath;
> + return searchpath;
> }
>
> /*
> @@ -947,7 +989,7 @@ xf86openConfigDirFiles(const char *path, const char *cmdline,
> if (!projroot || !projroot[0])
> projroot = PROJECTROOT;
>
> - /* Search for the multiconf directory */
> + /* Search for the multiconf directories */
> return OpenConfigDir(path, cmdline, projroot, XCONFIGDIR);
> }
>
> --
> 2.0.1
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list