diff options
author | lns <matzeton@googlemail.com> | 2018-04-17 23:01:23 +0200 |
---|---|---|
committer | lns <matzeton@googlemail.com> | 2018-04-17 23:01:23 +0200 |
commit | 4a3a64e344856c730711e87215ac56d77a80a956 (patch) | |
tree | ce992a8ce351322ce1dd0a7b57c78e07ef5f79d7 | |
parent | c7b3d7218d36a1c6601e48f00b4a6a82c0d5c015 (diff) |
POTD skeleton #14.
Signed-off-by: lns <matzeton@googlemail.com>
-rw-r--r-- | src/server.c | 11 | ||||
-rw-r--r-- | src/server_ssh.c | 27 |
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; } |