--- hw/xfree86/parser/InputClass.c.orig 2010-08-13 07:53:48.000000000 +0200 +++ hw/xfree86/parser/InputClass.c 2010-08-23 15:55:16.000000000 +0200 @@ -65,6 +65,47 @@ xf86ConfigSymTabRec InputClassTab[] = #define TOKEN_SEP "|" +/* + * Tokenize a string into a NULL terminated array of strings. Always returns + * an allocated array unless an error occurs. + */ +char** +m_xstrtokenize(const char *str, const char *separators) +{ + char **list, **nlist; + char *tok, *tmp; + unsigned num = 0, n; + + if (!str) + return NULL; + list = calloc(1, sizeof(*list)); + if (!list) + return NULL; + tmp = strdup(str); + if (!tmp) + goto error; + for (tok = strtok(tmp, separators); tok; tok = strtok(NULL, separators)) { + nlist = realloc(list, (num + 2) * sizeof(*list)); + if (!nlist) + goto error; + list = nlist; + list[num] = strdup(tok); + if (!list[num]) + goto error; + list[++num] = NULL; + } + free(tmp); + return list; + +error: + free(tmp); + for (n = 0; n < num; n++) + free(list[n]); + free(list); + return NULL; +} + + static void add_group_entry(struct list *head, char **values) { @@ -125,49 +166,49 @@ xf86parseInputClassSection(void) if (xf86getSubToken(&(ptr->comment)) != STRING) Error(QUOTE_MSG, "MatchProduct"); add_group_entry(&ptr->match_product, - xstrtokenize(val.str, TOKEN_SEP)); + m_xstrtokenize(val.str, TOKEN_SEP)); break; case MATCH_VENDOR: if (xf86getSubToken(&(ptr->comment)) != STRING) Error(QUOTE_MSG, "MatchVendor"); add_group_entry(&ptr->match_vendor, - xstrtokenize(val.str, TOKEN_SEP)); + m_xstrtokenize(val.str, TOKEN_SEP)); break; case MATCH_DEVICE_PATH: if (xf86getSubToken(&(ptr->comment)) != STRING) Error(QUOTE_MSG, "MatchDevicePath"); add_group_entry(&ptr->match_device, - xstrtokenize(val.str, TOKEN_SEP)); + m_xstrtokenize(val.str, TOKEN_SEP)); break; case MATCH_OS: if (xf86getSubToken(&(ptr->comment)) != STRING) Error(QUOTE_MSG, "MatchOS"); add_group_entry(&ptr->match_os, - xstrtokenize(val.str, TOKEN_SEP)); + m_xstrtokenize(val.str, TOKEN_SEP)); break; case MATCH_PNPID: if (xf86getSubToken(&(ptr->comment)) != STRING) Error(QUOTE_MSG, "MatchPnPID"); add_group_entry(&ptr->match_pnpid, - xstrtokenize(val.str, TOKEN_SEP)); + m_xstrtokenize(val.str, TOKEN_SEP)); break; case MATCH_USBID: if (xf86getSubToken(&(ptr->comment)) != STRING) Error(QUOTE_MSG, "MatchUSBID"); add_group_entry(&ptr->match_usbid, - xstrtokenize(val.str, TOKEN_SEP)); + m_xstrtokenize(val.str, TOKEN_SEP)); break; case MATCH_DRIVER: if (xf86getSubToken(&(ptr->comment)) != STRING) Error(QUOTE_MSG, "MatchDriver"); add_group_entry(&ptr->match_driver, - xstrtokenize(val.str, TOKEN_SEP)); + m_xstrtokenize(val.str, TOKEN_SEP)); break; case MATCH_TAG: if (xf86getSubToken(&(ptr->comment)) != STRING) Error(QUOTE_MSG, "MatchTag"); add_group_entry(&ptr->match_tag, - xstrtokenize(val.str, TOKEN_SEP)); + m_xstrtokenize(val.str, TOKEN_SEP)); break; case MATCH_IS_KEYBOARD: if (xf86getSubToken(&(ptr->comment)) != STRING) --- hw/xfree86/parser/Layout.c +++ hw/xfree86/parser/Layout.c @@ -449,7 +449,10 @@ /* add all AutoServerLayout devices to the server layout */ while (input) { - if (xf86CheckBoolOption(input->inp_option_lst, "AutoServerLayout", FALSE)) + Bool asl_value = FALSE; + char *s = xf86findOptionValue(input->inp_option_lst ,"AutoServerLayout"); + Bool asl_found = xf86getBoolValue(&asl_value, s); + if (asl_found == TRUE && asl_value == TRUE) { XF86ConfInputrefPtr iref = layout->lay_input_lst;