Skip to content

Commit bab1bfd

Browse files
committed
Add tinysshd -k flag to log using Linux kernel format
Signed-off-by: Maxime Soulé <btik-git@scoubidou.com>
1 parent 40e0fe7 commit bab1bfd

File tree

3 files changed

+49
-13
lines changed

3 files changed

+49
-13
lines changed

man/tinysshd.8

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,14 @@ symmetric \- chacha20\-poly1305@openssh.com
5858
.B \-P
5959
disable post\-quantum crypto
6060
.TP
61+
.B \-k
62+
use Linux kernel format on standard error output (useful for redirecting to /dev/kmsg)
63+
.TP
6164
.B \-l
6265
use syslog instead of standard error output (useful for running from inetd)
6366
.TP
6467
.B \-L
65-
don't use syslog, use standard error output (default)
68+
don't use syslog nor Linux kernel format, use standard error output (default)
6669
.TP
6770
.B \-x \fIname=command
6871
add subsystem command (e.g.: sftp=/usr/libexec/openssh/sftp\-server)

tinyssh/log.c

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ The 'log' library also supports syslog.
1111
*/
1212

1313
#include <syslog.h>
14+
#include <stdio.h>
1415
#include "writeall.h"
1516
#include "randommod.h"
1617
#include "purge.h"
@@ -24,10 +25,18 @@ static int loglevel = 1;
2425

2526
static int logflagfnln = 1;
2627
static int logflagsyslog = 0;
28+
static int logflagkernelfmt = 0;
2729

2830
static char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTSUVWXYZ0123456789";
2931

30-
void log_init(int level, const char *text, int line, int flagsyslog) {
32+
static char kfmtbug[5] = "____";
33+
static char kfmtfatal[5] = "____";
34+
static char kfmtwarning[5] = "____";
35+
static char kfmtinfo[5] = "____";
36+
static char kfmtdebug[5] = "____";
37+
static char kfmtnotice[5] = "____";
38+
39+
void log_init(int level, const char *text, int line, int flaglogger) {
3140

3241
long long i;
3342

@@ -40,9 +49,20 @@ void log_init(int level, const char *text, int line, int flagsyslog) {
4049
}
4150
logstring[sizeof logstring - 1] = 0;
4251

43-
if (flagsyslog) {
44-
openlog(text, 0, LOG_DAEMON);
45-
logflagsyslog = 1;
52+
switch (flaglogger) {
53+
case 1:
54+
openlog(text, 0, LOG_DAEMON);
55+
logflagsyslog = 1;
56+
break;
57+
case 2:
58+
logflagkernelfmt = 1;
59+
snprintf(kfmtbug, sizeof kfmtbug, "<%d>", LOG_DAEMON|LOG_ALERT);
60+
snprintf(kfmtfatal, sizeof kfmtfatal, "<%d>", LOG_DAEMON|LOG_EMERG);
61+
snprintf(kfmtwarning, sizeof kfmtwarning, "<%d>", LOG_DAEMON|LOG_WARNING);
62+
snprintf(kfmtinfo, sizeof kfmtinfo, "<%d>", LOG_DAEMON|LOG_INFO);
63+
snprintf(kfmtdebug, sizeof kfmtdebug, "<%d>", LOG_DAEMON|LOG_DEBUG);
64+
snprintf(kfmtnotice, sizeof kfmtnotice, "<%d>", LOG_DAEMON|LOG_NOTICE);
65+
break;
4666
}
4767

4868
errno = 0;
@@ -115,28 +135,39 @@ void log_9_(
115135

116136
switch (level) {
117137
case -1:
118-
m = "BUG";
138+
m = logflagkernelfmt ? kfmtbug : "BUG";
119139
break;
120140
case 0:
121141
m = "usage";
122142
break;
123143
case 1:
124-
m = "fatal";
144+
m = logflagkernelfmt ? kfmtfatal : "fatal";
125145
break;
126-
case 2:
127-
if (!ignoreerrno) m = "warning";
128-
else m = "info";
146+
case 2:
147+
if (!ignoreerrno) m = logflagkernelfmt ? kfmtwarning : "warning";
148+
else m = logflagkernelfmt ? kfmtinfo : "info";
129149
break;
130150
case 3:
131-
m = "debug";
151+
m = logflagkernelfmt ? kfmtdebug : "debug";
132152
break;
133153
default:
134-
m = "unknown";
154+
m = logflagkernelfmt ? kfmtnotice : "unknown";
135155
break;
136156
}
137157

138158

139-
/* name: session: level: message (error){file:line} */
159+
/*
160+
Default format:
161+
name: session: level: message (error){file:line}
162+
Linux kernel format:
163+
<kern_level>name: session: message (error){file:line}
164+
*/
165+
166+
do {
167+
if (level == 0) break; /* don't print in usage level */
168+
if (!logflagkernelfmt) break; /* print only in kernelfmt mode */
169+
outs(m);
170+
} while (0);
140171

141172
/* 'name:' */
142173
do {
@@ -155,6 +186,7 @@ void log_9_(
155186
/* 'level:' */
156187
do {
157188
if (level == 0) break; /* don't print in usage level */
189+
if (logflagkernelfmt) break; /* don't print in kernelfmt mode */
158190
outs(m); outs(": ");
159191
} while (0);
160192

tinyssh/main_tinysshd.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ int main_tinysshd(int argc, char **argv, const char *binaryname) {
9696
if (*x == 'S') { cryptotypeselected &= ~sshcrypto_TYPENEWCRYPTO; continue; }
9797
if (*x == 'p') { cryptotypeselected |= sshcrypto_TYPEPQCRYPTO; continue; }
9898
if (*x == 'P') { cryptotypeselected &= ~sshcrypto_TYPEPQCRYPTO; continue; }
99+
if (*x == 'k') { flaglogger = 2; continue; }
99100
if (*x == 'l') { flaglogger = 1; continue; }
100101
if (*x == 'L') { flaglogger = 0; continue; }
101102
if (*x == 'x') {

0 commit comments

Comments
 (0)