From 7e81e58e7d1f540e448f3827751f75bf54b1fe9f Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 1 Sep 2018 11:45:48 +1000 Subject: [PATCH] Allow reload command to exist anywhere in the command string This fixes a crash if you have commands where reload appears in the middle or at the end, such as `bindsym r mode default, reload`. --- common/stringop.c | 14 ++++++++++++++ include/stringop.h | 2 ++ sway/commands/bind.c | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/common/stringop.c b/common/stringop.c index d9ae99256..d2c91c249 100644 --- a/common/stringop.c +++ b/common/stringop.c @@ -401,3 +401,17 @@ char *argsep(char **stringp, const char *delim) { found: return start; } + +const char *strcasestr(const char *haystack, const char *needle) { + size_t needle_len = strlen(needle); + const char *pos = haystack; + const char *end = pos + strlen(haystack) - needle_len; + + while (pos <= end) { + if (strncasecmp(pos, needle, needle_len) == 0) { + return pos; + } + ++pos; + } + return NULL; +} diff --git a/include/stringop.h b/include/stringop.h index e7f580112..01bbdaa9a 100644 --- a/include/stringop.h +++ b/include/stringop.h @@ -46,4 +46,6 @@ char *cmdsep(char **stringp, const char *delim); // Split string into 2 by delim, handle quotes char *argsep(char **stringp, const char *delim); +const char *strcasestr(const char *haystack, const char *needle); + #endif diff --git a/sway/commands/bind.c b/sway/commands/bind.c index e73b0aeaa..b134c92f9 100644 --- a/sway/commands/bind.c +++ b/sway/commands/bind.c @@ -310,7 +310,7 @@ void seat_execute_command(struct sway_seat *seat, struct sway_binding *binding) bool reload = false; // if this is a reload command we need to make a duplicate of the // binding since it will be gone after the reload has completed. - if (strncasecmp(binding->command, "reload", 6) == 0) { + if (strcasestr(binding->command, "reload")) { reload = true; binding_copy = sway_binding_dup(binding); if (!binding_copy) {