diff --git a/CMakeLists.txt b/CMakeLists.txt index afad8123e..09f37d6d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 2.8.5) project(sway C) set(CMAKE_C_FLAGS "-g") set(CMAKE_C_STANDARD 99) +SET(CMAKE_C_EXTENSIONS OFF) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin/") add_definitions("-Wall -Wextra -Wno-unused-parameter") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMake) diff --git a/include/stringop.h b/include/stringop.h index dc81cdae6..49bfa771d 100644 --- a/include/stringop.h +++ b/include/stringop.h @@ -2,8 +2,13 @@ #define _SWAY_STRINGOP_H #include "list.h" +#if !HAVE_DECL_SETENV +// Not sure why we need to provide this +extern int setenv(const char *, const char *, int); +#endif + // array of whitespace characters to use for delims -extern const char *whitespace; +extern const char whitespace[]; char *strip_whitespace(char *str); char *strip_comments(char *str); diff --git a/sway/commands.c b/sway/commands.c index f2ee01843..80770e87f 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -5,8 +5,10 @@ #include #include #include +#include #include #include +#include #include "stringop.h" #include "layout.h" #include "focus.h" @@ -193,7 +195,7 @@ static enum cmd_status cmd_exec_always(int argc, char **argv) { sway_log(L_DEBUG, "Executing %s", cmd); pid_t pid; - if ((pid = vfork()) == 0) { + if ((pid = fork()) == 0) { execv("/bin/sh", args); _exit(-1); } else if (pid < 0) { diff --git a/sway/container.c b/sway/container.c index d6bcc4c24..4c523827c 100644 --- a/sway/container.c +++ b/sway/container.c @@ -1,7 +1,9 @@ #include #include #include +#include #include "config.h" +#include "stringop.h" #include "container.h" #include "workspace.h" #include "focus.h" diff --git a/sway/log.c b/sway/log.c index 3859fd925..a206d9719 100644 --- a/sway/log.c +++ b/sway/log.c @@ -80,9 +80,7 @@ void sway_log_errno(log_importance_t verbosity, char* format, ...) { va_end(args); fprintf(stderr, ": "); - char error[256]; - strerror_r(errno, error, sizeof(error)); - fprintf(stderr, "%s", error); + fprintf(stderr, "%s", strerror(errno)); if (colored && isatty(STDERR_FILENO)) { fprintf(stderr, "\x1B[0m"); diff --git a/sway/main.c b/sway/main.c index e03588ea4..669211840 100644 --- a/sway/main.c +++ b/sway/main.c @@ -3,9 +3,11 @@ #include #include #include +#include #include #include #include "layout.h" +#include "stringop.h" #include "config.h" #include "log.h" #include "readline.h" diff --git a/sway/stringop.c b/sway/stringop.c index 90f963d6d..31a036c35 100644 --- a/sway/stringop.c +++ b/sway/stringop.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include "stringop.h" @@ -7,7 +8,7 @@ #include "string.h" #include "list.h" -const char *whitespace = " \f\n\r\t\v"; +const char whitespace[] = " \f\n\r\t\v"; /* Note: This returns 8 characters for trimmed_start per tab character. */ char *strip_whitespace(char *_str) { @@ -313,13 +314,16 @@ char *join_list(list_t *list, char *separator) { } char *cmdsep(char **stringp, const char *delim) { - char *head = strsep(stringp, delim); - // But skip over trailing delims. '3 tokens here' -> '3' 'tokens here' - if (*stringp) { - *stringp += strspn(*stringp, delim); - // If skiping over delims brings us to the end of string, set to NULL - if (!**stringp) *stringp = NULL; - } + // skip over leading delims + char *head = *stringp + strspn(*stringp, delim); + // Find end token + char *tail = *stringp += strcspn(*stringp, delim); + // Set stringp to begining of next token + *stringp += strspn(*stringp, delim); + // Set stringp to null if last token + if (!**stringp) *stringp = NULL; + // Nullify end of first token + *tail = 0; return head; } @@ -358,3 +362,12 @@ char *argsep(char **stringp, const char *delim) { found: return start; } + +char *strdup(const char *str) { + char *dup = malloc(strlen(str) + 1); + if (dup) { + strcpy(dup, str); + } + return dup; +} + diff --git a/sway/workspace.c b/sway/workspace.c index 658f79bc7..c169c1cb8 100644 --- a/sway/workspace.c +++ b/sway/workspace.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "workspace.h" #include "layout.h" #include "list.h"