These will replace the custom udev rules we currently have in place. Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> --- meson.build | 3 ++ test/litest-int.h | 1 + test/litest.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+)
diff --git a/meson.build b/meson.build index b8735ced..5e4db287 100644 --- a/meson.build +++ b/meson.build @@ -216,6 +216,9 @@ quirks_data = [ 'data/50-system-system76.quirks', ] +config_h.set_quoted('LIBINPUT_DATA_FILES', ':'.join(quirks_data)) +config_h.set_quoted('LIBINPUT_DATA_SRCDIR', join_paths(meson.source_root(), 'data')) + install_data(quirks_data, install_dir : libinput_data_path) src_libquirks = [ diff --git a/test/litest-int.h b/test/litest-int.h index 6384e4da..1cdae730 100644 --- a/test/litest-int.h +++ b/test/litest-int.h @@ -70,6 +70,7 @@ struct litest_test_device { struct litest_device_interface *interface; const char *udev_rule; + const char *quirk_file; }; struct litest_device_interface { diff --git a/test/litest.c b/test/litest.c index 9d711098..13f0a4fa 100644 --- a/test/litest.c +++ b/test/litest.c @@ -87,6 +87,7 @@ struct list created_files_list; /* list of all files to remove at the end of static void litest_init_udev_rules(struct list *created_files_list); static void litest_remove_udev_rules(struct list *created_files_list); +static char *litest_install_quirks(struct list *created_files_list); /* defined for the litest selftest */ #ifndef LITEST_DISABLE_BACKTRACE_LOGGING @@ -999,6 +1000,7 @@ litest_run(int argc, char **argv) { int failed = 0; int inhibit_lock_fd; + char *quirks_dir; list_init(&created_files_list); @@ -1012,6 +1014,10 @@ litest_run(int argc, char **argv) verbose = 1; litest_init_udev_rules(&created_files_list); + quirks_dir = litest_install_quirks(&created_files_list); + + setenv("LIBINPUT_DATA_DIR", quirks_dir, 1); + free(quirks_dir); litest_setup_sighandler(SIGINT); @@ -1177,6 +1183,86 @@ litest_install_model_quirks(struct list *created_files_list) list_insert(created_files_list, &file->link); } +static char * +litest_init_device_quirk_file(const char *data_dir, + struct litest_test_device *dev) +{ + int fd; + FILE *f; + char path[PATH_MAX]; + static int count; + + if (!dev->quirk_file) + return NULL; + + snprintf(path, sizeof(path), + "%s/99-%03d-%s.quirks", + data_dir, + ++count, + dev->shortname); + fd = open(path, O_CREAT|O_WRONLY, 0644); + litest_assert_int_ne(fd, -1); + f = fdopen(fd, "w"); + litest_assert_notnull(f); + litest_assert_int_ge(fputs(dev->quirk_file, f), 0); + fclose(f); + + return safe_strdup(path); +} + + +static char * +litest_install_quirks(struct list *created_files_list) +{ + struct litest_test_device **dev = devices; + struct created_file *file; + char dirname[PATH_MAX] = "/run/litest-XXXXXX"; + char **quirks, **q; + + litest_assert_notnull(mkdtemp(dirname)); + litest_assert_int_ne(chmod(dirname, 0755), -1); + + quirks = strv_from_string(LIBINPUT_DATA_FILES, ":"); + litest_assert(quirks); + + q = quirks; + while (*q) { + char *filename; + char dest[PATH_MAX]; + char src[PATH_MAX]; + + litest_assert(strneq(*q, "data/", 5)); + filename = &(*q)[5]; + + snprintf(src, sizeof(src), "%s/%s", LIBINPUT_DATA_SRCDIR, filename); + snprintf(dest, sizeof(dest), "%s/%s", dirname, filename); + file = litest_copy_file(dest, src, NULL); + list_append(created_files_list, &file->link); + q++; + } + strv_free(quirks); + + /* Now add the per-device special config files */ + + while (*dev) { + char *path; + + path = litest_init_device_quirk_file(dirname, *dev); + if (path) { + struct created_file *file = zalloc(sizeof(*file)); + file->path = path; + list_insert(created_files_list, &file->link); + } + dev++; + } + + file = zalloc(sizeof *file); + file->path = safe_strdup(dirname); + list_append(created_files_list, &file->link); + + return safe_strdup(dirname); +} + static inline void mkdir_p(const char *dir) { -- 2.14.4 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel