diff options
author | defanor <defanor@uberspace.net> | 2023-06-14 08:26:57 +0300 |
---|---|---|
committer | defanor <defanor@uberspace.net> | 2023-06-14 08:26:57 +0300 |
commit | 931847c9c0d170410ec210ab558f3bbf6902355b (patch) | |
tree | 4d7bf90b30dc985edfbc09a5d0007b4aac8da533 /src/rexmpp_sasl.c | |
parent | 2d4110996bea53a9568b750d00d4dcdcc3907bc6 (diff) |
Use more pointers to other structures from struct rexmpp
Instead of including them. Those structures can vary depending on
configuration options, while for bindings it is easier if they stay
the same, and are mere pointers. Besides, some of them may refer to
opaque Rust-only structures in the future.
Diffstat (limited to 'src/rexmpp_sasl.c')
-rw-r--r-- | src/rexmpp_sasl.c | 81 |
1 files changed, 45 insertions, 36 deletions
diff --git a/src/rexmpp_sasl.c b/src/rexmpp_sasl.c index 7dd16ba..cf5d1fe 100644 --- a/src/rexmpp_sasl.c +++ b/src/rexmpp_sasl.c @@ -31,28 +31,33 @@ int rexmpp_sasl_cb (Gsasl *ctx, Gsasl_session *sctx, Gsasl_property prop) { } int rexmpp_sasl_ctx_init (rexmpp_t *s) { - int err = gsasl_init(&(s->sasl.ctx)); + s->sasl = malloc(sizeof(struct rexmpp_sasl_ctx)); + int err = gsasl_init(&(s->sasl->ctx)); if (err != GSASL_OK) { rexmpp_log(s, LOG_CRIT, "gsasl initialisation error: %s", gsasl_strerror(err)); return -1; } - gsasl_callback_hook_set(s->sasl.ctx, s); - gsasl_callback_set(s->sasl.ctx, rexmpp_sasl_cb); + gsasl_callback_hook_set(s->sasl->ctx, s); + gsasl_callback_set(s->sasl->ctx, rexmpp_sasl_cb); return 0; } void rexmpp_sasl_ctx_deinit (rexmpp_t *s) { - gsasl_done(s->sasl.ctx); + gsasl_done(s->sasl->ctx); + if (s->sasl != NULL) { + free(s->sasl); + s->sasl = NULL; + } } void rexmpp_sasl_ctx_cleanup (rexmpp_t *s) { - gsasl_finish(s->sasl.session); - s->sasl.session = NULL; + gsasl_finish(s->sasl->session); + s->sasl->session = NULL; } int rexmpp_sasl_encode (rexmpp_t *s, const char *in, size_t in_len, char **out, size_t *out_len) { - int sasl_err = gsasl_encode (s->sasl.session, in, in_len, out, out_len); + int sasl_err = gsasl_encode (s->sasl->session, in, in_len, out, out_len); if (sasl_err != GSASL_OK) { rexmpp_log(s, LOG_ERR, "SASL encoding error: %s", gsasl_strerror(sasl_err)); return -1; @@ -61,7 +66,7 @@ int rexmpp_sasl_encode (rexmpp_t *s, const char *in, size_t in_len, char **out, } int rexmpp_sasl_decode (rexmpp_t *s, const char *in, size_t in_len, char **out, size_t *out_len) { - int sasl_err = gsasl_decode(s->sasl.session, in, in_len, out, out_len); + int sasl_err = gsasl_decode(s->sasl->session, in, in_len, out, out_len); if (sasl_err != GSASL_OK) { rexmpp_log(s, LOG_ERR, "SASL decoding error: %s", gsasl_strerror(sasl_err)); return -1; @@ -70,15 +75,15 @@ int rexmpp_sasl_decode (rexmpp_t *s, const char *in, size_t in_len, char **out, } const char *rexmpp_sasl_suggest_mechanism (rexmpp_t *s, const char *mech_list) { - return gsasl_client_suggest_mechanism(s->sasl.ctx, mech_list); + return gsasl_client_suggest_mechanism(s->sasl->ctx, mech_list); } void rexmpp_sasl_property_set (rexmpp_t *s, rexmpp_sasl_property prop, const char *data) { - gsasl_property_set (s->sasl.session, (Gsasl_property)prop, data); + gsasl_property_set (s->sasl->session, (Gsasl_property)prop, data); } int rexmpp_sasl_start (rexmpp_t *s, const char *mech) { - int sasl_err = gsasl_client_start(s->sasl.ctx, mech, &(s->sasl.session)); + int sasl_err = gsasl_client_start(s->sasl->ctx, mech, &(s->sasl->session)); if (sasl_err != GSASL_OK) { rexmpp_log(s, LOG_CRIT, "Failed to initialise SASL session: %s", gsasl_strerror(sasl_err)); @@ -88,7 +93,7 @@ int rexmpp_sasl_start (rexmpp_t *s, const char *mech) { } int rexmpp_sasl_step64 (rexmpp_t *s, const char *b64_in, char **b64_out) { - int sasl_err = gsasl_step64 (s->sasl.session, b64_in, b64_out); + int sasl_err = gsasl_step64 (s->sasl->session, b64_in, b64_out); if (sasl_err != GSASL_OK) { if (sasl_err == GSASL_NEEDS_MORE) { rexmpp_log(s, LOG_DEBUG, "SASL needs more data"); @@ -106,26 +111,30 @@ int rexmpp_sasl_step64 (rexmpp_t *s, const char *b64_in, char **b64_out) { #include <memory.h> int rexmpp_sasl_ctx_init (rexmpp_t *s) { - s->sasl.mech = REXMPP_SASL_MECH_UNKNOWN; - s->sasl.authid = NULL; - s->sasl.password = NULL; + s->sasl = malloc(sizeof(struct rexmpp_sasl_ctx)); + s->sasl->mech = REXMPP_SASL_MECH_UNKNOWN; + s->sasl->authid = NULL; + s->sasl->password = NULL; return 0; } void rexmpp_sasl_ctx_cleanup (rexmpp_t *s) { - s->sasl.mech = REXMPP_SASL_MECH_UNKNOWN; - if (s->sasl.authid != NULL) { - free(s->sasl.authid); - s->sasl.authid = NULL; + s->sasl->mech = REXMPP_SASL_MECH_UNKNOWN; + if (s->sasl->authid != NULL) { + free(s->sasl->authid); + s->sasl->authid = NULL; } - if (s->sasl.password != NULL) { - free(s->sasl.password); - s->sasl.password = NULL; + if (s->sasl->password != NULL) { + free(s->sasl->password); + s->sasl->password = NULL; } } void rexmpp_sasl_ctx_deinit (rexmpp_t *s) { - (void)s; + if (s->sasl != NULL) { + free(s->sasl); + s->sasl = NULL; + } } int rexmpp_sasl_encode (rexmpp_t *s, const char *in, size_t in_len, char **out, size_t *out_len) { @@ -186,7 +195,7 @@ const char *rexmpp_sasl_suggest_mechanism (rexmpp_t *s, const char *mech_list) { int rexmpp_sasl_start (rexmpp_t *s, const char *mech) { rexmpp_sasl_mechanism m = rexmpp_sasl_mech_read(mech); if (m != REXMPP_SASL_MECH_UNKNOWN) { - s->sasl.mech = m; + s->sasl->mech = m; return 0; } return -1; @@ -194,15 +203,15 @@ int rexmpp_sasl_start (rexmpp_t *s, const char *mech) { const char *rexmpp_sasl_get_prop (rexmpp_t *s, rexmpp_sasl_property prop) { if (prop == REXMPP_SASL_PROP_AUTHID) { - if (s->sasl.authid == NULL) { + if (s->sasl->authid == NULL) { s->sasl_property_cb(s, prop); } - return s->sasl.authid; + return s->sasl->authid; } else if (prop == REXMPP_SASL_PROP_PASSWORD) { - if (s->sasl.password == NULL) { + if (s->sasl->password == NULL) { s->sasl_property_cb(s, prop); } - return s->sasl.password; + return s->sasl->password; } return NULL; } @@ -210,7 +219,7 @@ const char *rexmpp_sasl_get_prop (rexmpp_t *s, rexmpp_sasl_property prop) { int rexmpp_sasl_step64 (rexmpp_t *s, const char *b64_in, char **b64_out) { (void)s; (void)b64_in; - if (s->sasl.mech == REXMPP_SASL_MECH_PLAIN) { + if (s->sasl->mech == REXMPP_SASL_MECH_PLAIN) { /* RFC 4616 */ const char *authid = rexmpp_sasl_get_prop(s, REXMPP_SASL_PROP_AUTHID); const char *password = rexmpp_sasl_get_prop(s, REXMPP_SASL_PROP_PASSWORD); @@ -226,7 +235,7 @@ int rexmpp_sasl_step64 (rexmpp_t *s, const char *b64_in, char **b64_out) { free(auth); return 0; } - } else if (s->sasl.mech == REXMPP_SASL_MECH_EXTERNAL) { + } else if (s->sasl->mech == REXMPP_SASL_MECH_EXTERNAL) { *b64_out = strdup(""); return 0; } @@ -237,15 +246,15 @@ void rexmpp_sasl_property_set (rexmpp_t *s, rexmpp_sasl_property prop, const cha (void)s; (void)data; if (prop == REXMPP_SASL_PROP_AUTHID) { - if (s->sasl.authid != NULL) { - free(s->sasl.authid); + if (s->sasl->authid != NULL) { + free(s->sasl->authid); } - s->sasl.authid = strdup(data); + s->sasl->authid = strdup(data); } else if (prop == REXMPP_SASL_PROP_PASSWORD) { - if (s->sasl.password != NULL) { - free(s->sasl.password); + if (s->sasl->password != NULL) { + free(s->sasl->password); } - s->sasl.password = strdup(data); + s->sasl->password = strdup(data); } } |