From da3920c3a4f9de10b1a6249c7084b52a13699a2e Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 17 Aug 2020 15:59:00 +0200 Subject: [PATCH] journal: move qrcode printing code to src/shared/ That way we can make use of it in homctl, too. --- meson.build | 3 +- src/journal/journal-qrcode.c | 53 ++---------------------------- src/shared/meson.build | 7 ++++ src/shared/qrcode-util.c | 63 ++++++++++++++++++++++++++++++++++++ src/shared/qrcode-util.h | 9 ++++++ 5 files changed, 83 insertions(+), 52 deletions(-) create mode 100644 src/shared/qrcode-util.c create mode 100644 src/shared/qrcode-util.h diff --git a/meson.build b/meson.build index a42fbc1d6d..cd2b02488b 100644 --- a/meson.build +++ b/meson.build @@ -2196,7 +2196,8 @@ if conf.get('ENABLE_HOMED') == 1 libcrypt, libopenssl, libp11kit, - libfido2], + libfido2, + libdl], install_rpath : rootlibexecdir, install : true, install_dir : rootbindir) diff --git a/src/journal/journal-qrcode.c b/src/journal/journal-qrcode.c index 8c8360853e..e8a7655316 100644 --- a/src/journal/journal-qrcode.c +++ b/src/journal/journal-qrcode.c @@ -13,24 +13,9 @@ #include "journal-qrcode.h" #include "locale-util.h" #include "macro.h" +#include "qrcode-util.h" #include "terminal-util.h" -#define ANSI_WHITE_ON_BLACK "\033[40;37;1m" - -static void print_border(FILE *output, unsigned width) { - unsigned x, y; - - /* Four rows of border */ - for (y = 0; y < 4; y += 2) { - fputs(ANSI_WHITE_ON_BLACK, output); - - for (x = 0; x < 4 + width + 4; x++) - fputs("\342\226\210", output); - - fputs(ANSI_NORMAL "\n", output); - } -} - int print_qr_code( FILE *output, const char *prefix_text, @@ -47,7 +32,6 @@ int print_qr_code( _cleanup_free_ char *url = NULL; _cleanup_fclose_ FILE *f = NULL; size_t url_size = 0; - unsigned x, y; QRcode* qr; int r; @@ -106,40 +90,7 @@ int print_qr_code( if (prefix_text) fputs(prefix_text, output); - print_border(output, qr->width); - - for (y = 0; y < (unsigned) qr->width; y += 2) { - const uint8_t *row1, *row2; - - row1 = qr->data + qr->width * y; - row2 = row1 + qr->width; - - fputs(ANSI_WHITE_ON_BLACK, output); - for (x = 0; x < 4; x++) - fputs("\342\226\210", output); - - for (x = 0; x < (unsigned) qr->width; x ++) { - bool a, b; - - a = row1[x] & 1; - b = (y+1) < (unsigned) qr->width ? (row2[x] & 1) : false; - - if (a && b) - fputc(' ', output); - else if (a) - fputs("\342\226\204", output); - else if (b) - fputs("\342\226\200", output); - else - fputs("\342\226\210", output); - } - - for (x = 0; x < 4; x++) - fputs("\342\226\210", output); - fputs(ANSI_NORMAL "\n", output); - } - - print_border(output, qr->width); + write_qrcode(output, qr); sym_QRcode_free(qr); return 0; diff --git a/src/shared/meson.build b/src/shared/meson.build index 57f36af252..38762f020e 100644 --- a/src/shared/meson.build +++ b/src/shared/meson.build @@ -304,6 +304,13 @@ if conf.get('HAVE_PAM') == 1 '''.split()) endif +if conf.get('HAVE_QRENCODE') == 1 + shared_sources += files(''' + qrcode-util.c + qrcode-util.h +'''.split()) +endif + generate_ip_protocol_list = find_program('generate-ip-protocol-list.sh') ip_protocol_list_txt = custom_target( 'ip-protocol-list.txt', diff --git a/src/shared/qrcode-util.c b/src/shared/qrcode-util.c new file mode 100644 index 0000000000..a545daaef3 --- /dev/null +++ b/src/shared/qrcode-util.c @@ -0,0 +1,63 @@ +#include "qrcode-util.h" +#include "terminal-util.h" + +#define ANSI_WHITE_ON_BLACK "\033[40;37;1m" + +static void print_border(FILE *output, unsigned width) { + unsigned x, y; + + /* Four rows of border */ + for (y = 0; y < 4; y += 2) { + fputs(ANSI_WHITE_ON_BLACK, output); + + for (x = 0; x < 4 + width + 4; x++) + fputs("\342\226\210", output); + + fputs(ANSI_NORMAL "\n", output); + } +} + +void write_qrcode(FILE *output, QRcode *qr) { + unsigned x, y; + + assert(qr); + + if (!output) + output = stdout; + + print_border(output, qr->width); + + for (y = 0; y < (unsigned) qr->width; y += 2) { + const uint8_t *row1, *row2; + + row1 = qr->data + qr->width * y; + row2 = row1 + qr->width; + + fputs(ANSI_WHITE_ON_BLACK, output); + for (x = 0; x < 4; x++) + fputs("\342\226\210", output); + + for (x = 0; x < (unsigned) qr->width; x ++) { + bool a, b; + + a = row1[x] & 1; + b = (y+1) < (unsigned) qr->width ? (row2[x] & 1) : false; + + if (a && b) + fputc(' ', output); + else if (a) + fputs("\342\226\204", output); + else if (b) + fputs("\342\226\200", output); + else + fputs("\342\226\210", output); + } + + for (x = 0; x < 4; x++) + fputs("\342\226\210", output); + fputs(ANSI_NORMAL "\n", output); + } + + print_border(output, qr->width); + fflush(output); +} diff --git a/src/shared/qrcode-util.h b/src/shared/qrcode-util.h new file mode 100644 index 0000000000..9a21ffd7fe --- /dev/null +++ b/src/shared/qrcode-util.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: LGPL-2.1+ */ +#pragma once + +#if HAVE_QRENCODE +#include +#include + +void write_qrcode(FILE *output, QRcode *qr); +#endif