43 Commits

Author SHA1 Message Date
5e728f6d31 Bump version, update NEWS 2021-10-06 14:05:23 +02:00
766f68e070 Bump liberty 2021-10-06 13:52:59 +02:00
3dc5242d43 Bump liberty
Importing some minor unimportant fixes.
2021-09-26 08:55:46 +02:00
fd9d5db1d2 xD: bump the soft file descriptor limit
By default it's a mere thousand connections, which is unnecessarily
crippling our advertised ability to handle lots of them.

Thanks for the advice, Lennart.
2021-09-23 20:32:00 +02:00
cb480b4c71 xC: show orphan outcoming actions differently
It's hard to think of anything actually good here.

This would be an exceptionally rare thing to do, anyway.
2021-09-05 02:51:05 +02:00
59cc423694 xC: abandon Freenode, embrace IRCnet
You're not fucking supposed to require a fucking registration
on fucking IRC networks.
2021-08-29 15:18:20 +02:00
9323089d66 xC: mIRC didn't invent all IRC formatting
So let's not confuse ourselves.
2021-08-29 12:12:52 +02:00
de7df1f60d xC: refactor parsing of IRC formatting 2021-08-29 12:06:53 +02:00
b082e82b62 xC: fix displaying IRC colours above 16
First, we indexed the colour array without a required offset.
Second, the data type was too small and overflowed negative.

Detected during a refactor, which this is a part of.
2021-08-28 18:25:03 +02:00
b8dbc70a9c xC: respect text formatting when autosplitting 2021-08-28 18:24:20 +02:00
e0ad67a921 Bump version, update NEWS 2021-08-07 07:53:08 +02:00
565edc15b4 README.adoc: be consistent in emphasizing 2021-08-07 07:40:02 +02:00
5d285ffb96 xB: fix up the special IPC command's name
To reflect the new disorder.
2021-08-06 17:18:06 +02:00
50057d5149 Come up with sillier names for the binaries
I'm not entirely sure, but it looks like some people might not like
jokes about the Holocaust.

On a more serious note, the project has become more serious over
the 7 or so years of its existence.
2021-08-06 16:43:59 +02:00
1f64710e79 NEWS: improve wording
The phrase "input line" has already been used once in the file.
2021-07-24 09:40:35 +02:00
027bf8666e degesch: never bump our own chanuser
With IRCv3.2 echo-message, each successfully sent message would
move us to the front of the list used for chanuser autocomplete.

Such behaviour seems useless.

Also abandon the idea of bumping on other kinds of messages.
2021-07-24 09:27:49 +02:00
7c7e12d8d5 degesch: start with lexically ordered chanusers
This makes nick autocompletion start in a non-arbitrary state.
2021-07-23 19:14:57 +02:00
3cb93d24e8 degesch: order nick autocomplete by time 2021-07-23 18:43:20 +02:00
acddfe2cfa degesch: cleanup 2021-07-23 18:43:19 +02:00
051c43a072 NEWS: fix a garbled up entry
Try not to commit, push and tag releases tired.
2021-07-08 05:17:13 +02:00
0fe0b56280 Bump version, update NEWS 2021-07-08 05:09:30 +02:00
f0281cf028 test-nick-colors: fix and streamline
A recent addition of an N_ELEMENTS macro invocation broke it.
2021-06-25 06:35:00 +02:00
da5dd4eb91 degesch: make /ban and /unban respect EXTBAN 2021-06-17 12:21:48 +02:00
10cb6651c0 degesch: expand/analyze a few TODO comments 2021-06-16 22:10:25 +02:00
7f28dcd1ef degesch: make "/help /command" work
Works for aliases as well.  Resolves a TODO entry.
2021-06-16 21:57:47 +02:00
61c52d793c degesch: fix a GCC compiler warning 2021-06-15 07:11:35 +02:00
b4dd0052ff degesch: pick colours based on relative luminance
Replaces the inaccurate Rec. 709 luma we used to use before.

This is the first feature here that requires libm, which doesn't
seem to be a particularly great sacrifice.

Moreover, I've rectified that the input isn't linear in sRGB,
and then was even normalized wrong for the luma formula.
2021-06-15 07:09:23 +02:00
e3c47c33fa degesch: implement -=/+= for multiple values
It didn't make sense to have these unimplemented,
though perhaps += shouldn't enforce a set.

Sadly, autocomplete is fairly difficult for -= of multiple items.
2021-06-14 09:06:38 +02:00
80c1e8f8eb degesch: make /deop and /devoice default to self
It's pretty annoying to type `/mode -o <user>`, for little reason.
2021-06-03 00:12:22 +02:00
c5f49ab1e6 censor.lua: strip colours, configurable formatting
Colour parsing code taken from prime.lua, and modified to strip.
2021-06-03 00:12:22 +02:00
6f62b9c0c7 degesch: make CHGHOST update our own userhost info
I've almost forgotten that we use this for message spliting.
2021-05-30 08:23:23 +02:00
c1d69e3630 degesch: add support for IRCv3 chghost
This is somewhat similar to a nick change.
2021-05-30 08:06:38 +02:00
c75ef167f2 degesch: document the SASL EXTERNAL support
So far it's only been mentioned in the NEWS file,
which is definitely not sufficient.

It would be good to move this kind of stuff out from README.adoc.
2021-05-29 06:38:33 +02:00
ddffc71abe degesch: factor out irc_try_finish_cap_negotiation()
Too much repeated, non-obvious code.
2021-05-28 04:59:21 +02:00
5a0b2d1c57 degesch: add trivial SASL EXTERNAL support
Just set `tls_cert`, and add `sasl` to `capabilities`.
2021-05-28 04:59:20 +02:00
bb451a5050 degesch: support CAP DEL, request cap-notify
It doesn't require much effort to cancel capabilities, plus with
the newer version we get the respective notification anyway.
2021-05-28 04:59:20 +02:00
61f15ead8a degesch: don't CAP REQ when already registered
The list may later be requested manually, which shouldn't have
an unexpected side-effect.
2021-05-28 04:59:20 +02:00
17f430043a degesch: IRCv3.2 capability negotiation
We can receive and display capability values now.
2021-05-28 04:59:20 +02:00
735096d76d degesch: add a /squery command for IRCnet 2021-05-28 04:06:27 +02:00
1ba59e6ee0 degesch: fix back-parsing outgoing CAP REQ
The bug has apparently been there since the beginning.
2021-05-28 04:04:44 +02:00
f9ba682c0e degesch: reset away-notify on disconnect
Forgotten to do it when adding the support for it.
2021-05-28 04:04:23 +02:00
8e8ffe2c73 degesch: don't switch to channels while typing
We might just always set the highlighted bit on,
it would be consistent with PMs.
2021-04-10 05:11:46 +02:00
d05c85833d degesch: make a second SIGINT force-quit
Also fixed the possibility of eating a sequence of signals
as we reset the indicators /after/ we took action,
which creates a time window for races.
2020-11-01 15:33:16 +01:00
35 changed files with 945 additions and 491 deletions

View File

@@ -1,5 +1,5 @@
cmake_minimum_required (VERSION 3.0) cmake_minimum_required (VERSION 3.0)
project (uirc3 VERSION 1.1.0 LANGUAGES C) project (uirc3 VERSION 1.4.0 LANGUAGES C)
# Options # Options
option (WANT_READLINE "Use GNU Readline for the UI (better)" ON) option (WANT_READLINE "Use GNU Readline for the UI (better)" ON)
@@ -61,7 +61,8 @@ endif ()
# -lrt is only for glibc < 2.17 # -lrt is only for glibc < 2.17
# -liconv may or may not be a part of libc # -liconv may or may not be a part of libc
foreach (extra iconv rt) # -lm may or may not be a part of libc
foreach (extra iconv rt m)
find_library (extra_lib_${extra} ${extra}) find_library (extra_lib_${extra} ${extra})
if (extra_lib_${extra}) if (extra_lib_${extra})
list (APPEND project_libraries ${extra_lib_${extra}}) list (APPEND project_libraries ${extra_lib_${extra}})
@@ -76,9 +77,9 @@ CHECK_C_SOURCE_RUNS ("#include <iconv.h>
int main () { return iconv_open (\"UTF-8//TRANSLIT\", \"ISO-8859-1\") int main () { return iconv_open (\"UTF-8//TRANSLIT\", \"ISO-8859-1\")
== (iconv_t) -1; }" ICONV_ACCEPTS_TRANSLIT) == (iconv_t) -1; }" ICONV_ACCEPTS_TRANSLIT)
# Dependencies for degesch # Dependencies for xC
pkg_check_modules (libffi REQUIRED libffi) pkg_check_modules (libffi REQUIRED libffi)
list (APPEND degesch_libraries ${libffi_LIBRARIES}) list (APPEND xC_libraries ${libffi_LIBRARIES})
include_directories (${libffi_INCLUDE_DIRS}) include_directories (${libffi_INCLUDE_DIRS})
link_directories (${libffi_LIBRARY_DIRS}) link_directories (${libffi_LIBRARY_DIRS})
@@ -91,7 +92,7 @@ if (WITH_LUA)
message (FATAL_ERROR "Lua library not found") message (FATAL_ERROR "Lua library not found")
endif () endif ()
list (APPEND degesch_libraries ${lua_LIBRARIES}) list (APPEND xC_libraries ${lua_LIBRARIES})
include_directories (${lua_INCLUDE_DIRS}) include_directories (${lua_INCLUDE_DIRS})
link_directories (${lua_LIBRARY_DIRS}) link_directories (${lua_LIBRARY_DIRS})
endif () endif ()
@@ -99,10 +100,10 @@ endif ()
find_package (Curses) find_package (Curses)
pkg_check_modules (ncursesw ncursesw) pkg_check_modules (ncursesw ncursesw)
if (ncursesw_FOUND) if (ncursesw_FOUND)
list (APPEND degesch_libraries ${ncursesw_LIBRARIES}) list (APPEND xC_libraries ${ncursesw_LIBRARIES})
include_directories (${ncursesw_INCLUDE_DIRS}) include_directories (${ncursesw_INCLUDE_DIRS})
elseif (CURSES_FOUND) elseif (CURSES_FOUND)
list (APPEND degesch_libraries ${CURSES_LIBRARY}) list (APPEND xC_libraries ${CURSES_LIBRARY})
include_directories (${CURSES_INCLUDE_DIR}) include_directories (${CURSES_INCLUDE_DIR})
else () else ()
message (SEND_ERROR "Curses not found") message (SEND_ERROR "Curses not found")
@@ -114,13 +115,13 @@ elseif (WANT_READLINE)
# OpenBSD's default readline is too old # OpenBSD's default readline is too old
if ("${CMAKE_SYSTEM_NAME}" MATCHES "OpenBSD") if ("${CMAKE_SYSTEM_NAME}" MATCHES "OpenBSD")
include_directories (${OPENBSD_LOCALBASE}/include/ereadline) include_directories (${OPENBSD_LOCALBASE}/include/ereadline)
list (APPEND degesch_libraries ereadline) list (APPEND xC_libraries ereadline)
else () else ()
list (APPEND degesch_libraries readline) list (APPEND xC_libraries readline)
endif () endif ()
elseif (WANT_LIBEDIT) elseif (WANT_LIBEDIT)
pkg_check_modules (libedit REQUIRED libedit) pkg_check_modules (libedit REQUIRED libedit)
list (APPEND degesch_libraries ${libedit_LIBRARIES}) list (APPEND xC_libraries ${libedit_LIBRARIES})
include_directories (${libedit_INCLUDE_DIRS}) include_directories (${libedit_INCLUDE_DIRS})
endif () endif ()
@@ -134,34 +135,34 @@ configure_file (${PROJECT_SOURCE_DIR}/config.h.in ${PROJECT_BINARY_DIR}/config.h
include_directories (${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR}) include_directories (${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
# Generate IRC replies--we need a custom target because of the multiple outputs # Generate IRC replies--we need a custom target because of the multiple outputs
add_custom_command (OUTPUT kike-replies.c kike.msg add_custom_command (OUTPUT xD-replies.c xD.msg
COMMAND ${PROJECT_SOURCE_DIR}/kike-gen-replies.sh COMMAND ${PROJECT_SOURCE_DIR}/xD-gen-replies.sh
> kike-replies.c < ${PROJECT_SOURCE_DIR}/kike-replies > xD-replies.c < ${PROJECT_SOURCE_DIR}/xD-replies
DEPENDS ${PROJECT_SOURCE_DIR}/kike-replies DEPENDS ${PROJECT_SOURCE_DIR}/xD-replies
COMMENT "Generating files from the list of server numerics") COMMENT "Generating files from the list of server numerics")
add_custom_target (replies DEPENDS ${PROJECT_BINARY_DIR}/kike-replies.c) add_custom_target (replies DEPENDS ${PROJECT_BINARY_DIR}/xD-replies.c)
# Build # Build
foreach (name zyklonb degesch kike) foreach (name xB xC xD)
add_executable (${name} ${name}.c ${PROJECT_BINARY_DIR}/config.h) add_executable (${name} ${name}.c ${PROJECT_BINARY_DIR}/config.h)
target_link_libraries (${name} ${project_libraries}) target_link_libraries (${name} ${project_libraries})
add_threads (${name}) add_threads (${name})
endforeach () endforeach ()
add_dependencies (kike replies) add_dependencies (xD replies)
add_dependencies (degesch replies) add_dependencies (xC replies)
target_link_libraries (degesch ${degesch_libraries}) target_link_libraries (xC ${xC_libraries})
# Tests # Tests
include (CTest) include (CTest)
if (BUILD_TESTING) if (BUILD_TESTING)
add_executable (test-degesch $<TARGET_PROPERTY:degesch,SOURCES>) add_executable (test-xC $<TARGET_PROPERTY:xC,SOURCES>)
set_target_properties (test-degesch PROPERTIES COMPILE_DEFINITIONS TESTING) set_target_properties (test-xC PROPERTIES COMPILE_DEFINITIONS TESTING)
target_link_libraries (test-degesch $<TARGET_PROPERTY:degesch,LINK_LIBRARIES>) target_link_libraries (test-xC $<TARGET_PROPERTY:xC,LINK_LIBRARIES>)
add_threads (test-degesch) add_threads (test-xC)
add_dependencies (test-degesch replies) add_dependencies (test-xC replies)
add_test (NAME test-degesch COMMAND test-degesch) add_test (NAME test-xC COMMAND test-xC)
add_test (NAME custom-static-analysis add_test (NAME custom-static-analysis
COMMAND ${PROJECT_SOURCE_DIR}/test-static) COMMAND ${PROJECT_SOURCE_DIR}/test-static)
endif () endif ()
@@ -181,13 +182,13 @@ add_custom_target (clang-tidy
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
# Installation # Installation
install (TARGETS zyklonb degesch kike DESTINATION ${CMAKE_INSTALL_BINDIR}) install (TARGETS xB xC xD DESTINATION ${CMAKE_INSTALL_BINDIR})
install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR}) install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR})
# XXX: our defaults for XDG_DATA_DIRS expect /usr/local/shore or /usr/share # XXX: our defaults for XDG_DATA_DIRS expect /usr/local/shore or /usr/share
install (DIRECTORY plugins/zyklonb/ install (DIRECTORY plugins/xB/
DESTINATION ${CMAKE_INSTALL_DATADIR}/zyklonb/plugins USE_SOURCE_PERMISSIONS) DESTINATION ${CMAKE_INSTALL_DATADIR}/xB/plugins USE_SOURCE_PERMISSIONS)
install (DIRECTORY plugins/degesch/ install (DIRECTORY plugins/xC/
DESTINATION ${CMAKE_INSTALL_DATADIR}/degesch/plugins) DESTINATION ${CMAKE_INSTALL_DATADIR}/xC/plugins)
# Generate documentation from text markup # Generate documentation from text markup
find_program (ASCIIDOCTOR_EXECUTABLE asciidoctor) find_program (ASCIIDOCTOR_EXECUTABLE asciidoctor)
@@ -195,7 +196,7 @@ if (NOT ASCIIDOCTOR_EXECUTABLE)
message (FATAL_ERROR "asciidoctor not found") message (FATAL_ERROR "asciidoctor not found")
endif () endif ()
foreach (page zyklonb degesch kike) foreach (page xB xC xD)
set (page_output "${PROJECT_BINARY_DIR}/${page}.1") set (page_output "${PROJECT_BINARY_DIR}/${page}.1")
list (APPEND project_MAN_PAGES "${page_output}") list (APPEND project_MAN_PAGES "${page_output}")
add_custom_command (OUTPUT ${page_output} add_custom_command (OUTPUT ${page_output}
@@ -216,7 +217,7 @@ foreach (page ${project_MAN_PAGES})
endforeach () endforeach ()
# CPack # CPack
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Unethical IRC client, daemon and bot") set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Unreasonable IRC client, daemon and bot")
set (CPACK_PACKAGE_VERSION "${project_version_safe}") set (CPACK_PACKAGE_VERSION "${project_version_safe}")
set (CPACK_PACKAGE_VENDOR "Premysl Eric Janouch") set (CPACK_PACKAGE_VENDOR "Premysl Eric Janouch")
set (CPACK_PACKAGE_CONTACT "Přemysl Eric Janouch <p@janouch.name>") set (CPACK_PACKAGE_CONTACT "Přemysl Eric Janouch <p@janouch.name>")

View File

@@ -1,4 +1,4 @@
Copyright (c) 2014 - 2020, Přemysl Eric Janouch <p@janouch.name> Copyright (c) 2014 - 2021, Přemysl Eric Janouch <p@janouch.name>
Permission to use, copy, modify, and/or distribute this software for any Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted. purpose with or without fee is hereby granted.

214
NEWS
View File

@@ -1,8 +1,56 @@
1.4.0 (2021-10-06) "Call Me Scruffy Scruffington"
* xC: made message autosplitting respect text formatting
* xC: fixed displaying IRC colours above 16
* xC: offer IRCnet as an IRC network to connect to,
rather than the lunatic new Freenode
* xD: started bumping the soft limit on file descriptors to the hard one
1.3.0 (2021-08-07) "New World Order"
* xC: made nick autocompletion offer recent speakers first
* All binaries have been renamed to something even sillier,
and all references in the source tree have been redacted;
this represents a major incompatible change for all plugins;
configuration and program data have to be adjusted manually
1.2.0 (2021-07-08) "There Are Other Countries As Well"
* xC: added a /squery command for IRCnet
* xC: added trivial support for SASL EXTERNAL, enabled by adding "sasl"
to the respective server's "capabilities" list
* xC: now supporting IRCv3.2 capability negotiation, including CAP DEL
* xC: added support for IRCv3 chghost
* xC: /deop and /devoice without arguments will use the client's user
* xC: /set +=/-= now treats its argument as a string array
* xC: made "/help /command" work the same way as "/help command" does
* xC: /ban and /unban don't mangle extended bans anymore
* xC: joining new channels no longer switches to their buffer automatically
if the current input line isn't empty
* censor.lua: now stripping colours from censored messages;
their attributes are also configurable rather than always black on black
1.1.0 (2020-10-31) "What Do You Mean By 'This Isn't Germany'?" 1.1.0 (2020-10-31) "What Do You Mean By 'This Isn't Germany'?"
* degesch: made fancy-prompt.lua work with libedit * xC: made fancy-prompt.lua work with libedit
* kike: fixed a regression with an unspecified "bind_host" * xD: fixed a regression with an unspecified "bind_host"
* Miscellaneous minor improvements * Miscellaneous minor improvements
@@ -11,55 +59,55 @@
* Coming with real manual pages instead of help2man-generated stubs * Coming with real manual pages instead of help2man-generated stubs
* degesch: added support for more IRC colours and strike-through text (M-m x) * xC: added support for more IRC colours and strike-through text (M-m x)
* degesch: now tolerating all UTF-8 messages cut off by the server * xC: now tolerating all UTF-8 messages cut off by the server
* degesch: disabled "behaviour.backlog_helper_strip_formatting" by default * xC: disabled "behaviour.backlog_helper_strip_formatting" by default
since the relevant issue with ACS terminfo entries has been resolved since the relevant issue with ACS terminfo entries has been resolved
* degesch: enabled word wrapping in the backlog by default * xC: enabled word wrapping in the backlog by default
* degesch: made the unread marker span the whole line, with a configurable * xC: made the unread marker span the whole line, with a configurable
character; the previous behaviour can be obtained by setting it empty character; the previous behaviour can be obtained by setting it empty
* degesch: fixed the prompt not showing back up after exiting a backlog helper * xC: fixed the prompt not showing back up after exiting a backlog helper
when an external event has provoked an attempt to change it when an external event has provoked an attempt to change it
* degesch: now watching fellow channel users' away status when the server * xC: now watching fellow channel users' away status when the server
supports the away-notify capability; indicated by italicised nicknames supports the away-notify capability; indicated by italicised nicknames
* degesch: added a plugin to highlight prime numbers in incoming messages * xC: added a plugin to highlight prime numbers in incoming messages
* kike: make sure an unspecified "bind_host" binds to both IPv4 and IPv6 * xD: make sure an unspecified "bind_host" binds to both IPv4 and IPv6
* ZyklonB: install plugins to /usr/share and look for them in XDG data dirs * xB: install plugins to /usr/share and look for them in XDG data dirs
* Miscellaneous little fixes * Miscellaneous little fixes
0.9.8 (2020-09-02) "Yep, Still Using It" 0.9.8 (2020-09-02) "Yep, Still Using It"
* degesch: fixed a crash and prompt attribute output in libedit 20191231-3.1, * xC: fixed a crash and prompt attribute output in libedit 20191231-3.1,
though users are officially discouraged from using this library though users are officially discouraged from using this library
* degesch: fixed Lua 5.4 build, so far the support is experimental * xC: fixed Lua 5.4 build, so far the support is experimental
* Miscellaneous little fixes * Miscellaneous little fixes
0.9.7 (2018-10-21) "Business as Usual" 0.9.7 (2018-10-21) "Business as Usual"
* kike: fix wildcard handling in WHOIS * xD: fix wildcard handling in WHOIS
* kike: properly handle STATS without parametetrs * xD: properly handle STATS without parametetrs
* kike: abort earlier when an invalid mode character is detected while * xD: abort earlier when an invalid mode character is detected while
processing channel MODE messages processing channel MODE messages
* kike: do not send NICK notifications when the nickname doesn't really change * xD: do not send NICK notifications when the nickname doesn't really change
* kike: fix hostname string verification (only used for "server_name") * xD: fix hostname string verification (only used for "server_name")
0.9.6 (2018-06-22) "I've Been Sitting Here All This Time" 0.9.6 (2018-06-22) "I've Been Sitting Here All This Time"
@@ -68,108 +116,108 @@
* Fix LibreSSL compatibility * Fix LibreSSL compatibility
* degesch: a second /disconnect cuts the connection by force * xC: a second /disconnect cuts the connection by force
* degesch: send a QUIT message to the IRC server on Ctrl-C * xC: send a QUIT message to the IRC server on Ctrl-C
* degesch: add a Slack plugin (even though the gateway's now defunct) * xC: add a Slack plugin (even though the gateway's now defunct)
* degesch: show an error message on log write failure * xC: show an error message on log write failure
* degesch: fix parsing of literal IPv6 addresses with port numbers * xC: fix parsing of literal IPv6 addresses with port numbers
* degesch: fix some error messages * xC: fix some error messages
* degesch: workaround a Readline bug in the fancy-prompt.lua plugin * xC: workaround a Readline bug in the fancy-prompt.lua plugin
* kike: fix two memory leaks * xD: fix two memory leaks
* kike: improve error handling for incoming connections * xD: improve error handling for incoming connections
* kike: disable TLS session reuse * xD: disable TLS session reuse
0.9.5 (2016-12-30) "It's Time" 0.9.5 (2016-12-30) "It's Time"
* Better support for the KILL command * Better support for the KILL command
* degesch: export many more fields to the Lua API, add a prompt hook * xC: export many more fields to the Lua API, add a prompt hook
* degesch: show channel user count in the prompt * xC: show channel user count in the prompt
* degesch: allow hiding join/part messages and other noise (Meta-Shift-H) * xC: allow hiding join/part messages and other noise (Meta-Shift-H)
* degesch: allow autojoining channels with keys * xC: allow autojoining channels with keys
* degesch: rejoin channels with keys on reconnect * xC: rejoin channels with keys on reconnect
* degesch: make /query without arguments just open the buffer * xC: make /query without arguments just open the buffer
* degesch: add a censor plugin * xC: add a censor plugin
* degesch: die on configuration parse errors * xC: die on configuration parse errors
* degesch: request channel modes also on rejoin * xC: request channel modes also on rejoin
* degesch: don't show remembered channel modes on parted channels * xC: don't show remembered channel modes on parted channels
* degesch: fix highlight detection in colored text * xC: fix highlight detection in colored text
* degesch: fix CTCP handling for the real world and don't decode X-QUOTEs * xC: fix CTCP handling for the real world and don't decode X-QUOTEs
* degesch: add support for OpenSSL 1.1.0 * xC: add support for OpenSSL 1.1.0
0.9.4 (2016-04-28) "Oops" 0.9.4 (2016-04-28) "Oops"
* degesch: fix crash on characters invalid in Windows-1252 * xC: fix crash on characters invalid in Windows-1252
* degesch: add an auto-rejoin plugin * xC: add an auto-rejoin plugin
* degesch: better date change messages with customizable formatting; * xC: better date change messages with customizable formatting;
now also used in the backlog, so it looks closer to regular output now also used in the backlog, so it looks closer to regular output
* ZyklonB: add a calc plugin providing a basic Scheme REPL * xB: add a calc plugin providing a basic Scheme REPL
* ZyklonB: add a seen plugin * xB: add a seen plugin
* kike, ZyklonB: use pledge(2) on OpenBSD * xD, xB: use pledge(2) on OpenBSD
0.9.3 (2016-03-27) "Doesn't Even Suck" 0.9.3 (2016-03-27) "Doesn't Even Suck"
* Use TLS Server Name Indication when connecting to servers * Use TLS Server Name Indication when connecting to servers
* degesch: now we erase the screen before displaying buffers * xC: now we erase the screen before displaying buffers
* degesch: implemented word wrapping in buffers * xC: implemented word wrapping in buffers
* degesch: added autocomplete for /topic * xC: added autocomplete for /topic
* degesch: Lua API was improved and extended * xC: Lua API was improved and extended
* degesch: added a basic last.fm "now playing" plugin * xC: added a basic last.fm "now playing" plugin
* degesch: backlog limit was made configurable * xC: backlog limit was made configurable
* degesch: allow changing the list of IRC capabilities to use if available * xC: allow changing the list of IRC capabilities to use if available
* degesch: optimize buffer memory usage * xC: optimize buffer memory usage
* degesch: added logging of messages sent from /quote and plugins * xC: added logging of messages sent from /quote and plugins
* degesch: M-! and M-a to go to the next buffer in order with * xC: M-! and M-a to go to the next buffer in order with a highlight
a highlight or new activity respectively or new activity respectively
* degesch: added --format for previewing things like MOTD files * xC: added --format for previewing things like MOTD files
* degesch: added /buffer goto supporting case insensitive partial matches * xC: added /buffer goto supporting case insensitive partial matches
* kike: add support for IRCv3.2 server-time * xD: add support for IRCv3.2 server-time
* ZyklonB: plugins now run in a dedicated data directory * xB: plugins now run in a dedicated data directory
* ZyklonB: added a factoids plugin * xB: added a factoids plugin
* Remote addresses are now resolved asynchronously * Remote addresses are now resolved asynchronously
@@ -178,28 +226,28 @@
0.9.2 (2015-12-31) 0.9.2 (2015-12-31)
* degesch: added rudimentary support for Lua scripting * xC: added rudimentary support for Lua scripting
* degesch: added detection of pasting, so that it doesn't trigger other * xC: added detection of pasting, so that it doesn't trigger other
keyboard shortcuts, such as for autocomplete keyboard shortcuts, such as for autocomplete
* degesch: added auto-away capability * xC: added auto-away capability
* degesch: added an /oper command * xC: added an /oper command
* degesch: libedit backend works again * xC: libedit backend works again
* degesch: added capability to edit the input line using VISUAL/EDITOR * xC: added capability to edit the input line using VISUAL/EDITOR
* degesch: added Meta-Tab to switch to the last used buffer * xC: added Meta-Tab to switch to the last used buffer
* degesch: correctly respond to stopping and resuming (SIGTSTP) * xC: correctly respond to stopping and resuming (SIGTSTP)
* degesch: fixed decoding of text formatting * xC: fixed decoding of text formatting
* degesch: unseen PMs now show up as highlights * xC: unseen PMs now show up as highlights
* degesch: various bugfixes * xC: various bugfixes
0.9.1 (2015-09-25) 0.9.1 (2015-09-25)
@@ -210,23 +258,23 @@
* Pulled in kqueue support * Pulled in kqueue support
* degesch: added backlog/scrollback functionality using less(1) * xC: added backlog/scrollback functionality using less(1)
* degesch: made showing the entire set of channel mode user prefixes optional * xC: made showing the entire set of channel mode user prefixes optional
* degesch: nicknames in /names are now ordered * xC: nicknames in /names are now ordered
* degesch: nicknames now use the 256-color terminal palette if available * xC: nicknames now use the 256-color terminal palette if available
* degesch: now we skip entries in the "addresses" list that can't be resolved * xC: now we skip entries in the "addresses" list that can't be resolved
to an address, along with displaying a more helpful message to an address, along with displaying a more helpful message
* degesch: joins, parts, nick changes and quits don't count as new buffer * xC: joins, parts, nick changes and quits don't count as new buffer
activity anymore activity anymore
* degesch: added Meta-H to open the full log file * xC: added Meta-H to open the full log file
* degesch: various bugfixes and little improvements * xC: various bugfixes and little improvements
0.9.0 (2015-07-23) 0.9.0 (2015-07-23)

View File

@@ -2,25 +2,25 @@ uirc3
===== =====
:compact-option: :compact-option:
The [line-through]#unethical# edgy IRC trinity. This project consists of an The unreasonable IRC trinity. This project consists of an IRC client, daemon,
IRC client, daemon, and bot. It's all you're ever going to need for chatting, and bot. It's all you're ever going to need for chatting, as long as you can
as long as you can make do with minimalist software. make do with minimalist software.
All of them have these potentially interesting properties: All of them have these potentially interesting properties:
- IPv6 support - IPv6 support
- TLS support, including client certificates - TLS support, including client certificates
- lean on dependencies (with the exception of 'degesch') - lean on dependencies (with the exception of 'xC')
- compact and arguably easy to hack on - compact and arguably easy to hack on
- very permissive license - very permissive license
degesch xC
------- --
The IRC client. It is largely defined by being built on top of GNU Readline The IRC client. It is largely defined by being built on top of GNU Readline
that has been hacked to death. Its interface should feel somewhat familiar for that has been hacked to death. Its interface should feel somewhat familiar for
weechat or irssi users. weechat or irssi users.
image::degesch.png[align="center"] image::xC.png[align="center"]
This is the largest application within the project. It has most of the stuff This is the largest application within the project. It has most of the stuff
you'd expect of an IRC client, such as being able to set up multiple servers, you'd expect of an IRC client, such as being able to set up multiple servers,
@@ -28,8 +28,8 @@ a powerful configuration system, integrated help, text formatting, CTCP queries,
automatic splitting of overlong messages, autocomplete, logging to file, automatic splitting of overlong messages, autocomplete, logging to file,
auto-away, command aliases and basic support for Lua scripting. auto-away, command aliases and basic support for Lua scripting.
kike xD
---- --
The IRC daemon. It is designed to be used as a regular user application rather The IRC daemon. It is designed to be used as a regular user application rather
than a system-wide daemon. If all you want is a decent, minimal IRCd for than a system-wide daemon. If all you want is a decent, minimal IRCd for
testing purposes or a small network of respectful users (or bots), this one will testing purposes or a small network of respectful users (or bots), this one will
@@ -48,7 +48,7 @@ Not supported:
- server linking (which also means no services); I consider existing protocols - server linking (which also means no services); I consider existing protocols
for this purpose ugly and tricky to implement correctly; I've also found no for this purpose ugly and tricky to implement correctly; I've also found no
use for this feature yet use for this feature yet
- online changes to configuration; the configuration system from degesch could - online changes to configuration; the configuration system from 'xC' could
be used to implement this feature if needed be used to implement this feature if needed
- limits of almost any kind, just connections and mode `+l` - limits of almost any kind, just connections and mode `+l`
@@ -56,8 +56,8 @@ This program has been
https://git.janouch.name/p/haven/src/branch/master/hid[ported to Go], https://git.janouch.name/p/haven/src/branch/master/hid[ported to Go],
and development continues over there. and development continues over there.
ZyklonB xB
------- --
The IRC bot. It builds upon the concept of my other VitaminA IRC bot. The main The IRC bot. It builds upon the concept of my other VitaminA IRC bot. The main
characteristic of these two bots is that they run plugins as coprocesses, which characteristic of these two bots is that they run plugins as coprocesses, which
allows for enhanced reliability and programming language freedom. allows for enhanced reliability and programming language freedom.
@@ -78,8 +78,8 @@ Building
-------- --------
Build dependencies: CMake, pkg-config, asciidoctor, awk, liberty (included) + Build dependencies: CMake, pkg-config, asciidoctor, awk, liberty (included) +
Runtime dependencies: openssl + Runtime dependencies: openssl +
Additionally for degesch: curses, libffi, lua >= 5.3 (optional), Additionally for 'xC': curses, libffi, lua >= 5.3 (optional),
readline >= 6.0 or libedit >= 2013-07-12 readline >= 6.0 or libedit >= 2013-07-12
Avoid libedit if you can, in general it works but at the moment history is Avoid libedit if you can, in general it works but at the moment history is
acting up and I have no clue about fixing it. acting up and I have no clue about fixing it.
@@ -102,45 +102,49 @@ Or you can try telling CMake to make a package for you. For Debian it is:
Usage Usage
----- -----
'degesch' has in-program configuration. Just run it and read the instructions. 'xC' has in-program configuration. Just run it and read the instructions.
Consult its link:degesch.adoc[man page] for details about the interface. Consult its link:xC.adoc[man page] for details about the interface.
For the rest you might want to generate a configuration file: For the rest you might want to generate a configuration file:
$ zyklonb --write-default-config $ xB --write-default-config
$ kike --write-default-config $ xD --write-default-config
After making any necessary edits to the file (there are comments to aid you in After making any necessary edits to the file (there are comments to aid you in
doing that), simply run the appropriate program with no arguments: doing that), simply run the appropriate program with no arguments:
$ zyklonb $ xB
$ kike $ xD
'ZyklonB' stays running in the foreground, therefore I recommend launching it 'xB' stays running in the foreground, therefore I recommend launching it inside
inside a Screen or tmux session. a Screen or tmux session.
'kike', on the other hand, immediately forks into the background. Use the PID 'xD', on the other hand, immediately forks into the background. Use the PID
file or something like `killall` if you want to terminate it. You can run it file or something like `killall` if you want to terminate it. You can run it
as a `forking` type systemd user service. as a `forking` type systemd user service.
Client Certificates Client Certificates
------------------- -------------------
'kike' uses SHA-1 fingerprints of TLS client certificates to authenticate users. 'xC' will use the SASL EXTERNAL method to authenticate using the TLS client
certificate specified by the respective server's `tls_cert` option if you add
`sasl` to the `capabilities` option and the server supports this.
'xD' uses SHA-1 fingerprints of TLS client certificates to authenticate users.
To get the fingerprint from a certificate file in the required form, use: To get the fingerprint from a certificate file in the required form, use:
$ openssl x509 -in public.pem -outform DER | sha1sum $ openssl x509 -in public.pem -outform DER | sha1sum
Custom Key Bindings in degesch Custom Key Bindings in xC
------------------------------ -------------------------
The default and preferred frontend used in 'degesch' is GNU Readline. This The default and preferred frontend used in 'xC' is GNU Readline. This means
means that you can change your bindings by editing '~/.inputrc'. For example: that you can change your bindings by editing '~/.inputrc'. For example:
.... ....
# Preload with system-wide settings # Preload with system-wide settings
$include /etc/inputrc $include /etc/inputrc
# Make M-left and M-right reorder buffers # Make M-left and M-right reorder buffers
$if degesch $if xC
"\e\e[C": move-buffer-right "\e\e[C": move-buffer-right
"\e\e[D": move-buffer-left "\e\e[D": move-buffer-left
$endif $endif
@@ -150,9 +154,9 @@ Consult the source code and the GNU Readline manual for a list of available
functions. Also refer to the latter for the exact syntax of this file. functions. Also refer to the latter for the exact syntax of this file.
Beware that you can easily break the program if you're not careful. Beware that you can easily break the program if you're not careful.
How do I make degesch look like the screenshot? How do I make xC look like the screenshot?
----------------------------------------------- ------------------------------------------
First of all, you must build it with Lua support. With the defaults, degesch First of all, you must build it with Lua support. With the defaults, 'xC'
doesn't look too fancy because I don't want to depend on Lua or 256-colour doesn't look too fancy because I don't want to depend on Lua or 256-colour
terminals. In addition to that, I appear to be one of the few people who use terminals. In addition to that, I appear to be one of the few people who use
black on white terminals. black on white terminals.
@@ -191,5 +195,5 @@ License
This software is released under the terms of the 0BSD license, the text of which This software is released under the terms of the 0BSD license, the text of which
is included within the package along with the list of authors. is included within the package along with the list of authors.
Note that 'degesch' becomes GPL-licensed when you link it against GNU Readline Note that 'xC' becomes GPL-licensed when you link it against GNU Readline,
but that is not a concern of this source package. The licenses are compatible. but that is not a concern of this source package. The licenses are compatible.

Submodule liberty updated: 9639777814...1b9d89cab3

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env guile #!/usr/bin/env guile
ZyklonB calc plugin, basic Scheme evaluator xB calc plugin, basic Scheme evaluator
Copyright 2016 Přemysl Eric Janouch Copyright 2016 Přemysl Eric Janouch
See the file LICENSE for licensing information. See the file LICENSE for licensing information.
@@ -77,7 +77,7 @@
(substring line 0 (- len 1)) line)))) (substring line 0 (- len 1)) line))))
(define (get-config name) (define (get-config name)
(send "ZYKLONB get_config :" name) (send "XB get_config :" name)
(car (message-params (parse-message (get-line-crlf irc-input-port))))) (car (message-params (parse-message (get-line-crlf irc-input-port)))))
(define (extract-nick prefix) (define (extract-nick prefix)
@@ -216,7 +216,7 @@
; --- Main loop ---------------------------------------------------------------- ; --- Main loop ----------------------------------------------------------------
(define prefix (get-config "prefix")) (define prefix (get-config "prefix"))
(send "ZYKLONB register") (send "XB register")
(define (process msg) (define (process msg)
(when (string-ci=? (message-command msg) "PRIVMSG") (when (string-ci=? (message-command msg) "PRIVMSG")

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env tclsh #!/usr/bin/env tclsh
# #
# ZyklonB coin plugin, random number-based utilities # xB coin plugin, random number-based utilities
# #
# Copyright 2012, 2014 Přemysl Eric Janouch # Copyright 2012, 2014 Přemysl Eric Janouch
# See the file LICENSE for licensing information. # See the file LICENSE for licensing information.
@@ -37,7 +37,7 @@ proc parse {line} {
proc get_config {key} { proc get_config {key} {
global msg global msg
puts "ZYKLONB get_config :$key" puts "XB get_config :$key"
gets stdin line gets stdin line
parse $line parse $line
return [lindex $msg(param) 0] return [lindex $msg(param) 0]
@@ -53,7 +53,7 @@ fconfigure stdin -translation crlf -encoding iso8859-1
fconfigure stdout -translation crlf -encoding iso8859-1 fconfigure stdout -translation crlf -encoding iso8859-1
set prefix [get_config prefix] set prefix [get_config prefix]
puts "ZYKLONB register" puts "XB register"
set eightball [list \ set eightball [list \
"It is certain" \ "It is certain" \

View File

@@ -1,6 +1,6 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# ZyklonB eval plugin, LISP-like expression evaluator # xB eval plugin, LISP-like expression evaluator
# #
# Copyright 2013, 2014 Přemysl Eric Janouch # Copyright 2013, 2014 Přemysl Eric Janouch
# See the file LICENSE for licensing information. # See the file LICENSE for licensing information.
@@ -15,7 +15,7 @@ BEGIN \
prefix = get_config("prefix") prefix = get_config("prefix")
print "ZYKLONB register" print "XB register"
fflush("") fflush("")
# All functions have to be in this particular array # All functions have to be in this particular array
@@ -258,7 +258,7 @@ function process_end ()
function get_config (key) function get_config (key)
{ {
print "ZYKLONB get_config :" key print "XB get_config :" key
fflush("") fflush("")
getline getline

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env perl #!/usr/bin/env perl
# #
# ZyklonB factoids plugin # xB factoids plugin
# #
# Copyright 2016 Přemysl Eric Janouch <p@janouch.name> # Copyright 2016 Přemysl Eric Janouch <p@janouch.name>
# See the file LICENSE for licensing information. # See the file LICENSE for licensing information.
@@ -24,18 +24,18 @@ sub parse ($) {
} }
sub bot_print { sub bot_print {
print "ZYKLONB print :${\shift}"; print "XB print :${\shift}";
} }
# --- Initialization ----------------------------------------------------------- # --- Initialization -----------------------------------------------------------
my %config; my %config;
for my $name (qw(prefix)) { for my $name (qw(prefix)) {
print "ZYKLONB get_config :$name"; print "XB get_config :$name";
$config{$name} = (parse <STDIN>)->{args}->[0]; $config{$name} = (parse <STDIN>)->{args}->[0];
} }
print "ZYKLONB register"; print "XB register";
# --- Database ----------------------------------------------------------------- # --- Database -----------------------------------------------------------------
# Simple map of (factoid_name => [definitions]); all factoids are separated # Simple map of (factoid_name => [definitions]); all factoids are separated

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
# coding: utf-8 # coding: utf-8
# #
# ZyklonB pomodoro plugin # xB pomodoro plugin
# #
# Copyright 2015 Přemysl Eric Janouch # Copyright 2015 Přemysl Eric Janouch
# See the file LICENSE for licensing information. # See the file LICENSE for licensing information.
@@ -206,7 +206,7 @@ def parse (line)
end end
def bot_print (what) def bot_print (what)
print "ZYKLONB print :#{what}" print "XB print :#{what}"
end end
# --- Initialization ----------------------------------------------------------- # --- Initialization -----------------------------------------------------------
@@ -215,12 +215,12 @@ end
# To read it from anywhere else, it has to be done asynchronously # To read it from anywhere else, it has to be done asynchronously
$config = {} $config = {}
[:prefix].each do |name| [:prefix].each do |name|
print "ZYKLONB get_config :#{name}" print "XB get_config :#{name}"
_, _, _, _, args = *parse($stdin.gets.chomp) _, _, _, _, args = *parse($stdin.gets.chomp)
$config[name] = args[0] $config[name] = args[0]
end end
print "ZYKLONB register" print "XB register"
# --- Plugin logic ------------------------------------------------------------- # --- Plugin logic -------------------------------------------------------------

View File

@@ -1,6 +1,6 @@
#!/usr/bin/tcc -run -lm #!/usr/bin/tcc -run -lm
// //
// ZyklonB scripting plugin, using a custom stack-based language // xB scripting plugin, using a custom stack-based language
// //
// Copyright 2014 Přemysl Eric Janouch // Copyright 2014 Přemysl Eric Janouch
// See the file LICENSE for licensing information. // See the file LICENSE for licensing information.
@@ -1964,12 +1964,12 @@ read_message (void)
// --- Interfacing with the bot ------------------------------------------------ // --- Interfacing with the bot ------------------------------------------------
#define BOT_PRINT "ZYKLONB print :script: " #define BOT_PRINT "XB print :script: "
static const char * static const char *
get_config (const char *key) get_config (const char *key)
{ {
printf ("ZYKLONB get_config :%s\r\n", key); printf ("XB get_config :%s\r\n", key);
struct message *msg = read_message (); struct message *msg = read_message ();
if (!msg || msg->n_params <= 0) if (!msg || msg->n_params <= 0)
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
@@ -2298,7 +2298,7 @@ main (int argc, char *argv[])
printf (BOT_PRINT "%s\r\n", "runtime library initialization failed"); printf (BOT_PRINT "%s\r\n", "runtime library initialization failed");
g_prefix = strdup (get_config ("prefix")); g_prefix = strdup (get_config ("prefix"));
printf ("ZYKLONB register\r\n"); printf ("XB register\r\n");
struct message *msg; struct message *msg;
while ((msg = read_message ())) while ((msg = read_message ()))
process_message (msg); process_message (msg);

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env lua #!/usr/bin/env lua
-- --
-- ZyklonB seen plugin -- xB seen plugin
-- --
-- Copyright 2016 Přemysl Eric Janouch <p@janouch.name> -- Copyright 2016 Přemysl Eric Janouch <p@janouch.name>
-- See the file LICENSE for licensing information. -- See the file LICENSE for licensing information.
@@ -26,7 +26,7 @@ function parse (line)
end end
function get_config (name) function get_config (name)
io.write ("ZYKLONB get_config :", name, "\r\n") io.write ("XB get_config :", name, "\r\n")
return parse (io.read ()).params[1] return parse (io.read ()).params[1]
end end
@@ -34,7 +34,7 @@ end
io.output ():setvbuf ('line') io.output ():setvbuf ('line')
local prefix = get_config ('prefix') local prefix = get_config ('prefix')
io.write ("ZYKLONB register\r\n") io.write ("XB register\r\n")
local db = {} local db = {}
local db_filename = "seen.db" local db_filename = "seen.db"

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env perl #!/usr/bin/env perl
# Creates a database for the "seen" plugin from logs for degesch. # Creates a database for the "seen" plugin from logs for xC.
# The results may not be completely accurate but are good for jumpstarting. # The results may not be completely accurate but are good for jumpstarting.
# Usage: ./seen-import-degesch.pl LOG-FILE... > seen.db # Usage: ./seen-import-xC.pl LOG-FILE... > seen.db
use strict; use strict;
use warnings; use warnings;

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# #
# ZyklonB YouTube plugin, displaying info about YouTube links # xB YouTube plugin, displaying info about YouTube links
# #
# Copyright 2014 - 2015, Přemysl Eric Janouch <p@janouch.name> # Copyright 2014 - 2015, Přemysl Eric Janouch <p@janouch.name>
# See the file LICENSE for licensing information. # See the file LICENSE for licensing information.
@@ -27,12 +27,12 @@ class Plugin:
return (nick, user, host, command, args) return (nick, user, host, command, args)
def get_config (self, key): def get_config (self, key):
print ("ZYKLONB get_config :%s" % key) print ("XB get_config :%s" % key)
(_, _, _, _, args) = self.parse (sys.stdin.readline ()) (_, _, _, _, args) = self.parse (sys.stdin.readline ())
return args[0] return args[0]
def bot_print (self, what): def bot_print (self, what):
print ('ZYKLONB print :%s' % what) print ('XB print :%s' % what)
class YouTube (Plugin): class YouTube (Plugin):
re_videos = [re.compile (x) for x in [ re_videos = [re.compile (x) for x in [
@@ -98,7 +98,7 @@ class YouTube (Plugin):
if self.youtube_api_key == "": if self.youtube_api_key == "":
self.bot_print ("youtube: missing `youtube_api_key'") self.bot_print ("youtube: missing `youtube_api_key'")
print ("ZYKLONB register") print ("XB register")
for line in sys.stdin: for line in sys.stdin:
self.process_line (line) self.process_line (line)

View File

@@ -16,7 +16,7 @@
-- --
local timeout local timeout
degesch.setup_config { xC.setup_config {
timeout = { timeout = {
type = "integer", type = "integer",
comment = "auto rejoin timeout", comment = "auto rejoin timeout",
@@ -31,9 +31,9 @@ degesch.setup_config {
}, },
} }
async, await = degesch.async, coroutine.yield async, await = xC.async, coroutine.yield
degesch.hook_irc (function (hook, server, line) xC.hook_irc (function (hook, server, line)
local msg = degesch.parse (line) local msg = xC.parse (line)
if msg.command ~= "KICK" then return line end if msg.command ~= "KICK" then return line end
local who = msg.prefix:match ("^[^!]*") local who = msg.prefix:match ("^[^!]*")

View File

@@ -1,7 +1,7 @@
-- --
-- censor.lua: black out certain users' messages -- censor.lua: black out certain users' messages
-- --
-- Copyright (c) 2016, Přemysl Eric Janouch <p@janouch.name> -- Copyright (c) 2016 - 2021, Přemysl Eric Janouch <p@janouch.name>
-- --
-- Permission to use, copy, modify, and/or distribute this software for any -- Permission to use, copy, modify, and/or distribute this software for any
-- purpose with or without fee is hereby granted. -- purpose with or without fee is hereby granted.
@@ -38,25 +38,42 @@ local read_masks = function (v)
end end
end end
degesch.setup_config { local quote
xC.setup_config {
masks = { masks = {
type = "string_array", type = "string_array",
default = "\"\"", default = "\"\"",
comment = "user masks (optionally \"/#channel\") to censor", comment = "user masks (optionally \"/#channel\") to censor",
on_change = read_masks on_change = read_masks
}, },
quote = {
type = "string",
default = "\"\\x0301,01\"",
comment = "formatting prefix for censored messages",
on_change = function (v) quote = v end
},
} }
local decolor = function (text)
local rebuilt, last = {""}, 1
for start in text:gmatch ('()\x03') do
table.insert (rebuilt, text:sub (last, start - 1))
local sub = text:sub (start + 1)
last = start + (sub:match ('^%d%d?,%d%d?()') or sub:match ('^%d?%d?()'))
end
return table.concat (rebuilt) .. text:sub (last)
end
local censor = function (line) local censor = function (line)
-- Taking a shortcut to avoid lengthy message reassembly -- Taking a shortcut to avoid lengthy message reassembly
local start, text = line:match ("^(.- PRIVMSG .- :)(.*)$") local start, text = line:match ("^(.- PRIVMSG .- :)(.*)$")
local ctcp, rest = text:match ("^(\x01%g+ )(.*)") local ctcp, rest = text:match ("^(\x01%g+ )(.*)")
text = ctcp and ctcp .. "\x0301,01" .. rest or "\x0301,01" .. text text = ctcp and ctcp .. quote .. decolor (rest) or quote .. decolor (text)
return start .. text return start .. text
end end
degesch.hook_irc (function (hook, server, line) xC.hook_irc (function (hook, server, line)
local msg = degesch.parse (line) local msg = xC.parse (line)
if msg.command ~= "PRIVMSG" then return line end if msg.command ~= "PRIVMSG" then return line end
local channel = msg.params[1]:lower () local channel = msg.params[1]:lower ()

View File

@@ -28,15 +28,15 @@
-- background but to really fix that mode, we'd have to fully reimplement it -- background but to really fix that mode, we'd have to fully reimplement it
-- since its alternative prompt very often gets overriden by accident anyway. -- since its alternative prompt very often gets overriden by accident anyway.
degesch.hook_prompt (function (hook) xC.hook_prompt (function (hook)
local current = degesch.current_buffer local current = xC.current_buffer
local chan = current.channel local chan = current.channel
local s = current.server local s = current.server
local bg_color = "255" local bg_color = "255"
local current_n = 0 local current_n = 0
local active = "" local active = ""
for i, buffer in ipairs (degesch.buffers) do for i, buffer in ipairs (xC.buffers) do
if buffer == current then if buffer == current then
current_n = i current_n = i
elseif buffer.new_messages_count ~= buffer.new_unimportant_count then elseif buffer.new_messages_count ~= buffer.new_unimportant_count then
@@ -61,7 +61,7 @@ degesch.hook_prompt (function (hook)
end end
if current.hide_unimportant then x = x .. "<H>" end if current.hide_unimportant then x = x .. "<H>" end
local lines, cols = degesch.get_screen_size () local lines, cols = xC.get_screen_size ()
x = x .. " " .. active .. string.rep (" ", cols) x = x .. " " .. active .. string.rep (" ", cols)
-- Readline 7.0.003 seems to be broken and completely corrupts the prompt. -- Readline 7.0.003 seems to be broken and completely corrupts the prompt.

View File

@@ -23,7 +23,7 @@ local cjson = require "cjson"
-- Setup configuration to load last.fm API credentials from -- Setup configuration to load last.fm API credentials from
local user, api_key local user, api_key
degesch.setup_config { xC.setup_config {
user = { user = {
type = "string", type = "string",
comment = "last.fm username", comment = "last.fm username",
@@ -117,7 +117,7 @@ end
local running local running
-- Initiate a connection to last.fm servers -- Initiate a connection to last.fm servers
async, await = degesch.async, coroutine.yield async, await = xC.async, coroutine.yield
local make_request = function (buffer, action) local make_request = function (buffer, action)
if not user or not api_key then if not user or not api_key then
report_error (buffer, "configuration is incomplete") report_error (buffer, "configuration is incomplete")
@@ -159,7 +159,7 @@ local send_song = function (buffer)
end end
-- Hook input to simulate new commands -- Hook input to simulate new commands
degesch.hook_input (function (hook, buffer, input) xC.hook_input (function (hook, buffer, input)
if input == "/np" then if input == "/np" then
make_request (buffer, function (np) make_request (buffer, function (np)
now_playing = np now_playing = np

View File

@@ -15,8 +15,8 @@
-- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-- --
degesch.hook_irc (function (hook, server, line) xC.hook_irc (function (hook, server, line)
local msg = degesch.parse (line) local msg = xC.parse (line)
local start, timeout = line:match ("^(.* :Ping timeout:) (%d+) seconds$") local start, timeout = line:match ("^(.* :Ping timeout:) (%d+) seconds$")
if msg.command ~= "QUIT" or not start then if msg.command ~= "QUIT" or not start then
return line return line

View File

@@ -16,7 +16,7 @@
-- --
local smallest, highlight = 0, "\x1f" local smallest, highlight = 0, "\x1f"
degesch.setup_config { xC.setup_config {
smallest = { smallest = {
type = "integer", type = "integer",
default = "0", default = "0",
@@ -62,7 +62,7 @@ end
-- XXX: sadly it won't typically highlight primes in our own messages, -- XXX: sadly it won't typically highlight primes in our own messages,
-- unless IRCv3 echo-message is on -- unless IRCv3 echo-message is on
degesch.hook_irc (function (hook, server, line) xC.hook_irc (function (hook, server, line)
local start, message = line:match ("^(.- PRIVMSG .- :)(.*)$") local start, message = line:match ("^(.- PRIVMSG .- :)(.*)$")
return message and start .. do_message (message) or line return message and start .. do_message (message) or line
end) end)

View File

@@ -51,7 +51,7 @@ local load_emoji = function (extra)
for k, v in extra:gmatch "([^,]+) ([^,]+)" do emoji[k] = v end for k, v in extra:gmatch "([^,]+) ([^,]+)" do emoji[k] = v end
end end
degesch.setup_config { xC.setup_config {
servers = { servers = {
type = "string_array", type = "string_array",
default = "\"\"", default = "\"\"",
@@ -74,8 +74,8 @@ degesch.setup_config {
-- We can handle external messages about what we've supposedly sent just fine, -- We can handle external messages about what we've supposedly sent just fine,
-- so let's get rid of that "[username] some message sent from the web UI" crap -- so let's get rid of that "[username] some message sent from the web UI" crap
degesch.hook_irc (function (hook, server, line) xC.hook_irc (function (hook, server, line)
local msg, us = degesch.parse (line), server.user local msg, us = xC.parse (line), server.user
if not servers[server.name] or msg.command ~= "PRIVMSG" or not us if not servers[server.name] or msg.command ~= "PRIVMSG" or not us
or msg.params[1]:lower () ~= us.nickname:lower () then return line end or msg.params[1]:lower () ~= us.nickname:lower () then return line end
@@ -88,7 +88,7 @@ degesch.hook_irc (function (hook, server, line)
end) end)
-- Unfuck emoji and :nick!nick@irc.tinyspeck.com MODE #channel +v nick : active -- Unfuck emoji and :nick!nick@irc.tinyspeck.com MODE #channel +v nick : active
degesch.hook_irc (function (hook, server, line) xC.hook_irc (function (hook, server, line)
if not servers[server.name] then return line end if not servers[server.name] then return line end
if unemojify then if unemojify then
local start, text = line:match ("^(.- PRIVMSG .- :)(.*)$") local start, text = line:match ("^(.- PRIVMSG .- :)(.*)$")
@@ -101,7 +101,7 @@ degesch.hook_irc (function (hook, server, line)
end) end)
-- The gateway simply ignores the NAMES command altogether -- The gateway simply ignores the NAMES command altogether
degesch.hook_input (function (hook, buffer, input) xC.hook_input (function (hook, buffer, input)
if not buffer.channel or not servers[buffer.server.name] if not buffer.channel or not servers[buffer.server.name]
or not input:match "^/names%s*$" then return input end or not input:match "^/names%s*$" then return input end
@@ -119,9 +119,9 @@ degesch.hook_input (function (hook, buffer, input)
buffer:log (names) buffer:log (names)
end) end)
degesch.hook_completion (function (hook, data, word) xC.hook_completion (function (hook, data, word)
local chan = degesch.current_buffer.channel local chan = xC.current_buffer.channel
local server = degesch.current_buffer.server local server = xC.current_buffer.server
if not chan or not servers[server.name] then return end if not chan or not servers[server.name] then return end
-- In /commands there is typically no desire at all to add the at sign -- In /commands there is typically no desire at all to add the at sign

View File

@@ -52,11 +52,11 @@ local do_text = function (text)
return text:gsub ('%f[%g]https?://%g+', do_single_url) return text:gsub ('%f[%g]https?://%g+', do_single_url)
end end
degesch.hook_irc (function (hook, server, line) xC.hook_irc (function (hook, server, line)
local start, message = line:match ("^(.* :)(.*)$") local start, message = line:match ("^(.* :)(.*)$")
return message and start .. do_text (message) or line return message and start .. do_text (message) or line
end) end)
degesch.hook_input (function (hook, buffer, input) xC.hook_input (function (hook, buffer, input)
return do_text (input) return do_text (input)
end) end)

8
test
View File

@@ -1,14 +1,14 @@
#!/usr/bin/expect -f #!/usr/bin/expect -f
# Very basic end-to-end testing for Travis CI # Very basic end-to-end testing for CI
# Run the daemon to test against # Run the daemon to test against
system ./kike --write-default-cfg system ./xD --write-default-cfg
spawn ./kike -d spawn ./xD -d
# 10 seconds is a bit too much # 10 seconds is a bit too much
set timeout 5 set timeout 5
spawn ./degesch spawn ./xC
# Fuck this Tcl shit, I want the exit code # Fuck this Tcl shit, I want the exit code
expect_after { expect_after {

26
test-nick-colors Executable file
View File

@@ -0,0 +1,26 @@
#!/bin/sh
# Check whether the terminal colours filtered by our algorithm are legible
export example=$(
tcc "-run -lm" - <<-END
#include <stddef.h>
#include <stdio.h>
#include <math.h>
#define N_ELEMENTS(a) (sizeof (a) / sizeof ((a)[0]))
$(perl -0777 -ne 'print $& if /^.*?\nfilter_color(?s:.*?)^}$/m' \
"$(dirname "$0")"/xC.c)
void main () {
size_t len = 0;
int *table = filter_color_cube_for_acceptable_nick_colors (&len);
for (size_t i = 0; i < len; i++)
printf ("<@\\x1b[38;5;%dmIRCuser\\x1b[m> I'm typing!\n", table[i]);
}
END
)
# Both should give acceptable results,
# which results in a bad compromise that the main author himself needs
xterm -bg black -fg white -e 'echo $example; cat' &
xterm -bg white -fg black -e 'echo $example; cat' &

View File

@@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# We don't use printf's percent notation with our custom logging mechanism, # We don't use printf's percent notation with our custom logging mechanism,
# so the compiler cannot check it for us like it usually does # so the compiler cannot check it for us like it usually does
perl -n0777 - "$(dirname "$0")"/degesch.c <<-'END' perl -n0777 - "$(dirname "$0")"/xC.c <<-'END'
while (/\blog_[^ ]+\s*\([^"()]*"[^"]*%[^%][^"]*"/gm) { while (/\blog_[^ ]+\s*\([^"()]*"[^"]*%[^%][^"]*"/gm) {
my ($p, $m) = ($`, $&); my ($p, $m) = ($`, $&);
printf "$ARGV:%d: suspicious log format string: %s...\n", printf "$ARGV:%d: suspicious log format string: %s...\n",

View File

@@ -1,20 +1,20 @@
zyklonb(1) xB(1)
========== =====
:doctype: manpage :doctype: manpage
:manmanual: uirc3 Manual :manmanual: uirc3 Manual
:mansource: uirc3 {release-version} :mansource: uirc3 {release-version}
Name Name
---- ----
zyklonb - modular IRC bot xB - modular IRC bot
Synopsis Synopsis
-------- --------
*zyklonb* [_OPTION_]... *xB* [_OPTION_]...
Description Description
----------- -----------
*zyklonb* is a modular IRC bot with a programming language-agnostic plugin *xB* is a modular IRC bot with a programming language-agnostic plugin
architecture based on co-processes. architecture based on co-processes.
Options Options
@@ -57,24 +57,24 @@ Plugins
------- -------
Plugins communicate with the bot over their standard input and output streams Plugins communicate with the bot over their standard input and output streams
using the IRC protocol. (Caveat: the standard C library doesn't automatically using the IRC protocol. (Caveat: the standard C library doesn't automatically
flush FILE streams for pipes on newlines.) A special *ZYKLONB* command is flush FILE streams for pipes on newlines.) A special *XB* command is introduced
introduced for RPC, with the following subcommands: for RPC, with the following subcommands:
*ZYKLONB get_config* _key_:: *XB get_config* _key_::
Request the value of the given configuration option. If no such option Request the value of the given configuration option. If no such option
exists, the value will be empty. The response will be delivered in exists, the value will be empty. The response will be delivered in
the following format: the following format:
+ +
``` ```
ZYKLONB :value XB :value
``` ```
+ +
This is particularly useful for retrieving the *prefix* string. This is particularly useful for retrieving the *prefix* string.
*ZYKLONB print* _message_:: *XB print* _message_::
Make the bot print the _message_ on its standard output. Make the bot print the _message_ on its standard output.
*ZYKLONB register*:: *XB register*::
Once a plugin issues this command, it will start receiving all of the bot's Once a plugin issues this command, it will start receiving all of the bot's
incoming IRC traffic, which includes data from the initialization period. incoming IRC traffic, which includes data from the initialization period.
@@ -82,19 +82,19 @@ All other commands will be forwarded directly to the IRC server.
Files Files
----- -----
*zyklonb* follows the XDG Base Directory Specification. *xB* follows the XDG Base Directory Specification.
_~/.config/zyklonb/zyklonb.conf_:: _~/.config/xB/xB.conf_::
The bot's configuration file. Use the *--write-default-cfg* option The bot's configuration file. Use the *--write-default-cfg* option
to create a new one for editing. to create a new one for editing.
_~/.local/share/zyklonb/_:: _~/.local/share/xB/_::
The initial working directory for plugins, in which they may create private The initial working directory for plugins, in which they may create private
databases or other files as needed. databases or other files as needed.
_~/.local/share/zyklonb/plugins/_:: _~/.local/share/xB/plugins/_::
_/usr/local/share/zyklonb/plugins/_:: _/usr/local/share/xB/plugins/_::
_/usr/share/zyklonb/plugins/_:: _/usr/share/xB/plugins/_::
Plugins are searched for in these directories, in order, unless Plugins are searched for in these directories, in order, unless
the *plugin_dir* configuration option overrides this. the *plugin_dir* configuration option overrides this.

View File

@@ -1,5 +1,5 @@
/* /*
* zyklonb.c: a modular IRC bot * xB.c: a modular IRC bot
* *
* Copyright (c) 2014 - 2020, Přemysl Eric Janouch <p@janouch.name> * Copyright (c) 2014 - 2020, Přemysl Eric Janouch <p@janouch.name>
* *
@@ -17,7 +17,7 @@
*/ */
#include "config.h" #include "config.h"
#define PROGRAM_NAME "ZyklonB" #define PROGRAM_NAME "xB"
#include "common.c" #include "common.c"
@@ -25,9 +25,9 @@
static struct simple_config_item g_config_table[] = static struct simple_config_item g_config_table[] =
{ {
{ "nickname", "ZyklonB", "IRC nickname" }, { "nickname", "xB", "IRC nickname" },
{ "username", "bot", "IRC user name" }, { "username", "bot", "IRC user name" },
{ "realname", "ZyklonB IRC bot", "IRC real name/e-mail" }, { "realname", "xB IRC bot", "IRC real name/e-mail" },
{ "irc_host", NULL, "Address of the IRC server" }, { "irc_host", NULL, "Address of the IRC server" },
{ "irc_port", "6667", "Port of the IRC server" }, { "irc_port", "6667", "Port of the IRC server" },
@@ -735,7 +735,7 @@ setup_recovery_handler (struct bot_context *ctx, struct error **e)
// --- Plugins ----------------------------------------------------------------- // --- Plugins -----------------------------------------------------------------
/// The name of the special IRC command for interprocess communication /// The name of the special IRC command for interprocess communication
static const char *plugin_ipc_command = "ZYKLONB"; static const char *plugin_ipc_command = "XB";
static struct plugin * static struct plugin *
plugin_find_by_pid (struct bot_context *ctx, pid_t pid) plugin_find_by_pid (struct bot_context *ctx, pid_t pid)
@@ -1860,7 +1860,7 @@ on_plugin_death (struct plugin *plugin, int status)
struct bot_context *ctx = plugin->ctx; struct bot_context *ctx = plugin->ctx;
// TODO: callbacks on children death, so that we may tell the user // TODO: callbacks on children death, so that we may tell the user
// "plugin `name' died like a dirty jewish pig"; use `status' // "plugin `name' died"; use `status'
if (!plugin->is_zombie && WIFSIGNALED (status)) if (!plugin->is_zombie && WIFSIGNALED (status))
{ {
const char *notes = ""; const char *notes = "";

View File

@@ -1,22 +1,22 @@
degesch(1) xC(1)
========== =====
:doctype: manpage :doctype: manpage
:manmanual: uirc3 Manual :manmanual: uirc3 Manual
:mansource: uirc3 {release-version} :mansource: uirc3 {release-version}
Name Name
---- ----
degesch - terminal-based IRC client xC - terminal-based IRC client
Synopsis Synopsis
-------- --------
*degesch* [_OPTION_]... *xC* [_OPTION_]...
Description Description
----------- -----------
*degesch* is a scriptable IRC client for the command line. On the first run *xC* is a scriptable IRC client for the command line. On the first run it will
it will welcome you with an introductory message. Should you ever get lost, welcome you with an introductory message. Should you ever get lost, use the
use the */help* command to obtain more information on commands or options. */help* command to obtain more information on commands or options.
Options Options
------- -------
@@ -26,7 +26,7 @@ Options
database: database:
+ +
``` ```
printf '\x02bold\x02\n' | degesch -f printf '\x02bold\x02\n' | xC -f
``` ```
+ +
This feature may be used to preview server MOTD files. This feature may be used to preview server MOTD files.
@@ -98,18 +98,18 @@ Environment
Files Files
----- -----
*degesch* follows the XDG Base Directory Specification. *xC* follows the XDG Base Directory Specification.
_~/.config/degesch/degesch.conf_:: _~/.config/xC/xC.conf_::
The program's configuration file. Preferrably use internal facilities, such The program's configuration file. Preferrably use internal facilities, such
as the */set* command, to make changes in it. as the */set* command, to make changes in it.
_~/.local/share/degesch/logs/_:: _~/.local/share/xC/logs/_::
When enabled by *behaviour.logging*, log files are stored here. When enabled by *behaviour.logging*, log files are stored here.
_~/.local/share/degesch/plugins/_:: _~/.local/share/xC/plugins/_::
_/usr/local/share/degesch/plugins/_:: _/usr/local/share/xC/plugins/_::
_/usr/share/degesch/plugins/_:: _/usr/share/xC/plugins/_::
Plugins are searched for in these directories, in order. Plugins are searched for in these directories, in order.
Bugs Bugs

File diff suppressed because it is too large Load Diff

View File

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

View File

@@ -2,7 +2,7 @@
LC_ALL=C exec awk ' LC_ALL=C exec awk '
BEGIN { BEGIN {
# The message catalog is a by-product # The message catalog is a by-product
msg = "kike.msg" msg = "xD.msg"
print "$quote \"" > msg; print "$quote \"" > msg;
print "$set 1" > msg; print "$set 1" > msg;
} }

View File

@@ -85,3 +85,9 @@
482 IRC_ERR_CHANOPRIVSNEEDED "%s :You're not channel operator" 482 IRC_ERR_CHANOPRIVSNEEDED "%s :You're not channel operator"
501 IRC_ERR_UMODEUNKNOWNFLAG ":Unknown MODE flag" 501 IRC_ERR_UMODEUNKNOWNFLAG ":Unknown MODE flag"
502 IRC_ERR_USERSDONTMATCH ":Cannot change mode for other users" 502 IRC_ERR_USERSDONTMATCH ":Cannot change mode for other users"
902 IRC_ERR_NICKLOCKED ":You must use a nick assigned to you"
903 IRC_RPL_SASLSUCCESS ":SASL authentication successful"
904 IRC_ERR_SASLFAIL ":SASL authentication failed"
905 IRC_ERR_SASLTOOLONG ":SASL message too long"
906 IRC_ERR_SASLABORTED ":SASL authentication aborted"
907 IRC_ERR_SASLALREADY ":You have already authenticated using SASL"

View File

@@ -1,20 +1,20 @@
kike(1) xD(1)
======= =====
:doctype: manpage :doctype: manpage
:manmanual: uirc3 Manual :manmanual: uirc3 Manual
:mansource: uirc3 {release-version} :mansource: uirc3 {release-version}
Name Name
---- ----
kike - IRC daemon xD - IRC daemon
Synopsis Synopsis
-------- --------
*kike* [_OPTION_]... *xD* [_OPTION_]...
Description Description
----------- -----------
*kike* is a basic IRC daemon for single-server networks, suitable for testing *xD* is a basic IRC daemon for single-server networks, suitable for testing
and private use. When run without a configuration file, it will start listening and private use. When run without a configuration file, it will start listening
on the standard port 6667 and the "any" address. on the standard port 6667 and the "any" address.
@@ -40,10 +40,10 @@ contrary to what you might expect from a server.
Files Files
----- -----
*kike* follows the XDG Base Directory Specification. *xD* follows the XDG Base Directory Specification.
_~/.config/kike/kike.conf_:: _~/.config/xD/xD.conf_::
_/etc/xdg/kike/kike.conf_:: _/etc/xdg/xD/xD.conf_::
The daemon's configuration file. Use the *--write-default-cfg* option The daemon's configuration file. Use the *--write-default-cfg* option
to create a new one for editing. to create a new one for editing.

View File

@@ -1,7 +1,7 @@
/* /*
* kike.c: an IRC daemon * xD.c: an IRC daemon
* *
* Copyright (c) 2014 - 2020, Přemysl Eric Janouch <p@janouch.name> * Copyright (c) 2014 - 2021, Přemysl Eric Janouch <p@janouch.name>
* *
* Permission to use, copy, modify, and/or distribute this software for any * Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted. * purpose with or without fee is hereby granted.
@@ -17,12 +17,14 @@
*/ */
#include "config.h" #include "config.h"
#define PROGRAM_NAME "kike" #define PROGRAM_NAME "xD"
#define WANT_SYSLOG_LOGGING #define WANT_SYSLOG_LOGGING
#include "common.c" #include "common.c"
#include "kike-replies.c" #include "xD-replies.c"
#include <nl_types.h> #include <nl_types.h>
#include <sys/resource.h>
enum { PIPE_READ, PIPE_WRITE }; enum { PIPE_READ, PIPE_WRITE };
@@ -3984,6 +3986,21 @@ daemonize (struct server_context *ctx)
poller_post_fork (&ctx->poller); poller_post_fork (&ctx->poller);
} }
static void
setup_limits (void)
{
struct rlimit limit;
if (getrlimit (RLIMIT_NOFILE, &limit))
{
print_warning ("%s: %s", "getrlimit", strerror (errno));
return;
}
limit.rlim_cur = limit.rlim_max;
if (setrlimit (RLIMIT_NOFILE, &limit))
print_warning ("%s: %s", "setrlimit", strerror (errno));
}
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
@@ -4030,6 +4047,7 @@ main (int argc, char *argv[])
print_status (PROGRAM_NAME " " PROGRAM_VERSION " starting"); print_status (PROGRAM_NAME " " PROGRAM_VERSION " starting");
setup_signal_handlers (); setup_signal_handlers ();
setup_limits ();
init_openssl (); init_openssl ();
struct server_context ctx; struct server_context ctx;