+
+ case LOGMODE_NULL:
+ default:
+ break;
+ }
+
+ if(umbilical && do_detach) {
+ size_t len = strlen(message);
+
+ if(write(umbilical, message, len) != (ssize_t)len || write(umbilical, "\n", 1) != 1) {
+ // Other end broken, nothing we can do about it.
+ }
+ }
+ }
+
+ if(logcontrol) {
+ suppress = true;
+ logcontrol = false;
+
+ for list_each(connection_t, c, &connection_list) {
+ if(!c->status.log) {
+ continue;
+ }
+
+ logcontrol = true;
+
+ if(level > (c->outcompression >= COMPRESS_NONE ? c->outcompression : debug_level)) {
+ continue;
+ }
+
+ size_t len = strlen(message);
+
+ if(send_request(c, "%d %d %lu", CONTROL, REQ_LOG, (unsigned long)len)) {
+ send_meta(c, message, len);
+ }
+ }
+
+ suppress = false;
+ }
+}
+
+void logger(debug_t level, int priority, const char *format, ...) {
+ va_list ap;
+ char message[1024] = "";
+
+ if(!should_log(level)) {
+ return;
+ }
+
+ va_start(ap, format);
+ int len = vsnprintf(message, sizeof(message), format, ap);
+ message[sizeof(message) - 1] = 0;
+ va_end(ap);
+
+ if(len > 0 && (size_t)len < sizeof(message) - 1 && message[len - 1] == '\n') {
+ message[len - 1] = 0;