Compare commits

...

8 Commits

Author SHA1 Message Date
1b9d89cab3 Use kqueue on Darwin as well
Since poll() is implemented in terms of kqueue() there,
it doesn't seem like this could have improved anything.

Besides man 3 ev, libevent code, and [1],
I haven't managed to find much relevant information.

[1] https://daniel.haxx.se/blog/2016/10/11/poll-on-mac-10-12-is-broken/
2021-09-29 12:07:25 +02:00
a3ad5e7751 Ignore empty XDG_*_DIRS env. variables
As the specification says we should.  GLib does this as well.

It is still possible to achieve an empty set by using ":",
which are two non-absolute paths that should be ignored.
GLib doesn't implement this.  Thus, we're now better than GLib.
2021-09-26 08:49:51 +02:00
960420df3e Escape DEL character in config_item_write_string() 2020-10-31 21:28:29 +01:00
d71c47f8ce CMakeLists.txt: omit end{if,foreach} expressions
Their usefulness was almost negative.
2020-10-29 15:32:26 +01:00
425ea57b17 CMakeLists.txt: clean up OpenBSD support
A few things might have changed.
2020-10-29 15:31:05 +01:00
8822d06091 Don't suppress -Wimplicit-fallthrough
Might have already been resolved by: 9494e8e da75b6f
2020-10-26 18:25:32 +01:00
9639777814 Fix validation of overlong UTF-8
It was too strict and Egyptian dicks didn't want to pass,
so we'll do it half-arsedly for a subset.
2020-10-24 19:09:09 +02:00
929229a1d7 Fix config PEG grammar to match strtoll() 2020-10-24 08:05:17 +02:00
3 changed files with 27 additions and 30 deletions

View File

@@ -4,9 +4,9 @@ cmake_minimum_required (VERSION 2.8.5)
# Moar warnings # Moar warnings
if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC) if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC)
# -Wunused-function is pretty annoying here, as everything is static # -Wunused-function is pretty annoying here, as everything is static
set (wdisabled "-Wno-unused-function -Wno-implicit-fallthrough") set (wdisabled "-Wno-unused-function")
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Wall -Wextra ${wdisabled}") set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Wall -Wextra ${wdisabled}")
endif ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC) endif ()
# Dependencies # Dependencies
set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
@@ -16,11 +16,9 @@ find_package (PkgConfig REQUIRED)
pkg_check_modules (libssl REQUIRED libssl libcrypto) pkg_check_modules (libssl REQUIRED libssl libcrypto)
if ("${CMAKE_SYSTEM_NAME}" MATCHES "BSD") if ("${CMAKE_SYSTEM_NAME}" MATCHES "BSD")
include_directories (/usr/local/include)
link_directories (/usr/local/lib)
# Our POSIX version macros make these undefined # Our POSIX version macros make these undefined
add_definitions (-D__BSD_VISIBLE=1 -D_BSD_SOURCE=1) add_definitions (-D__BSD_VISIBLE=1 -D_BSD_SOURCE=1)
endif ("${CMAKE_SYSTEM_NAME}" MATCHES "BSD") endif ()
set (common_libraries ${libssl_LIBRARIES}) set (common_libraries ${libssl_LIBRARIES})
include_directories (${libssl_INCLUDE_DIRS}) include_directories (${libssl_INCLUDE_DIRS})
@@ -32,8 +30,8 @@ foreach (extra iconv rt)
find_library (extra_lib_${extra} ${extra}) find_library (extra_lib_${extra} ${extra})
if (extra_lib_${extra}) if (extra_lib_${extra})
list (APPEND common_libraries ${extra}) list (APPEND common_libraries ${extra})
endif (extra_lib_${extra}) endif ()
endforeach (extra) endforeach ()
# Build some unit tests # Build some unit tests
include_directories (${PROJECT_SOURCE_DIR}) include_directories (${PROJECT_SOURCE_DIR})
@@ -43,4 +41,4 @@ foreach (name liberty proto)
add_threads (test-${name}) add_threads (test-${name})
target_link_libraries (test-${name} ${common_libraries}) target_link_libraries (test-${name} ${common_libraries})
add_test (NAME test-${name} COMMAND test-${name}) add_test (NAME test-${name} COMMAND test-${name})
endforeach (name) endforeach ()

View File

@@ -1749,10 +1749,9 @@ poller_run (struct poller *self)
self->revents_len = 0; self->revents_len = 0;
} }
#elif defined (BSD) // Sort of similar to the epoll version. Let's hope Darwin isn't broken,
// that'd mean reimplementing this in terms of select() just because of Crapple.
// Mac OS X's kqueue is fatally broken, or so I've been told; leaving it out. #elif defined (BSD) || defined (__APPLE__)
// Otherwise this is sort of similar to the epoll version.
#include <sys/types.h> #include <sys/types.h>
#include <sys/event.h> #include <sys/event.h>
@@ -2748,16 +2747,12 @@ utf8_decode (const char **s, size_t len)
} }
// In the middle of a character // In the middle of a character
if (sequence_len == 1) // or an overlong sequence (subset, possibly MUTF-8, not supported)
if (sequence_len == 1 || *p == 0xC0 || *p == 0xC1)
return -1; return -1;
// Check the rest of the sequence // Check the rest of the sequence
uint32_t cp = *p++ & ~mask; uint32_t cp = *p++ & ~mask;
// Overlong sequence (possibly MUTF-8, not supported)
if (!cp && sequence_len)
return -1;
while (sequence_len && --sequence_len) while (sequence_len && --sequence_len)
{ {
if (p == end) if (p == end)
@@ -3251,7 +3246,7 @@ get_xdg_config_dirs (struct strv *out)
str_free (&config_home); str_free (&config_home);
const char *xdg_config_dirs; const char *xdg_config_dirs;
if (!(xdg_config_dirs = getenv ("XDG_CONFIG_DIRS"))) if (!(xdg_config_dirs = getenv ("XDG_CONFIG_DIRS")) || !*xdg_config_dirs)
xdg_config_dirs = "/etc/xdg"; xdg_config_dirs = "/etc/xdg";
cstr_split (xdg_config_dirs, ":", true, out); cstr_split (xdg_config_dirs, ":", true, out);
} }
@@ -3276,7 +3271,7 @@ get_xdg_data_dirs (struct strv *out)
str_free (&data_home); str_free (&data_home);
const char *xdg_data_dirs; const char *xdg_data_dirs;
if (!(xdg_data_dirs = getenv ("XDG_DATA_DIRS"))) if (!(xdg_data_dirs = getenv ("XDG_DATA_DIRS")) || !*xdg_data_dirs)
xdg_data_dirs = "/usr/local/share/:/usr/share/"; xdg_data_dirs = "/usr/local/share/:/usr/share/";
cstr_split (xdg_data_dirs, ":", true, out); cstr_split (xdg_data_dirs, ":", true, out);
} }
@@ -4421,7 +4416,7 @@ socket_io_try_write (int socket_fd, struct str *wb)
// char = [\0-\177] # or any Unicode codepoint in the UTF-8 encoding // char = [\0-\177] # or any Unicode codepoint in the UTF-8 encoding
// escape = [\\"abfnrtv] / [xX][0-9A-Fa-f][0-9A-Fa-f]? / [0-7][0-7]?[0-7]? // escape = [\\"abfnrtv] / [xX][0-9A-Fa-f][0-9A-Fa-f]? / [0-7][0-7]?[0-7]?
// //
// integer = lws '-'? [0-9]+ # whatever strtoll() accepts on your system // integer = lws [-+]? [0-9]+ # whatever strtoll() accepts on your system
// null = lws 'null' // null = lws 'null'
// boolean = lws 'yes' / lws 'YES' / lws 'no' / lws 'NO' // boolean = lws 'yes' / lws 'YES' / lws 'no' / lws 'NO'
// / lws 'on' / lws 'ON' / lws 'off' / lws 'OFF' // / lws 'on' / lws 'ON' / lws 'off' / lws 'OFF'
@@ -4712,13 +4707,15 @@ config_item_write_string (struct str *output, const struct str *s)
for (size_t i = 0; i < s->len; i++) for (size_t i = 0; i < s->len; i++)
{ {
unsigned char c = s->str[i]; unsigned char c = s->str[i];
if (c == '\n') str_append (output, "\\n"); if (c == '\n') str_append (output, "\\n");
else if (c == '\r') str_append (output, "\\r"); else if (c == '\r') str_append (output, "\\r");
else if (c == '\t') str_append (output, "\\t"); else if (c == '\t') str_append (output, "\\t");
else if (c == '\\') str_append (output, "\\\\"); else if (c == '\\') str_append (output, "\\\\");
else if (c == '"') str_append (output, "\\\""); else if (c == '"') str_append (output, "\\\"");
else if (c < 32) str_append_printf (output, "\\x%02x", c); else if (iscntrl_ascii (c))
else str_append_c (output, c); str_append_printf (output, "\\x%02x", c);
else
str_append_c (output, c);
} }
str_append_c (output, '"'); str_append_c (output, '"');
} }

View File

@@ -331,10 +331,12 @@ test_utf8 (void)
soft_assert (utf8_decode (&partial, 1) == -2); soft_assert (utf8_decode (&partial, 1) == -2);
soft_assert (utf8_decode (&empty, 0) == -1); soft_assert (utf8_decode (&empty, 0) == -1);
const char valid[] = "2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm"; const char valid_1[] = "2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm";
const char valid_2[] = "\xf0\x93\x82\xb9";
const char invalid_1[] = "\xf0\x90\x28\xbc"; const char invalid_1[] = "\xf0\x90\x28\xbc";
const char invalid_2[] = "\xc0\x80"; const char invalid_2[] = "\xc0\x80";
soft_assert ( utf8_validate (valid, sizeof valid)); soft_assert ( utf8_validate (valid_1, sizeof valid_1));
soft_assert ( utf8_validate (valid_2, sizeof valid_2));
soft_assert (!utf8_validate (invalid_1, sizeof invalid_1)); soft_assert (!utf8_validate (invalid_1, sizeof invalid_1));
soft_assert (!utf8_validate (invalid_2, sizeof invalid_2)); soft_assert (!utf8_validate (invalid_2, sizeof invalid_2));