aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlns <matzeton@googlemail.com>2018-04-17 23:01:23 +0200
committerlns <matzeton@googlemail.com>2018-04-17 23:01:23 +0200
commit4a3a64e344856c730711e87215ac56d77a80a956 (patch)
treece992a8ce351322ce1dd0a7b57c78e07ef5f79d7
parentc7b3d7218d36a1c6601e48f00b4a6a82c0d5c015 (diff)
POTD skeleton #14.
Signed-off-by: lns <matzeton@googlemail.com>
-rw-r--r--src/server.c11
-rw-r--r--src/server_ssh.c27
2 files changed, 25 insertions, 13 deletions
diff --git a/src/server.c b/src/server.c
index 5a3e6c5..e1b93cc 100644
--- a/src/server.c
+++ b/src/server.c
@@ -2,6 +2,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
+#include <signal.h>
#include <sys/epoll.h>
#include <pthread.h>
#include <assert.h>
@@ -110,6 +111,7 @@ int server_setup_epoll(server_ctx *ctx[], size_t siz)
int server_mainloop_epoll(int epoll_fd, server_ctx *ctx[], size_t siz)
{
static struct epoll_event *events = NULL;
+ sigset_t eset;
if (!events)
events = (struct epoll_event *) calloc(POTD_MAXEVENTS, sizeof(*events));
@@ -118,10 +120,11 @@ int server_mainloop_epoll(int epoll_fd, server_ctx *ctx[], size_t siz)
assert(ctx);
assert(siz > 0 && siz < POTD_MAXFD);
+ sigemptyset(&eset);
while (1) {
int n, i;
- n = epoll_wait(epoll_fd, events, POTD_MAXEVENTS, -1);
+ n = epoll_pwait(epoll_fd, events, POTD_MAXEVENTS, -1, &eset);
if (n < 0)
return 1;
@@ -201,6 +204,7 @@ client_mainloop_epoll(void *arg)
int s, epoll_fd, active = 1;
struct epoll_event event = {0,{0}};
struct epoll_event *events;
+ sigset_t eset;
assert(arg);
args = (client_thread_args *) arg;
@@ -222,10 +226,11 @@ client_mainloop_epoll(void *arg)
goto finish;
}
+ sigemptyset(&eset);
while (active) {
int n, i;
- n = epoll_wait(epoll_fd, events, POTD_MAXEVENTS, -1);
+ n = epoll_pwait(epoll_fd, events, POTD_MAXEVENTS, -1, &eset);
if (n < 0)
break;
@@ -236,7 +241,7 @@ client_mainloop_epoll(void *arg)
!(events[i].events & EPOLLOUT)))
{
E("Epoll for descriptor %d failed", events[i].data.fd);
- E_STRERR("epoll_wait");
+ E_STRERR("epoll_pwait");
close(events[i].data.fd);
continue;
} else {
diff --git a/src/server_ssh.c b/src/server_ssh.c
index 09dc9f8..3c9c2bd 100644
--- a/src/server_ssh.c
+++ b/src/server_ssh.c
@@ -75,7 +75,6 @@ static int set_default_keys(ssh_bind sshbind, int rsa_already_set,
return 1;
}
}
-#ifdef POTD_OBSOLETE_SSHKEY
if (!dsa_already_set) {
if (ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY,
"./ssh_host_dsa_key")) {
@@ -83,7 +82,6 @@ static int set_default_keys(ssh_bind sshbind, int rsa_already_set,
return 1;
}
}
-#endif
if (!ecdsa_already_set) {
if (ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_ECDSAKEY,
"./ssh_host_ecdsa_key")) {
@@ -97,14 +95,22 @@ static int set_default_keys(ssh_bind sshbind, int rsa_already_set,
static int gen_default_keys(void)
{
- if (gen_export_sshkey(SSH_KEYTYPE_RSA, 1024, "./ssh_host_rsa_key"))
- return 1;
- if (gen_export_sshkey(SSH_KEYTYPE_DSS, 1024, "./ssh_host_dsa_key"))
- return 1;
- if (gen_export_sshkey(SSH_KEYTYPE_ECDSA, 1024, "./ssh_host_ecdsa_key"))
- return 1;
+ int s = 0;
- return 0;
+ if (gen_export_sshkey(SSH_KEYTYPE_RSA, 1024, "./ssh_host_rsa_key")) {
+ W("%s", "libssh RSA key generation failed, using fallback ssh-keygen");
+ s |= system("ssh-keygen -t rsa -b 1024 -f ./ssh_host_rsa_key");
+ }
+ if (gen_export_sshkey(SSH_KEYTYPE_DSS, 1024, "./ssh_host_dsa_key")) {
+ W("%s", "libssh DSA key generation failed, using fallback ssh-keygen");
+ s |= system("ssh-keygen -t dsa -b 1024 -f ./ssh_host_dsa_key");
+ }
+ if (gen_export_sshkey(SSH_KEYTYPE_ECDSA, 1024, "./ssh_host_ecdsa_key")) {
+ W("%s", "libssh ECDSA key generation failed, using fallback ssh-keygen");
+ s |= system("ssh-keygen -t ecdsa -b 256 -f ./ssh_host_ecdsa_key");
+ }
+
+ return s != 0;
}
static int gen_export_sshkey(enum ssh_keytypes_e type, int length, const char *path)
@@ -140,11 +146,12 @@ static int gen_export_sshkey(enum ssh_keytypes_e type, int length, const char *p
}
s = ssh_pki_export_privkey_file(priv_key, "", NULL,
NULL, path);
+ ssh_key_free(priv_key);
+
if (s != SSH_OK) {
E2("SSH private key export to file failed: %d", s);
return 1;
}
- ssh_key_free(priv_key);
return 0;
}