[balsa] libnetclient: use G_DECLARE*
- From: Peter Bloomfield <peterb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [balsa] libnetclient: use G_DECLARE*
- Date: Sun, 2 Jun 2019 18:00:43 +0000 (UTC)
commit 713d66e3b0d959bc630f7b6ce7f94868f1c81383
Author: Albrecht Dreß <albrecht dress arcor de>
Date: Sun Jun 2 13:59:55 2019 -0400
libnetclient: use G_DECLARE*
* libnetclient/net-client-pop.[ch]: use G_DECLARE_FINAL_TYPE(),
and drop storing the private object data in a separate structure;
• net_client_pop_get_capa(): enable pipelining only if included
in the server's capabilities
* libnetclient/net-client-siobuf.[ch], libnetclient/net-client-smtp.[ch]:
use G_DECLARE_FINAL_TYPE(), and drop storing the private object
data in a separate structure
* libnetclient/net-client-utils.h: suppress Flexelint 9.00 false-positive
* libnetclient/net-client.[hc]: use G_DECLARE_DERIVABLE_TYPE();
use net_client_get_instance_private() to access private data
ChangeLog | 15 +++
libnetclient/net-client-pop.c | 67 +++++------
libnetclient/net-client-pop.h | 25 +---
libnetclient/net-client-siobuf.c | 94 +++++++--------
libnetclient/net-client-siobuf.h | 27 +----
libnetclient/net-client-smtp.c | 55 ++++-----
libnetclient/net-client-smtp.h | 25 +---
libnetclient/net-client-utils.h | 1 +
libnetclient/net-client.c | 243 +++++++++++++++++++++++----------------
libnetclient/net-client.h | 32 ++----
10 files changed, 283 insertions(+), 301 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index d7117c19f..0ade90b46 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2019-06-02 Albrecht Dreß <albrecht dress arcor de>
+
+ libnetclient: use G_DECLARE*
+
+ * libnetclient/net-client-pop.[ch]: use G_DECLARE_FINAL_TYPE(),
+ and drop storing the private object data in a separate structure;
+ • net_client_pop_get_capa(): enable pipelining only if included
+ in the server's capabilities
+ * libnetclient/net-client-siobuf.[ch], libnetclient/net-client-smtp.[ch]:
+ use G_DECLARE_FINAL_TYPE(), and drop storing the private object
+ data in a separate structure
+ * libnetclient/net-client-utils.h: suppress Flexelint 9.00 false-positive
+ * libnetclient/net-client.[hc]: use G_DECLARE_DERIVABLE_TYPE();
+ use net_client_get_instance_private() to access private data
+
2019-05-27 Peter Bloomfield <pbloomfield bellsouth net>
* libbalsa/imap/imap-commands.h: remove redundant declaration of
diff --git a/libnetclient/net-client-pop.c b/libnetclient/net-client-pop.c
index ec96a88a6..2c92e5dfc 100644
--- a/libnetclient/net-client-pop.c
+++ b/libnetclient/net-client-pop.c
@@ -19,7 +19,10 @@
#include "net-client-pop.h"
-struct _NetClientPopPrivate {
+/*lint -esym(754,_NetClientPop::parent) required field, not referenced directly */
+struct _NetClientPop {
+ NetClient parent;
+
NetClientCryptMode crypt_mode;
gchar *apop_banner;
guint auth_allowed[2]; /** 0: encrypted, 1: unencrypted */
@@ -44,7 +47,8 @@ struct _NetClientPopPrivate {
/*lint -restore */
-G_DEFINE_TYPE_WITH_PRIVATE(NetClientPop, net_client_pop, NET_CLIENT_TYPE)
+/*lint -esym(528,net_client_pop_get_instance_private) auto-generated function, not referenced */
+G_DEFINE_TYPE(NetClientPop, net_client_pop, NET_CLIENT_TYPE)
static void net_client_pop_finalise(GObject *object);
@@ -82,8 +86,8 @@ net_client_pop_new(const gchar *host, guint16 port, NetClientCryptMode crypt_mod
g_object_unref(G_OBJECT(client));
client = NULL;
} else {
- client->priv->crypt_mode = crypt_mode;
- client->priv->use_pipelining = use_pipelining;
+ client->crypt_mode = crypt_mode;
+ client->use_pipelining = use_pipelining;
}
}
@@ -97,9 +101,9 @@ net_client_pop_allow_auth(NetClientPop *client, gboolean encrypted, guint allow_
/* paranoia check */
g_return_val_if_fail(NET_IS_CLIENT_POP(client), FALSE);
if (encrypted) {
- client->priv->auth_allowed[0] = allow_auth;
+ client->auth_allowed[0] = allow_auth;
} else {
- client->priv->auth_allowed[1] = allow_auth;
+ client->auth_allowed[1] = allow_auth;
}
return TRUE;
}
@@ -117,7 +121,7 @@ net_client_pop_connect(NetClientPop *client, gchar **greeting, GError **error)
/* establish connection, and immediately switch to TLS if required */
result = net_client_connect(NET_CLIENT(client), error);
- if (result && (client->priv->crypt_mode == NET_CLIENT_CRYPT_ENCRYPTED)) {
+ if (result && (client->crypt_mode == NET_CLIENT_CRYPT_ENCRYPTED)) {
result = net_client_start_tls(NET_CLIENT(client), error);
}
@@ -130,14 +134,15 @@ net_client_pop_connect(NetClientPop *client, gchar **greeting, GError **error)
if (result) {
const gchar *ang_open;
- ang_open = strchr(server_msg, '<'); /*lint !e668 !e9034 server_msg
cannot be NULL; accept char literal as int */
+ /*lint -e{668,9034} server_msg cannot be NULL; accept char literal as int (MISRA
C:2012 Rule 10.3) */
+ ang_open = strchr(server_msg, '<');
if (ang_open != NULL) {
const gchar *ang_close;
- ang_close = strchr(ang_open, '>'); /*lint !e9034 accept char literal as int */
+ ang_close = strchr(ang_open, '>'); /*lint !e9034 accept char literal as int
(MISRA C:2012 Rule 10.3) */
if (ang_close != NULL) {
/*lint -e{737,946,947,9029} allowed exception according to MISRA Rules
18.2 and 18.3 */
- client->priv->apop_banner = g_strndup(ang_open, (ang_close - ang_open) + 1U);
+ client->apop_banner = g_strndup(ang_open, (ang_close - ang_open) + 1U);
auth_supported = NET_CLIENT_POP_AUTH_APOP;
}
}
@@ -149,10 +154,10 @@ net_client_pop_connect(NetClientPop *client, gchar **greeting, GError **error)
/* perform STLS if required- note that some servers support STLS, but do not announce it. So just
try... */
if (result &&
- ((client->priv->crypt_mode == NET_CLIENT_CRYPT_STARTTLS) || (client->priv->crypt_mode ==
NET_CLIENT_CRYPT_STARTTLS_OPT))) {
+ ((client->crypt_mode == NET_CLIENT_CRYPT_STARTTLS) || (client->crypt_mode ==
NET_CLIENT_CRYPT_STARTTLS_OPT))) {
result = net_client_pop_starttls(client, error);
if (!result) {
- if (client->priv->crypt_mode == NET_CLIENT_CRYPT_STARTTLS_OPT) {
+ if (client->crypt_mode == NET_CLIENT_CRYPT_STARTTLS_OPT) {
result = TRUE;
g_clear_error(error);
}
@@ -183,7 +188,7 @@ net_client_pop_connect(NetClientPop *client, gchar **greeting, GError **error)
g_debug("passwordless authentication failed, retry w/ password: emit 'auth'
signal for client %p", client);
g_clear_error(error);
g_free(auth_data);
- g_signal_emit_by_name(client, "auth", TRUE, &auth_data);
+ g_signal_emit_by_name(client, "auth", TRUE, &auth_data); /*lint !e730
passing a gboolean is intended here */
if ((auth_data != NULL) && (auth_data[0] != NULL)) {
result = net_client_pop_auth(client, auth_data[0], auth_data[1],
auth_supported & ~NET_CLIENT_POP_AUTH_NO_PWD, error);
@@ -275,12 +280,12 @@ net_client_pop_list(NetClientPop *client, GList **msg_list, gboolean with_uid, G
}
/* get all uid's if requested */
- if (result && with_uid && client->priv->can_uidl && (*msg_list != NULL)) {
+ if (result && with_uid && client->can_uidl && (*msg_list != NULL)) {
result = net_client_pop_uidl(client, msg_list, error);
}
if (!result) {
- /*lint -e{9074,9087} accept sane pointer conversion */
+ /*lint -e{9074,9087} accept sane pointer conversion (MISRA C:2012 Rules 11.1, 11.3) */
g_list_free_full(*msg_list, (GDestroyNotify) net_client_pop_msg_info_free);
}
@@ -299,7 +304,7 @@ net_client_pop_retr(NetClientPop *client, GList *msg_list, NetClientPopMsgCb cal
g_return_val_if_fail(NET_IS_CLIENT_POP(client) && (msg_list != NULL) && (callback != NULL), FALSE);
/* pipelining: send all RETR commands */
- pipelining = client->priv->can_pipelining && client->priv->use_pipelining;
+ pipelining = client->can_pipelining && client->use_pipelining;
if (pipelining) {
GString *retr_buf;
@@ -341,7 +346,7 @@ net_client_pop_dele(NetClientPop *client, GList *msg_list, GError **error)
g_return_val_if_fail(NET_IS_CLIENT_POP(client) && (msg_list != NULL), FALSE);
/* pipelining: send all DELE commands */
- pipelining = client->priv->can_pipelining && client->priv->use_pipelining;
+ pipelining = client->can_pipelining && client->use_pipelining;
if (pipelining) {
GString *dele_buf;
@@ -394,16 +399,15 @@ net_client_pop_class_init(NetClientPopClass *klass)
static void
net_client_pop_init(NetClientPop *self)
{
- self->priv = net_client_pop_get_instance_private(self); /*lint !e9079 (MISRA C:2012 Rule
11.5) intended use */
- self->priv->auth_allowed[0] = NET_CLIENT_POP_AUTH_ALL;
- self->priv->auth_allowed[1] = NET_CLIENT_POP_AUTH_SAFE;
+ self->auth_allowed[0] = NET_CLIENT_POP_AUTH_ALL;
+ self->auth_allowed[1] = NET_CLIENT_POP_AUTH_SAFE;
}
static void
net_client_pop_finalise(GObject *object)
{
- const NetClientPop *client = NET_CLIENT_POP(object);
+ NetClientPop *client = NET_CLIENT_POP(object);
const GObjectClass *parent_class = G_OBJECT_CLASS(net_client_pop_parent_class);
/* send the 'QUIT' command - no need to evaluate the reply or check for errors */
@@ -411,7 +415,7 @@ net_client_pop_finalise(GObject *object)
(void) net_client_execute(NET_CLIENT(client), NULL, "QUIT", NULL);
}
- g_free(client->priv->apop_banner);
+ g_free(client->apop_banner);
(*parent_class->finalize)(object);
}
@@ -462,7 +466,7 @@ net_client_pop_execute(NetClientPop *client, const gchar *request_fmt, gchar **l
va_list args;
gboolean result;
- va_start(args, error); /*lint !e413 a NULL error argument is irrelevant here */
+ va_start(args, error);
result = net_client_vwrite_line(NET_CLIENT(client), request_fmt, args, error);
va_end(args);
@@ -495,9 +499,9 @@ net_client_pop_auth(NetClientPop *client, const gchar *user, const gchar *passwd
guint auth_mask;
if (net_client_is_encrypted(NET_CLIENT(client))) {
- auth_mask = client->priv->auth_allowed[0] & auth_supported;
+ auth_mask = client->auth_allowed[0] & auth_supported;
} else {
- auth_mask = client->priv->auth_allowed[1] & auth_supported;
+ auth_mask = client->auth_allowed[1] & auth_supported;
}
if (auth_mask == 0U) {
@@ -601,7 +605,7 @@ net_client_pop_auth_apop(NetClientPop *client, const gchar *user, const gchar *p
gchar *auth_buf;
gchar *md5_buf;
- auth_buf = g_strconcat(client->priv->apop_banner, passwd, NULL);
+ auth_buf = g_strconcat(client->apop_banner, passwd, NULL);
md5_buf = g_compute_checksum_for_string(G_CHECKSUM_MD5, auth_buf, -1);
net_client_free_authstr(auth_buf);
result = net_client_pop_execute(client, "APOP %s %s", NULL, error, user, md5_buf);
@@ -683,7 +687,7 @@ net_client_pop_auth_gssapi(NetClientPop *client, const gchar *user, GError **err
#else
-/*lint -e{715} -e{818} */
+/*lint -e{715,818} */
static gboolean
net_client_pop_auth_gssapi(NetClientPop G_GNUC_UNUSED *client, const gchar G_GNUC_UNUSED *user, GError
G_GNUC_UNUSED **error)
{
@@ -701,7 +705,7 @@ net_client_pop_execute_sasl(NetClientPop *client, const gchar *request_fmt, gcha
va_list args;
gboolean result;
- va_start(args, error); /*lint !e413 a NULL error argument is irrelevant here */
+ va_start(args, error);
result = net_client_vwrite_line(NET_CLIENT(client), request_fmt, args, error);
va_end(args);
@@ -734,7 +738,7 @@ net_client_pop_get_capa(NetClientPop *client, guint *auth_supported)
/* clear all capability flags except APOP and send the CAPA command */
*auth_supported = *auth_supported & NET_CLIENT_POP_AUTH_APOP;
- client->priv->can_pipelining = FALSE;
+ client->can_pipelining = FALSE;
result = net_client_pop_execute(client, "CAPA", NULL, NULL);
/* evaluate the response */
@@ -772,9 +776,9 @@ net_client_pop_get_capa(NetClientPop *client, guint *auth_supported)
}
g_strfreev(auth);
} else if (strcmp(reply, "PIPELINING") == 0) {
- client->priv->can_pipelining = TRUE;
+ client->can_pipelining = TRUE;
} else if (strcmp(reply, "UIDL") == 0) {
- client->priv->can_uidl = TRUE;
+ client->can_uidl = TRUE;
} else {
/* ignore this capability (see MISRA C:2012, Rule 15.7) */
}
@@ -788,7 +792,6 @@ net_client_pop_get_capa(NetClientPop *client, guint *auth_supported)
if (*auth_supported == 0U) {
*auth_supported = NET_CLIENT_POP_AUTH_USER_PASS;
}
- client->priv->can_pipelining = TRUE;
}
diff --git a/libnetclient/net-client-pop.h b/libnetclient/net-client-pop.h
index e94743c2b..696599708 100644
--- a/libnetclient/net-client-pop.h
+++ b/libnetclient/net-client-pop.h
@@ -23,18 +23,12 @@ G_BEGIN_DECLS
#define NET_CLIENT_POP_TYPE (net_client_pop_get_type())
-#define NET_CLIENT_POP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),
NET_CLIENT_POP_TYPE, NetClientPop))
-#define NET_IS_CLIENT_POP(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),
NET_CLIENT_POP_TYPE))
-#define NET_CLIENT_POP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),
NET_CLIENT_POP_TYPE, NetClientPopClass))
-#define NET_IS_CLIENT_POP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NET_CLIENT_POP_TYPE))
-#define NET_CLIENT_POP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), NET_CLIENT_POP_TYPE,
NetClientPopClass))
+G_DECLARE_FINAL_TYPE(NetClientPop, net_client_pop, NET, CLIENT_POP, NetClient)
+
#define NET_CLIENT_POP_ERROR_QUARK (g_quark_from_static_string("net-client-pop"))
-typedef struct _NetClientPop NetClientPop;
-typedef struct _NetClientPopClass NetClientPopClass;
-typedef struct _NetClientPopPrivate NetClientPopPrivate;
typedef struct _NetClientPopMessage NetClientPopMessage;
typedef struct _NetClientPopMessageInfo NetClientPopMessageInfo;
@@ -80,17 +74,6 @@ enum _NetClientPopError {
/** @} */
-struct _NetClientPop {
- NetClient parent;
- NetClientPopPrivate *priv;
-};
-
-
-struct _NetClientPopClass {
- NetClientClass parent;
-};
-
-
/** @brief Message information
*
* This structure is returned in a GList by net_client_pop_list() and contains information about on message
in the remote mailbox.
@@ -132,10 +115,6 @@ typedef gboolean (*NetClientPopMsgCb)(const gchar *buffer, gssize count, gsize l
gpointer user_data, GError **error);
-GType net_client_pop_get_type(void)
- G_GNUC_CONST;
-
-
/** @brief Create a new POP network client
*
* @param host host name or IP address to connect
diff --git a/libnetclient/net-client-siobuf.c b/libnetclient/net-client-siobuf.c
index 3b8dc70ac..af2c0c823 100644
--- a/libnetclient/net-client-siobuf.c
+++ b/libnetclient/net-client-siobuf.c
@@ -19,14 +19,18 @@
#include "net-client-siobuf.h"
-struct _NetClientSioBufPrivate {
+/*lint -esym(754,_NetClientSioBuf::parent) required field, not referenced directly */
+struct _NetClientSioBuf {
+ NetClient parent;
+
GString *buffer; /**< hold a line read from the remote server, including the
terminating CRLF */
gchar *read_ptr; /**< point to the next char which shall be read in buffer's
GString::str. */
GString *writebuf; /**< buffer for buffered write functions */
};
-G_DEFINE_TYPE_WITH_PRIVATE(NetClientSioBuf, net_client_siobuf, NET_CLIENT_TYPE)
+/*lint -esym(528,net_client_siobuf_get_instance_private) auto-generated function, not
referenced */
+G_DEFINE_TYPE(NetClientSioBuf, net_client_siobuf, NET_CLIENT_TYPE)
static void net_client_siobuf_finalise(GObject *object);
@@ -46,9 +50,9 @@ net_client_siobuf_new(const gchar *host, guint16 port)
g_object_unref(G_OBJECT(client));
client = NULL;
} else {
- client->priv->buffer = g_string_sized_new(1024U);
- client->priv->read_ptr = NULL;
- client->priv->writebuf = g_string_sized_new(1024U);
+ client->buffer = g_string_sized_new(1024U);
+ client->read_ptr = NULL;
+ client->writebuf = g_string_sized_new(1024U);
}
}
@@ -59,39 +63,37 @@ net_client_siobuf_new(const gchar *host, guint16 port)
gint
net_client_siobuf_read(NetClientSioBuf *client, void *buffer, gsize count, GError **error)
{
- NetClientSioBufPrivate *priv;
gboolean fill_res;
gchar *dest;
gsize left;
g_return_val_if_fail(NET_IS_CLIENT_SIOBUF(client) && (buffer != NULL) && (count > 0U), -1);
- priv = client->priv;
- dest = (gchar *) buffer;
+ dest = (gchar *) buffer; /*lint !e9079 sane pointer conversion (MISRA C:2012 Rule 11.5) */
left = count;
fill_res = net_client_siobuf_fill(client, error);
while (fill_res && (left > 0U)) {
gsize avail;
gsize chunk;
- /*lint -e{737,946,947,9029} allowed exception according to MISRA Rules 18.2 and
18.3 */
- avail = priv->buffer->len - (priv->read_ptr - priv->buffer->str);
+ /*lint -e{737,946,947,9029} allowed exception according to MISRA C:2012 Rules
18.2, 18.3 */
+ avail = client->buffer->len - (client->read_ptr - client->buffer->str);
if (avail > left) {
chunk = left;
} else {
chunk = avail;
}
- memcpy(dest, priv->read_ptr, chunk);
+ memcpy(dest, client->read_ptr, chunk);
dest += chunk;
- priv->read_ptr += chunk;
+ client->read_ptr += chunk;
left -= chunk;
if (left > 0U) {
fill_res = net_client_siobuf_fill(client, error);
}
}
- return (left < count) ? (gint) (count - left) : -1;
+ return (left < count) ? ((gint) count - (gint) left) : -1;
}
@@ -103,7 +105,7 @@ net_client_siobuf_getc(NetClientSioBuf *client, GError **error)
g_return_val_if_fail(NET_IS_CLIENT_SIOBUF(client), -1);
if (net_client_siobuf_fill(client, error)) {
- retval = *client->priv->read_ptr++;
+ retval = (gint) *client->read_ptr++;
} else {
retval = -1;
}
@@ -114,15 +116,13 @@ net_client_siobuf_getc(NetClientSioBuf *client, GError **error)
gint
net_client_siobuf_ungetc(NetClientSioBuf *client)
{
- NetClientSioBufPrivate *priv;
gint retval;
g_return_val_if_fail(NET_IS_CLIENT_SIOBUF(client), -1);
- priv = client->priv;
- /*lint -e{946} allowed exception according to MISRA Rules 18.2 and 18.3 */
- if ((priv->buffer->len != 0U) && (priv->read_ptr > priv->buffer->str)) {
- priv->read_ptr--;
+ /*lint -e{946} allowed exception according to MISRA C:2012 Rules 18.2 and 18.3 */
+ if ((client->buffer->len != 0U) && (client->read_ptr > client->buffer->str)) {
+ client->read_ptr--;
retval = 0;
} else {
retval = -1;
@@ -134,25 +134,23 @@ net_client_siobuf_ungetc(NetClientSioBuf *client)
gchar *
net_client_siobuf_gets(NetClientSioBuf *client, gchar *buffer, gsize buflen, GError **error)
{
- NetClientSioBufPrivate *priv;
gchar *result;
g_return_val_if_fail(NET_IS_CLIENT_SIOBUF(client) && (buffer != NULL) && (buflen > 0U), NULL);
- priv = client->priv;
if (net_client_siobuf_fill(client, error)) {
gsize avail;
gsize chunk;
- /*lint -e{737,946,947,9029} allowed exception according to MISRA Rules 18.2 and
18.3 */
- avail = priv->buffer->len - (priv->read_ptr - priv->buffer->str);
+ /*lint -e{737,946,947,9029} allowed exception according to MISRA C:2012 Rules
18.2 and 18.3 */
+ avail = client->buffer->len - (client->read_ptr - client->buffer->str);
if (avail > (buflen - 1U)) {
chunk = buflen - 1U;
} else {
chunk = avail;
}
- memcpy(buffer, priv->read_ptr, chunk);
- priv->read_ptr += chunk;
+ memcpy(buffer, client->read_ptr, chunk);
+ client->read_ptr += chunk;
buffer[chunk] = '\0';
result = buffer;
} else {
@@ -166,23 +164,21 @@ net_client_siobuf_gets(NetClientSioBuf *client, gchar *buffer, gsize buflen, GEr
gchar *
net_client_siobuf_get_line(NetClientSioBuf *client, GError **error)
{
- const NetClientSioBufPrivate *priv;
gchar *result;
g_return_val_if_fail(NET_IS_CLIENT_SIOBUF(client), NULL);
- priv = client->priv;
if (net_client_siobuf_fill(client, error)) {
gsize avail;
- /*lint -e{737,946,947,9029} allowed exception according to MISRA Rules 18.2 and
18.3 */
- avail = priv->buffer->len - (priv->read_ptr - priv->buffer->str);
+ /*lint -e{737,946,947,9029} allowed exception according to MISRA C:2012 Rules
18.2 and 18.3 */
+ avail = client->buffer->len - (client->read_ptr - client->buffer->str);
if (avail > 2U) {
- result = g_strndup(priv->read_ptr, avail - 2U);
+ result = g_strndup(client->read_ptr, avail - 2U);
} else {
result = g_strdup("");
}
- priv->buffer->len = 0U;
+ client->buffer->len = 0U;
} else {
result = NULL;
}
@@ -199,8 +195,8 @@ net_client_siobuf_discard_line(NetClientSioBuf *client, GError **error)
g_return_val_if_fail(NET_IS_CLIENT_SIOBUF(client), -1);
if (net_client_siobuf_fill(client, error)) {
- client->priv->buffer->len = 0U;
- result = '\n';
+ client->buffer->len = 0U;
+ result = (gint) '\n';
} else {
result = -1;
}
@@ -214,7 +210,8 @@ net_client_siobuf_write(NetClientSioBuf *client, const void *buffer, gsize count
{
g_return_if_fail(NET_IS_CLIENT_SIOBUF(client) && (buffer != NULL) && (count > 0U));
- (void) g_string_append_len(client->priv->writebuf, (const gchar *) buffer, (gssize) count);
+ /*lint -e{9079} sane pointer conversion (MISRA C:2012 Rule 11.5) */
+ (void) g_string_append_len(client->writebuf, (const gchar *) buffer, (gssize) count);
}
@@ -226,7 +223,7 @@ net_client_siobuf_printf(NetClientSioBuf *client, const gchar *format, ...)
g_return_if_fail(NET_IS_CLIENT_SIOBUF(client) && (format != NULL));
va_start(args, format);
- g_string_append_vprintf(client->priv->writebuf, format, args);
+ g_string_append_vprintf(client->writebuf, format, args);
va_end(args);
}
@@ -234,16 +231,14 @@ net_client_siobuf_printf(NetClientSioBuf *client, const gchar *format, ...)
gboolean
net_client_siobuf_flush(NetClientSioBuf *client, GError **error)
{
- const NetClientSioBufPrivate *priv;
gboolean result;
g_return_val_if_fail(NET_IS_CLIENT_SIOBUF(client), FALSE);
- priv = client->priv;
- if (priv->writebuf->len > 0U) {
- (void) g_string_append(priv->writebuf, "\r\n");
- result = net_client_write_buffer(NET_CLIENT(client), priv->writebuf->str,
priv->writebuf->len, error);
- (void) g_string_truncate(priv->writebuf, 0U);
+ if (client->writebuf->len > 0U) {
+ (void) g_string_append(client->writebuf, "\r\n");
+ result = net_client_write_buffer(NET_CLIENT(client), client->writebuf->str,
client->writebuf->len, error);
+ (void) g_string_truncate(client->writebuf, 0U);
} else {
result = FALSE;
}
@@ -263,27 +258,26 @@ net_client_siobuf_class_init(NetClientSioBufClass *klass)
}
+/*lint -e{715,818} */
static void
-net_client_siobuf_init(NetClientSioBuf *self)
+net_client_siobuf_init(G_GNUC_UNUSED NetClientSioBuf *self)
{
- self->priv = net_client_siobuf_get_instance_private(self);
}
static gboolean
net_client_siobuf_fill(NetClientSioBuf *client, GError **error)
{
- NetClientSioBufPrivate *priv = client->priv;
gboolean result;
- if ((priv->buffer->len == 0U) || (priv->read_ptr == NULL) || (*priv->read_ptr == '\0')) {
+ if ((client->buffer->len == 0U) || (client->read_ptr == NULL) || (*client->read_ptr == '\0')) {
gchar *read_buf;
result = net_client_read_line(NET_CLIENT(client), &read_buf, error);
if (result) {
- (void) g_string_assign(priv->buffer, read_buf);
- (void) g_string_append(priv->buffer, "\r\n");
- priv->read_ptr = priv->buffer->str;
+ (void) g_string_assign(client->buffer, read_buf);
+ (void) g_string_append(client->buffer, "\r\n");
+ client->read_ptr = client->buffer->str;
g_free(read_buf);
}
} else {
@@ -300,7 +294,7 @@ net_client_siobuf_finalise(GObject *object)
const NetClientSioBuf *client = NET_CLIENT_SIOBUF(object);
const GObjectClass *parent_class = G_OBJECT_CLASS(net_client_siobuf_parent_class);
- (void) g_string_free(client->priv->buffer, TRUE);
- (void) g_string_free(client->priv->writebuf, TRUE);
+ (void) g_string_free(client->buffer, TRUE);
+ (void) g_string_free(client->writebuf, TRUE);
(*parent_class->finalize)(object);
}
diff --git a/libnetclient/net-client-siobuf.h b/libnetclient/net-client-siobuf.h
index 91af01a3a..a0ac43862 100644
--- a/libnetclient/net-client-siobuf.h
+++ b/libnetclient/net-client-siobuf.h
@@ -23,33 +23,10 @@ G_BEGIN_DECLS
#define NET_CLIENT_SIOBUF_TYPE (net_client_siobuf_get_type())
-#define NET_CLIENT_SIOBUF(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),
NET_CLIENT_SIOBUF_TYPE, NetClientSioBuf))
-#define NET_IS_CLIENT_SIOBUF(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),
NET_CLIENT_SIOBUF_TYPE))
-#define NET_CLIENT_SIOBUF_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), NET_CLIENT_SIOBUF_TYPE,
NetClientSioBufClass))
-#define NET_IS_CLIENT_SIOBUF_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NET_CLIENT_SIOBUF_TYPE))
-#define NET_CLIENT_SIOBUF_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), NET_CLIENT_SIOBUF_TYPE,
NetClientSioBufClass))
+G_DECLARE_FINAL_TYPE(NetClientSioBuf, net_client_siobuf, NET, CLIENT_SIOBUF, NetClient)
-#define NET_CLIENT_SIOBUF_ERROR_QUARK (g_quark_from_static_string("net-client-siobuf"))
-
-
-typedef struct _NetClientSioBuf NetClientSioBuf;
-typedef struct _NetClientSioBufClass NetClientSioBufClass;
-typedef struct _NetClientSioBufPrivate NetClientSioBufPrivate;
-
-
-struct _NetClientSioBuf {
- NetClient parent;
- NetClientSioBufPrivate *priv;
-};
-
-struct _NetClientSioBufClass {
- NetClientClass parent;
-};
-
-
-GType net_client_siobuf_get_type(void)
- G_GNUC_CONST;
+#define NET_CLIENT_SIOBUF_ERROR_QUARK (g_quark_from_static_string("net-client-siobuf"))
/** @brief Create a new SIOBUF network client
diff --git a/libnetclient/net-client-smtp.c b/libnetclient/net-client-smtp.c
index 63c59fa3c..f532222e3 100644
--- a/libnetclient/net-client-smtp.c
+++ b/libnetclient/net-client-smtp.c
@@ -18,7 +18,10 @@
#include "net-client-smtp.h"
-struct _NetClientSmtpPrivate {
+/*lint -esym(754,_NetClientSmtp::parent) required field, not referenced directly */
+struct _NetClientSmtp {
+ NetClient parent;
+
NetClientCryptMode crypt_mode;
guint auth_allowed[2]; /** 0: encrypted, 1: unencrypted */
gboolean can_dsn;
@@ -49,7 +52,8 @@ typedef struct {
#define SMTP_DATA_BUF_SIZE 8192U
-G_DEFINE_TYPE_WITH_PRIVATE(NetClientSmtp, net_client_smtp, NET_CLIENT_TYPE)
+/*lint -esym(528,net_client_smtp_get_instance_private) auto-generated function, not referenced */
+G_DEFINE_TYPE(NetClientSmtp, net_client_smtp, NET_CLIENT_TYPE)
static void net_client_smtp_finalise(GObject *object);
@@ -84,7 +88,7 @@ net_client_smtp_new(const gchar *host, guint16 port, NetClientCryptMode crypt_mo
g_object_unref(G_OBJECT(client));
client = NULL;
} else {
- client->priv->crypt_mode = crypt_mode;
+ client->crypt_mode = crypt_mode;
}
}
@@ -98,9 +102,9 @@ net_client_smtp_allow_auth(NetClientSmtp *client, gboolean encrypted, guint allo
/* paranoia check */
g_return_val_if_fail(NET_IS_CLIENT_SMTP(client), FALSE);
if (encrypted) {
- client->priv->auth_allowed[0] = allow_auth;
+ client->auth_allowed[0] = allow_auth;
} else {
- client->priv->auth_allowed[1] = allow_auth;
+ client->auth_allowed[1] = allow_auth;
}
return TRUE;
}
@@ -118,7 +122,7 @@ net_client_smtp_connect(NetClientSmtp *client, gchar **greeting, GError **error)
/* establish connection, and immediately switch to TLS if required */
result = net_client_connect(NET_CLIENT(client), error);
- if (result && (client->priv->crypt_mode == NET_CLIENT_CRYPT_ENCRYPTED)) {
+ if (result && (client->crypt_mode == NET_CLIENT_CRYPT_ENCRYPTED)) {
result = net_client_start_tls(NET_CLIENT(client), error);
}
@@ -135,9 +139,9 @@ net_client_smtp_connect(NetClientSmtp *client, gchar **greeting, GError **error)
/* perform STARTTLS if required, and send EHLO again */
if (result &&
- ((client->priv->crypt_mode == NET_CLIENT_CRYPT_STARTTLS) || (client->priv->crypt_mode ==
NET_CLIENT_CRYPT_STARTTLS_OPT))) {
+ ((client->crypt_mode == NET_CLIENT_CRYPT_STARTTLS) || (client->crypt_mode ==
NET_CLIENT_CRYPT_STARTTLS_OPT))) {
if (!can_starttls) {
- if (client->priv->crypt_mode == NET_CLIENT_CRYPT_STARTTLS) {
+ if (client->crypt_mode == NET_CLIENT_CRYPT_STARTTLS) {
g_set_error(error, NET_CLIENT_SMTP_ERROR_QUARK, (gint)
NET_CLIENT_ERROR_SMTP_NO_STARTTLS,
_("remote server does not support STARTTLS"));
result = FALSE;
@@ -169,7 +173,7 @@ net_client_smtp_connect(NetClientSmtp *client, gchar **greeting, GError **error)
g_debug("passwordless authentication failed, retry w/ password: emit 'auth'
signal for client %p", client);
g_clear_error(error);
g_free(auth_data);
- g_signal_emit_by_name(client, "auth", TRUE, &auth_data);
+ g_signal_emit_by_name(client, "auth", TRUE, &auth_data); /*lint !e730
passing a gboolean is intended here */
if ((auth_data != NULL) && (auth_data[0] != NULL)) {
result = net_client_smtp_auth(client, auth_data[0], auth_data[1],
auth_supported & ~NET_CLIENT_SMTP_AUTH_NO_PWD, error);
@@ -188,7 +192,7 @@ net_client_smtp_connect(NetClientSmtp *client, gchar **greeting, GError **error)
gboolean
net_client_smtp_can_dsn(NetClientSmtp *client)
{
- return NET_IS_CLIENT_SMTP(client) ? client->priv->can_dsn : FALSE;
+ return NET_IS_CLIENT_SMTP(client) ? client->can_dsn : FALSE;
}
@@ -206,7 +210,7 @@ net_client_smtp_send_msg(NetClientSmtp *client, const NetClientSmtpMessage *mess
/* set the RFC 5321 sender and recipient(s) */
netclient = NET_CLIENT(client); /* convenience pointer */
(void) net_client_set_timeout(netclient, 5U * 60U); /* RFC 5321, Sect. 4.5.3.2.2., 4.5.3.2.3.: 5
minutes timeout */
- if (client->priv->can_dsn && message->have_dsn_rcpt) {
+ if (client->can_dsn && message->have_dsn_rcpt) {
if (message->dsn_envid != NULL) {
result = net_client_smtp_execute(client, "MAIL FROM:<%s> RET=%s ENVID=%s", NULL,
error, message->sender,
(message->dsn_ret_full) ? "FULL" : "HDRS", message->dsn_envid);
@@ -242,7 +246,7 @@ net_client_smtp_send_msg(NetClientSmtp *client, const NetClientSmtpMessage *mess
gchar last_char = '\0';
(void) net_client_set_timeout(netclient, 3U * 60U); /* RFC 5321, Sect. 4.5.3.2.5.: 3
minutes timeout */
- client->priv->data_state = TRUE;
+ client->data_state = TRUE;
do {
count = message->data_callback(buffer, SMTP_DATA_BUF_SIZE, message->user_data, error);
if (count < 0) {
@@ -264,7 +268,7 @@ net_client_smtp_send_msg(NetClientSmtp *client, const NetClientSmtpMessage *mess
if (result) {
(void) net_client_set_timeout(netclient, 10U * 60U); /* RFC 5321, Sect 4.5.3.2.6.: 10
minutes timeout */
result = net_client_smtp_read_reply(client, -1, NULL, error);
- client->priv->data_state = FALSE;
+ client->data_state = FALSE;
}
return result;
@@ -335,7 +339,7 @@ net_client_smtp_msg_free(NetClientSmtpMessage *smtp_msg)
if (smtp_msg != NULL) {
g_free(smtp_msg->sender);
g_free(smtp_msg->dsn_envid);
- /*lint -e{9074} -e{9087} accept safe (and required) pointer conversion */
+ /*lint -e{9074} -e{9087} accept safe (and required) pointer conversion (MISRA C:2012
Rules 11.1, 11.3) */
g_list_free_full(smtp_msg->recipients, (GDestroyNotify) smtp_rcpt_free);
g_free(smtp_msg);
}
@@ -356,21 +360,20 @@ net_client_smtp_class_init(NetClientSmtpClass *klass)
static void
net_client_smtp_init(NetClientSmtp *self)
{
- self->priv = net_client_smtp_get_instance_private(self); /*lint !e9079 (MISRA C:2012 Rule
11.5) intended use */
- self->priv->auth_allowed[0] = NET_CLIENT_SMTP_AUTH_ALL;
- self->priv->auth_allowed[1] = NET_CLIENT_SMTP_AUTH_SAFE;
+ self->auth_allowed[0] = NET_CLIENT_SMTP_AUTH_ALL;
+ self->auth_allowed[1] = NET_CLIENT_SMTP_AUTH_SAFE;
}
static void
net_client_smtp_finalise(GObject *object)
{
- const NetClientSmtp *client = NET_CLIENT_SMTP(object);
+ NetClientSmtp *client = NET_CLIENT_SMTP(object);
const GObjectClass *parent_class = G_OBJECT_CLASS(net_client_smtp_parent_class);
/* send the 'QUIT' command unless we are in 'DATA' state where the server will probably fail to reply
- no need to evaluate the
* reply or check for errors */
- if (net_client_is_connected(NET_CLIENT(client)) && !client->priv->data_state) {
+ if (net_client_is_connected(NET_CLIENT(client)) && !client->data_state) {
(void) net_client_execute(NET_CLIENT(client), NULL, "QUIT", NULL);
}
@@ -400,9 +403,9 @@ net_client_smtp_auth(NetClientSmtp *client, const gchar *user, const gchar *pass
/* calculate the possible authentication methods */
if (net_client_is_encrypted(NET_CLIENT(client))) {
- auth_mask = client->priv->auth_allowed[0] & auth_supported;
+ auth_mask = client->auth_allowed[0] & auth_supported;
} else {
- auth_mask = client->priv->auth_allowed[1] & auth_supported;
+ auth_mask = client->auth_allowed[1] & auth_supported;
}
if (auth_mask == 0U) {
@@ -538,7 +541,7 @@ net_client_smtp_auth_gssapi(NetClientSmtp *client, const gchar *user, GError **e
#else
-/*lint -e{715} -e{818} */
+/*lint -e{715,818} */
static gboolean
net_client_smtp_auth_gssapi(NetClientSmtp G_GNUC_UNUSED *client, const gchar G_GNUC_UNUSED *user, GError
G_GNUC_UNUSED **error)
{
@@ -556,7 +559,7 @@ net_client_smtp_execute(NetClientSmtp *client, const gchar *request_fmt, gchar *
va_list args;
gboolean result;
- va_start(args, error); /*lint !e413 a NULL error argument is irrelevant here */
+ va_start(args, error);
result = net_client_vwrite_line(NET_CLIENT(client), request_fmt, args, error);
va_end(args);
@@ -578,7 +581,7 @@ net_client_smtp_ehlo(NetClientSmtp *client, guint *auth_supported, gboolean *can
/* clear all capability flags */
*auth_supported = 0U;
- client->priv->can_dsn = FALSE;
+ client->can_dsn = FALSE;
*can_starttls = FALSE;
/* evaluate the response */
@@ -598,7 +601,7 @@ net_client_smtp_ehlo(NetClientSmtp *client, guint *auth_supported, gboolean *can
result = FALSE;
} else {
if (strcmp(&endptr[1], "DSN") == 0) {
- client->priv->can_dsn = TRUE;
+ client->can_dsn = TRUE;
} else if (strcmp(&endptr[1], "STARTTLS") == 0) {
*can_starttls = TRUE;
} else if ((strncmp(&endptr[1], "AUTH ", 5U) == 0) || (strncmp(&endptr[1],
"AUTH=", 5U) == 0)) {
@@ -727,7 +730,7 @@ net_client_smtp_dsn_to_string(const NetClientSmtp *client, NetClientSmtpDsnMode
gchar *result;
/* create the RFC 3461 DSN string */
- if (client->priv->can_dsn && (dsn_mode != NET_CLIENT_SMTP_DSN_NEVER)) {
+ if (client->can_dsn && (dsn_mode != NET_CLIENT_SMTP_DSN_NEVER)) {
GString *dsn_buf;
gsize start_len;
diff --git a/libnetclient/net-client-smtp.h b/libnetclient/net-client-smtp.h
index 194fc68c4..65b62c3b4 100644
--- a/libnetclient/net-client-smtp.h
+++ b/libnetclient/net-client-smtp.h
@@ -23,18 +23,12 @@ G_BEGIN_DECLS
#define NET_CLIENT_SMTP_TYPE (net_client_smtp_get_type())
-#define NET_CLIENT_SMTP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),
NET_CLIENT_SMTP_TYPE, NetClientSmtp))
-#define NET_IS_CLIENT_SMTP(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),
NET_CLIENT_SMTP_TYPE))
-#define NET_CLIENT_SMTP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), NET_CLIENT_SMTP_TYPE,
NetClientSmtpClass))
-#define NET_IS_CLIENT_SMTP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),
NET_CLIENT_SMTP_TYPE))
-#define NET_CLIENT_SMTP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), NET_CLIENT_SMTP_TYPE,
NetClientSmtpClass))
+G_DECLARE_FINAL_TYPE(NetClientSmtp, net_client_smtp, NET, CLIENT_SMTP, NetClient)
+
#define NET_CLIENT_SMTP_ERROR_QUARK (g_quark_from_static_string("net-client-smtp"))
-typedef struct _NetClientSmtp NetClientSmtp;
-typedef struct _NetClientSmtpClass NetClientSmtpClass;
-typedef struct _NetClientSmtpPrivate NetClientSmtpPrivate;
typedef struct _NetClientSmtpMessage NetClientSmtpMessage;
typedef enum _NetClientSmtpDsnMode NetClientSmtpDsnMode;
@@ -75,17 +69,6 @@ enum _NetClientSmtpError {
/** @} */
-struct _NetClientSmtp {
- NetClient parent;
- NetClientSmtpPrivate *priv;
-};
-
-
-struct _NetClientSmtpClass {
- NetClientClass parent;
-};
-
-
/** @brief Delivery Status Notification mode
*
* See <a href="https://tools.ietf.org/html/rfc3461">RFC 3461</a> for a description of Delivery Status
Notifications (DSNs). The
@@ -116,10 +99,6 @@ enum _NetClientSmtpDsnMode {
typedef gssize (*NetClientSmtpSendCb)(gchar *buffer, gsize count, gpointer user_data, GError **error);
-GType net_client_smtp_get_type(void)
- G_GNUC_CONST;
-
-
/** @brief Create a new SMTP network client
*
* @param host host name or IP address to connect
diff --git a/libnetclient/net-client-utils.h b/libnetclient/net-client-utils.h
index ab90dfea6..033f88684 100644
--- a/libnetclient/net-client-utils.h
+++ b/libnetclient/net-client-utils.h
@@ -127,6 +127,7 @@ gint net_client_gss_auth_step(NetClientGssCtx *gss_ctx, const gchar *in_token, g
*
* Create the final token which has to be sent to the remote server to finalise the GSSAPI authentication
process.
*/
+/*lint -ecall(9076,net_client_gss_auth_finish) suppress false-positive re. [const] NetClientGssCtx*
(FlexeLint 9.00L bug) */
gchar *net_client_gss_auth_finish(const NetClientGssCtx *gss_ctx, const gchar *in_token, GError **error)
G_GNUC_WARN_UNUSED_RESULT;
diff --git a/libnetclient/net-client.c b/libnetclient/net-client.c
index f9e023351..f3f1b3d12 100644
--- a/libnetclient/net-client.c
+++ b/libnetclient/net-client.c
@@ -35,6 +35,8 @@
* GIOStream *tls_conn -- optional
* GOutputStream *ostream -- optionally compressed
*/
+typedef struct _NetClientPrivate NetClientPrivate;
+
struct _NetClientPrivate {
gchar *host_and_port;
guint16 default_port;
@@ -67,18 +69,21 @@ NetClient *
net_client_new(const gchar *host_and_port, guint16 default_port, gsize max_line_len)
{
NetClient *client;
+ NetClientPrivate *priv;
g_return_val_if_fail(host_and_port != NULL, NULL);
client = NET_CLIENT(g_object_new(NET_CLIENT_TYPE, NULL));
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ priv = net_client_get_instance_private(client);
- if (client->priv->sock == NULL) {
+ if (priv->sock == NULL) {
g_object_unref(G_OBJECT(client));
client = NULL;
} else {
- client->priv->host_and_port = g_strdup(host_and_port);
- client->priv->default_port = default_port;
- client->priv->max_line_len = max_line_len;
+ priv->host_and_port = g_strdup(host_and_port);
+ priv->default_port = default_port;
+ priv->max_line_len = max_line_len;
}
return client;
@@ -88,12 +93,12 @@ net_client_new(const gchar *host_and_port, guint16 default_port, gsize max_line_
gboolean
net_client_configure(NetClient *client, const gchar *host_and_port, guint16 default_port, gsize
max_line_len, GError **error)
{
- NetClientPrivate *priv;
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ NetClientPrivate *priv = net_client_get_instance_private(client);
gboolean result;
g_return_val_if_fail(NET_IS_CLIENT(client) && (host_and_port != NULL), FALSE);
- priv = client->priv;
if (priv->plain_conn != NULL) {
g_set_error(error, NET_CLIENT_ERROR_QUARK, (gint) NET_CLIENT_ERROR_CONNECTED, _("network
client is already connected"));
result = FALSE;
@@ -109,13 +114,16 @@ net_client_configure(NetClient *client, const gchar *host_and_port, guint16 defa
const gchar *
-net_client_get_host(const NetClient *client)
+net_client_get_host(NetClient *client)
{
const gchar *result;
- /*lint -e{9005} cast'ing away const in the next statement is fine */
if (NET_IS_CLIENT(client)) {
- result = client->priv->host_and_port;
+ const NetClientPrivate *priv;
+
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ priv = net_client_get_instance_private(client);
+ result = priv->host_and_port;
} else {
result = NULL;
}
@@ -127,11 +135,11 @@ gboolean
net_client_connect(NetClient *client, GError **error)
{
gboolean result = FALSE;
- NetClientPrivate *priv;
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ NetClientPrivate *priv = net_client_get_instance_private(client);
g_return_val_if_fail(NET_IS_CLIENT(client), FALSE);
- priv = client->priv;
if (priv->plain_conn != NULL) {
g_set_error(error, NET_CLIENT_ERROR_QUARK, (gint) NET_CLIENT_ERROR_CONNECTED, _("network
client is already connected"));
} else {
@@ -150,41 +158,46 @@ net_client_connect(NetClient *client, GError **error)
void
-net_client_shutdown(const NetClient *client)
+net_client_shutdown(NetClient *client)
{
if (NET_IS_CLIENT(client)) {
+ NetClientPrivate *priv;
+
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ priv = net_client_get_instance_private(client);
+
/* Note: we must unref the GDataInputStream, but the GOutputStream only if compression is
active! */
- if (client->priv->comp != NULL) {
+ if (priv->comp != NULL) {
/* Note: for some strange reason, GIO decides to send a 0x03 0x00 sequence when
closing a compressed connection, before
* sending the usual FIN, ACK TCP reply packet. As the remote server does not expect
the former (the connection has
* already been closed on its side), it replies with with a RST TCP packet.
Unref'ing client->priv->ostream and
* client->priv->comp /after/ all other components of the connection fixes the issue
for unencrypted connections, but
* throws a critical error for TLS. Observed with gio 2.48.2 and 2.50.3, no idea how
it can be fixed.
* See also https://bugzilla.gnome.org/show_bug.cgi?id=795985. */
- if (client->priv->ostream != NULL) {
- g_object_unref(G_OBJECT(client->priv->ostream));
+ if (priv->ostream != NULL) {
+ g_object_unref(G_OBJECT(priv->ostream));
}
- g_object_unref(G_OBJECT(client->priv->comp));
+ g_object_unref(G_OBJECT(priv->comp));
}
- if (client->priv->decomp != NULL) {
- g_object_unref(G_OBJECT(client->priv->decomp));
- client->priv->decomp = NULL;
+ if (priv->decomp != NULL) {
+ g_object_unref(G_OBJECT(priv->decomp));
+ priv->decomp = NULL;
}
- if (client->priv->comp_istream!= NULL) {
- g_object_unref(G_OBJECT(client->priv->comp_istream));
- client->priv->comp_istream = NULL;
+ if (priv->comp_istream!= NULL) {
+ g_object_unref(G_OBJECT(priv->comp_istream));
+ priv->comp_istream = NULL;
}
- if (client->priv->istream != NULL) {
- g_object_unref(G_OBJECT(client->priv->istream));
- client->priv->istream = NULL;
+ if (priv->istream != NULL) {
+ g_object_unref(G_OBJECT(priv->istream));
+ priv->istream = NULL;
}
- if (client->priv->tls_conn != NULL) {
- g_object_unref(G_OBJECT(client->priv->tls_conn));
- client->priv->tls_conn = NULL;
+ if (priv->tls_conn != NULL) {
+ g_object_unref(G_OBJECT(priv->tls_conn));
+ priv->tls_conn = NULL;
}
- if (client->priv->plain_conn != NULL) {
- g_object_unref(G_OBJECT(client->priv->plain_conn));
- client->priv->plain_conn = NULL;
+ if (priv->plain_conn != NULL) {
+ g_object_unref(G_OBJECT(priv->plain_conn));
+ priv->plain_conn = NULL;
}
}
}
@@ -195,8 +208,12 @@ net_client_is_connected(NetClient *client)
{
gboolean result;
- if (NET_IS_CLIENT(client) && (client->priv->plain_conn != NULL)) {
- result = TRUE;
+ if (NET_IS_CLIENT(client)) {
+ const NetClientPrivate *priv;
+
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ priv = net_client_get_instance_private(client);
+ result = (priv->plain_conn != NULL);
} else {
result = FALSE;
}
@@ -210,8 +227,12 @@ net_client_is_encrypted(NetClient *client)
{
gboolean result;
- if (net_client_is_connected(client) && (client->priv->tls_conn != NULL)) {
- result = TRUE;
+ if (net_client_is_connected(client)) {
+ const NetClientPrivate *priv;
+
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ priv = net_client_get_instance_private(client);
+ result = (priv->tls_conn != NULL);
} else {
result = FALSE;
}
@@ -223,24 +244,26 @@ net_client_is_encrypted(NetClient *client)
gboolean
net_client_read_line(NetClient *client, gchar **recv_line, GError **error)
{
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ const NetClientPrivate *priv = net_client_get_instance_private(client);
gboolean result = FALSE;
g_return_val_if_fail(NET_IS_CLIENT(client), FALSE);
- if (client->priv->istream == NULL) {
+ if (priv->istream == NULL) {
g_set_error(error, NET_CLIENT_ERROR_QUARK, (gint) NET_CLIENT_ERROR_NOT_CONNECTED, _("network
client is not connected"));
} else {
gchar *line_buf;
gsize length;
GError *read_err = NULL;
- line_buf = g_data_input_stream_read_line(client->priv->istream, &length, NULL, &read_err);
+ line_buf = g_data_input_stream_read_line(priv->istream, &length, NULL, &read_err);
if (line_buf != NULL) {
/* check that the protocol-specific maximum line length is not exceeded */
- if ((client->priv->max_line_len > 0U) && (length > client->priv->max_line_len)) {
+ if ((priv->max_line_len > 0U) && (length > priv->max_line_len)) {
g_set_error(error, NET_CLIENT_ERROR_QUARK, (gint)
NET_CLIENT_ERROR_LINE_TOO_LONG,
_("reply length %lu exceeds the maximum allowed length %lu"),
- (unsigned long) length, (unsigned long) client->priv->max_line_len);
+ (unsigned long) length, (unsigned long) priv->max_line_len);
g_free(line_buf);
} else {
g_debug("R '%s'", line_buf);
@@ -267,11 +290,13 @@ net_client_read_line(NetClient *client, gchar **recv_line, GError **error)
gboolean
net_client_write_buffer(NetClient *client, const gchar *buffer, gsize count, GError **error)
{
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ const NetClientPrivate *priv = net_client_get_instance_private(client);
gboolean result;
g_return_val_if_fail(NET_IS_CLIENT(client) && (buffer != NULL) && (count > 0UL), FALSE);
- if (client->priv->ostream == NULL) {
+ if (priv->ostream == NULL) {
g_set_error(error, NET_CLIENT_ERROR_QUARK, (gint) NET_CLIENT_ERROR_NOT_CONNECTED, _("network
client is not connected"));
result = FALSE;
} else {
@@ -282,9 +307,9 @@ net_client_write_buffer(NetClient *client, const gchar *buffer, gsize count, GEr
} else {
g_debug("W '%.*s'", (int) count, buffer);
}
- result = g_output_stream_write_all(client->priv->ostream, buffer, count, &bytes_written,
NULL, error);
+ result = g_output_stream_write_all(priv->ostream, buffer, count, &bytes_written, NULL, error);
if (result) {
- result = g_output_stream_flush(client->priv->ostream, NULL, error);
+ result = g_output_stream_flush(priv->ostream, NULL, error);
}
}
@@ -295,6 +320,8 @@ net_client_write_buffer(NetClient *client, const gchar *buffer, gsize count, GEr
gboolean
net_client_vwrite_line(NetClient *client, const gchar *format, va_list args, GError **error)
{
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ const NetClientPrivate *priv = net_client_get_instance_private(client);
gboolean result;
GString *buffer;
@@ -302,7 +329,7 @@ net_client_vwrite_line(NetClient *client, const gchar *format, va_list args, GEr
buffer = g_string_new(NULL);
g_string_vprintf(buffer, format, args);
- if ((client->priv->max_line_len > 0U) && (buffer->len > client->priv->max_line_len)) {
+ if ((priv->max_line_len > 0U) && (buffer->len > priv->max_line_len)) {
g_set_error(error, NET_CLIENT_ERROR_QUARK, (gint) NET_CLIENT_ERROR_LINE_TOO_LONG, _("line too
long"));
result = FALSE;
} else {
@@ -357,6 +384,8 @@ net_client_execute(NetClient *client, gchar **response, const gchar *request_fmt
gboolean
net_client_set_cert_from_pem(NetClient *client, const gchar *pem_data, GError **error)
{
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ NetClientPrivate *priv = net_client_get_instance_private(client);
gboolean result = FALSE;
gnutls_x509_crt_t cert;
int res;
@@ -364,9 +393,9 @@ net_client_set_cert_from_pem(NetClient *client, const gchar *pem_data, GError **
g_return_val_if_fail(NET_IS_CLIENT(client) && (pem_data != NULL), FALSE);
/* always free any existing certificate */
- if (client->priv->certificate != NULL) {
- g_object_unref(G_OBJECT(client->priv->certificate));
- client->priv->certificate = NULL;
+ if (priv->certificate != NULL) {
+ g_object_unref(G_OBJECT(priv->certificate));
+ priv->certificate = NULL;
}
/* load the certificate */
@@ -440,8 +469,8 @@ net_client_set_cert_from_pem(NetClient *client, const gchar *pem_data, GError **
}
if (res == GNUTLS_E_SUCCESS) {
- client->priv->certificate =
g_tls_certificate_new_from_pem(pem_buf, -1, error);
- if (client->priv->certificate != NULL) {
+ priv->certificate = g_tls_certificate_new_from_pem(pem_buf,
-1, error);
+ if (priv->certificate != NULL) {
result = TRUE;
}
}
@@ -485,32 +514,34 @@ net_client_set_cert_from_file(NetClient *client, const gchar *pem_path, GError *
gboolean
net_client_start_tls(NetClient *client, GError **error)
{
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ NetClientPrivate *priv = net_client_get_instance_private(client);
gboolean result = FALSE;
g_return_val_if_fail(NET_IS_CLIENT(client), FALSE);
- if (client->priv->plain_conn == NULL) {
+ if (priv->plain_conn == NULL) {
g_set_error(error, NET_CLIENT_ERROR_QUARK, (gint) NET_CLIENT_ERROR_NOT_CONNECTED, _("not
connected"));
- } else if (client->priv->tls_conn != NULL) {
+ } else if (priv->tls_conn != NULL) {
g_set_error(error, NET_CLIENT_ERROR_QUARK, (gint) NET_CLIENT_ERROR_TLS_ACTIVE, _("connection
is already encrypted"));
} else {
- client->priv->tls_conn = g_tls_client_connection_new(G_IO_STREAM(client->priv->plain_conn),
NULL, error);
- if (client->priv->tls_conn != NULL) {
- if (client->priv->certificate != NULL) {
- g_tls_connection_set_certificate(G_TLS_CONNECTION(client->priv->tls_conn),
client->priv->certificate);
+ priv->tls_conn = g_tls_client_connection_new(G_IO_STREAM(priv->plain_conn), NULL, error);
+ if (priv->tls_conn != NULL) {
+ if (priv->certificate != NULL) {
+ g_tls_connection_set_certificate(G_TLS_CONNECTION(priv->tls_conn),
priv->certificate);
}
- (void) g_signal_connect(G_OBJECT(client->priv->tls_conn), "accept-certificate",
G_CALLBACK(cert_accept_cb), client);
- result = g_tls_connection_handshake(G_TLS_CONNECTION(client->priv->tls_conn), NULL,
error);
+ (void) g_signal_connect(G_OBJECT(priv->tls_conn), "accept-certificate",
G_CALLBACK(cert_accept_cb), client);
+ result = g_tls_connection_handshake(G_TLS_CONNECTION(priv->tls_conn), NULL, error);
if (result) {
-
g_filter_input_stream_set_close_base_stream(G_FILTER_INPUT_STREAM(client->priv->istream), FALSE);
- g_object_unref(G_OBJECT(client->priv->istream)); /* unref the
plain connection's stream */
- client->priv->istream =
g_data_input_stream_new(g_io_stream_get_input_stream(G_IO_STREAM(client->priv->tls_conn)));
- g_data_input_stream_set_newline_type(client->priv->istream,
G_DATA_STREAM_NEWLINE_TYPE_CR_LF);
- client->priv->ostream =
g_io_stream_get_output_stream(G_IO_STREAM(client->priv->tls_conn));
+
g_filter_input_stream_set_close_base_stream(G_FILTER_INPUT_STREAM(priv->istream), FALSE);
+ g_object_unref(G_OBJECT(priv->istream)); /* unref the plain
connection's stream */
+ priv->istream =
g_data_input_stream_new(g_io_stream_get_input_stream(G_IO_STREAM(priv->tls_conn)));
+ g_data_input_stream_set_newline_type(priv->istream,
G_DATA_STREAM_NEWLINE_TYPE_CR_LF);
+ priv->ostream = g_io_stream_get_output_stream(G_IO_STREAM(priv->tls_conn));
g_debug("connection is encrypted");
} else {
- g_object_unref(G_OBJECT(client->priv->tls_conn));
- client->priv->tls_conn = NULL;
+ g_object_unref(G_OBJECT(priv->tls_conn));
+ priv->tls_conn = NULL;
}
}
}
@@ -522,34 +553,36 @@ net_client_start_tls(NetClient *client, GError **error)
gboolean
net_client_start_compression(NetClient *client, GError **error)
{
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ NetClientPrivate *priv = net_client_get_instance_private(client);
gboolean result = FALSE;
g_return_val_if_fail(NET_IS_CLIENT(client), FALSE);
- if (client->priv->plain_conn == NULL) {
+ if (priv->plain_conn == NULL) {
g_set_error(error, NET_CLIENT_ERROR_QUARK, (gint) NET_CLIENT_ERROR_NOT_CONNECTED, _("not
connected"));
- } else if (client->priv->comp != NULL) {
+ } else if (priv->comp != NULL) {
g_set_error(error, NET_CLIENT_ERROR_QUARK, (gint) NET_CLIENT_ERROR_COMP_ACTIVE, _("connection
is already compressed"));
} else {
- client->priv->comp = g_zlib_compressor_new(G_ZLIB_COMPRESSOR_FORMAT_RAW, -1);
- client->priv->decomp = g_zlib_decompressor_new(G_ZLIB_COMPRESSOR_FORMAT_RAW);
+ priv->comp = g_zlib_compressor_new(G_ZLIB_COMPRESSOR_FORMAT_RAW, -1);
+ priv->decomp = g_zlib_decompressor_new(G_ZLIB_COMPRESSOR_FORMAT_RAW);
- g_filter_input_stream_set_close_base_stream(G_FILTER_INPUT_STREAM(client->priv->istream),
FALSE);
- g_object_unref(client->priv->istream);
+ g_filter_input_stream_set_close_base_stream(G_FILTER_INPUT_STREAM(priv->istream), FALSE);
+ g_object_unref(priv->istream);
- if (client->priv->tls_conn != NULL) {
- client->priv->comp_istream =
-
g_converter_input_stream_new(g_io_stream_get_input_stream(G_IO_STREAM(client->priv->tls_conn)),
- G_CONVERTER(client->priv->decomp));
+ if (priv->tls_conn != NULL) {
+ priv->comp_istream =
+
g_converter_input_stream_new(g_io_stream_get_input_stream(G_IO_STREAM(priv->tls_conn)),
+ G_CONVERTER(priv->decomp));
} else {
- client->priv->comp_istream =
-
g_converter_input_stream_new(g_io_stream_get_input_stream(G_IO_STREAM(client->priv->plain_conn)),
- G_CONVERTER(client->priv->decomp));
+ priv->comp_istream =
+
g_converter_input_stream_new(g_io_stream_get_input_stream(G_IO_STREAM(priv->plain_conn)),
+ G_CONVERTER(priv->decomp));
}
- client->priv->istream = g_data_input_stream_new(client->priv->comp_istream);
- g_data_input_stream_set_newline_type(client->priv->istream, G_DATA_STREAM_NEWLINE_TYPE_CR_LF);
+ priv->istream = g_data_input_stream_new(priv->comp_istream);
+ g_data_input_stream_set_newline_type(priv->istream, G_DATA_STREAM_NEWLINE_TYPE_CR_LF);
- client->priv->ostream = g_converter_output_stream_new(client->priv->ostream,
G_CONVERTER(client->priv->comp));
+ priv->ostream = g_converter_output_stream_new(priv->ostream, G_CONVERTER(priv->comp));
result = TRUE;
g_debug("connection is compressed");
}
@@ -561,9 +594,12 @@ net_client_start_compression(NetClient *client, GError **error)
gboolean
net_client_set_timeout(NetClient *client, guint timeout_secs)
{
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ const NetClientPrivate *priv = net_client_get_instance_private(client);
+
g_return_val_if_fail(NET_IS_CLIENT(client), FALSE);
- g_socket_client_set_timeout(client->priv->sock, timeout_secs);
+ g_socket_client_set_timeout(priv->sock, timeout_secs);
return TRUE;
}
@@ -571,19 +607,25 @@ net_client_set_timeout(NetClient *client, guint timeout_secs)
GSocket *
net_client_get_socket(NetClient *client)
{
- g_return_val_if_fail(NET_IS_CLIENT(client) && (client->priv->plain_conn != NULL), NULL);
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ const NetClientPrivate *priv = net_client_get_instance_private(client);
+
+ g_return_val_if_fail(NET_IS_CLIENT(client) && (priv->plain_conn != NULL), NULL);
- return g_socket_connection_get_socket(client->priv->plain_conn);
+ return g_socket_connection_get_socket(priv->plain_conn);
}
gboolean
net_client_can_read(NetClient *client)
{
- g_return_val_if_fail(NET_IS_CLIENT(client) && (client->priv->plain_conn != NULL) &&
(client->priv->istream != NULL), FALSE);
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ const NetClientPrivate *priv = net_client_get_instance_private(client);
- return (g_socket_condition_check(g_socket_connection_get_socket(client->priv->plain_conn), G_IO_IN)
!= 0) ||
- (g_buffered_input_stream_get_available(G_BUFFERED_INPUT_STREAM(client->priv->istream)) > 0U);
+ g_return_val_if_fail(NET_IS_CLIENT(client) && (priv->plain_conn != NULL) && (priv->istream != NULL),
FALSE);
+
+ return (g_socket_condition_check(g_socket_connection_get_socket(priv->plain_conn), G_IO_IN) != 0) ||
+ (g_buffered_input_stream_get_available(G_BUFFERED_INPUT_STREAM(priv->istream)) > 0U);
}
@@ -606,10 +648,12 @@ net_client_class_init(NetClientClass *klass)
static void
net_client_init(NetClient *self)
{
- self->priv = net_client_get_instance_private(self); /*lint !e9079 (MISRA C:2012 Rule
11.5) intended use of this function */
- self->priv->sock = g_socket_client_new();
- if (self->priv->sock != NULL) {
- g_socket_client_set_timeout(self->priv->sock, 180U);
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ NetClientPrivate *priv = net_client_get_instance_private(self);
+
+ priv->sock = g_socket_client_new();
+ if (priv->sock != NULL) {
+ g_socket_client_set_timeout(priv->sock, 180U);
}
}
@@ -617,24 +661,27 @@ net_client_init(NetClient *self)
static void
net_client_finalise(GObject *object)
{
- const NetClient *client = NET_CLIENT(object);
+ NetClient *client = NET_CLIENT(object);
+ /*lint -e{9079} (MISRA C:2012 Rule 11.5) intended use of this function */
+ NetClientPrivate *priv = net_client_get_instance_private(client);
const GObjectClass *parent_class = G_OBJECT_CLASS(net_client_parent_class);
net_client_shutdown(client);
- if (client->priv->sock != NULL) {
- g_object_unref(G_OBJECT(client->priv->sock));
- client->priv->sock = NULL;
+ if (priv->sock != NULL) {
+ g_object_unref(G_OBJECT(priv->sock));
+ priv->sock = NULL;
}
- if (client->priv->certificate != NULL) {
- g_object_unref(G_OBJECT(client->priv->certificate));
- client->priv->certificate = NULL;
+ if (priv->certificate != NULL) {
+ g_object_unref(G_OBJECT(priv->certificate));
+ priv->certificate = NULL;
}
- g_debug("finalised connection to %s", client->priv->host_and_port);
- g_free(client->priv->host_and_port);
+ g_debug("finalised connection to %s", priv->host_and_port);
+ g_free(priv->host_and_port);
(*parent_class->finalize)(object);
}
+/*lint -e{715,818} */
static gboolean
cert_accept_cb(G_GNUC_UNUSED GTlsConnection *conn, GTlsCertificate *peer_cert, GTlsCertificateFlags errors,
gpointer user_data)
{
diff --git a/libnetclient/net-client.h b/libnetclient/net-client.h
index ad553e440..8b1c74846 100644
--- a/libnetclient/net-client.h
+++ b/libnetclient/net-client.h
@@ -25,26 +25,10 @@ G_BEGIN_DECLS
#define NET_CLIENT_TYPE (net_client_get_type())
-#define NET_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),
NET_CLIENT_TYPE, NetClient))
-#define NET_IS_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),
NET_CLIENT_TYPE))
-#define NET_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),
NET_CLIENT_TYPE, NetClientClass))
-#define NET_IS_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NET_CLIENT_TYPE))
-#define NET_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), NET_CLIENT_TYPE,
NetClientClass))
-
-#define NET_CLIENT_ERROR_QUARK (g_quark_from_static_string("net-client"))
+G_DECLARE_DERIVABLE_TYPE(NetClient, net_client, NET, CLIENT, GObject)
-typedef struct _NetClient NetClient;
-typedef struct _NetClientClass NetClientClass;
-typedef struct _NetClientPrivate NetClientPrivate;
-typedef enum _NetClientError NetClientError;
-typedef enum _NetClientCryptMode NetClientCryptMode;
-
-
-struct _NetClient {
- GObject parent;
- NetClientPrivate *priv;
-};
+#define NET_CLIENT_ERROR_QUARK (g_quark_from_static_string("net-client"))
struct _NetClientClass {
@@ -52,6 +36,10 @@ struct _NetClientClass {
};
+typedef enum _NetClientError NetClientError;
+typedef enum _NetClientCryptMode NetClientCryptMode;
+
+
/** @brief Encryption mode */
enum _NetClientCryptMode {
NET_CLIENT_CRYPT_ENCRYPTED = 1, /**< TLS encryption @em before starting the protocol
required (e.g. SMTPS). */
@@ -75,10 +63,6 @@ enum _NetClientError {
};
-GType net_client_get_type(void)
- G_GNUC_CONST;
-
-
/** @brief Create a new network client
*
* @param host_and_port remote host and port or service, separated by a colon, which shall be connected
@@ -115,7 +99,7 @@ gboolean net_client_configure(NetClient *client, const gchar *host_and_port, gui
*
* @note The function returns the value of @em host_and_port set by net_client_new() or
net_client_configure().
*/
-const gchar *net_client_get_host(const NetClient *client);
+const gchar *net_client_get_host(NetClient *client);
/** @brief Connect a network client
@@ -136,7 +120,7 @@ gboolean net_client_connect(NetClient *client, GError **error);
* Shut down the connection. Note that it is usually not necessary to call this function, as the connection
will be shut down when
* the client is destroyed by calling <tt>g_object_unref()</tt>.
*/
-void net_client_shutdown(const NetClient *client);
+void net_client_shutdown(NetClient *client);
/** @brief Check if a network client is connected
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]