1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-16 00:00:07 +01:00
libwebsockets/minimal-examples/abstract/protocols/smtp-client/main.c
Andy Green 0ab4a707fb format strings: ban %.*s as some platforms lack it
The %.*s is very handy to print strings where you have a length, but
there is no NUL termination.  It's quite widely supported but at least
one vendor RTOS toolchain doesn't have it.

Since there aren't that many uses of it yet, audit all uses and
convert to a new helper lws_strnncpy() which uses the smaller of
two lengths.
2019-11-04 13:49:14 +00:00

126 lines
2.7 KiB
C

/*
* lws-api-test-smtp_client
*
* Written in 2010-2019 by Andy Green <andy@warmcat.com>
*
* This file is made available under the Creative Commons CC0 1.0
* Universal Public Domain Dedication.
*/
#include <libwebsockets.h>
#include <signal.h>
static int interrupted, result = 1;
static const char *recip;
static void
sigint_handler(int sig)
{
interrupted = 1;
}
static int
done_cb(struct lws_smtp_email *email, void *buf, size_t len)
{
/* you could examine email->data here */
if (buf) {
char dotstar[96];
lws_strnncpy(dotstar, (const char *)buf, len, sizeof(dotstar));
lwsl_notice("%s: %s\n", __func__, dotstar);
} else
lwsl_notice("%s:\n", __func__);
/* destroy any allocations in email */
free((char *)email->payload);
result = 0;
interrupted = 1;
return 0;
}
int main(int argc, const char **argv)
{
int n = 1, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;
struct lws_context_creation_info info;
lws_smtp_sequencer_args_t ss_args;
struct lws_context *context;
lws_smtp_sequencer_t *sseq;
lws_smtp_email_t *email;
struct lws_vhost *vh;
char payload[2048];
const char *p;
/* the normal lws init */
signal(SIGINT, sigint_handler);
if ((p = lws_cmdline_option(argc, argv, "-d")))
logs = atoi(p);
p = lws_cmdline_option(argc, argv, "-r");
if (!p) {
lwsl_err("-r <recipient email> is required\n");
return 1;
}
recip = p;
lws_set_log_level(logs, NULL);
lwsl_user("LWS API selftest: SMTP client\n");
memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */
info.port = CONTEXT_PORT_NO_LISTEN;
info.options = LWS_SERVER_OPTION_EXPLICIT_VHOSTS;
context = lws_create_context(&info);
if (!context) {
lwsl_err("lws init failed\n");
return 1;
}
vh = lws_create_vhost(context, &info);
if (!vh) {
lwsl_err("Failed to create first vhost\n");
goto bail1;
}
memset(&ss_args, 0, sizeof(ss_args));
ss_args.helo = "lws-abs-smtp-test";
ss_args.vhost = vh;
sseq = lws_smtp_sequencer_create(&ss_args);
if (!sseq) {
lwsl_err("%s: smtp sequencer create failed\n", __func__);
goto bail1;
}
/* attach an email to it */
n = lws_snprintf(payload, sizeof(payload),
"From: noreply@example.com\n"
"To: %s\n"
"Subject: Test email for lws smtp-client\n"
"\n"
"Hello this was an api test for lws smtp-client\n"
"\r\n.\r\n", recip);
if (lws_smtpc_add_email(sseq, payload, n, "testserver",
"andy@warmcat.com", recip, NULL, done_cb)) {
lwsl_err("%s: failed to add email\n", __func__);
goto bail1;
}
/* the usual lws event loop */
while (n >= 0 && !interrupted)
n = lws_service(context, 0);
bail1:
lwsl_user("Completed: %s\n", result ? "FAIL" : "PASS");
lws_context_destroy(context);
return result;
}