* a protection buffer. */
#define M_SASL_MAXBUF 65536
-#define IP_PORT_BUFLEN 1024
+typedef struct {
+ sasl_conn_t *saslconn;
+ const sasl_ssf_t *ssf;
+ const unsigned int *pbufsize;
+
+ /* read buffer */
+ char *buf;
+ unsigned blen;
+ unsigned int bpos;
+
+ /* underlying socket data */
+ void *sockdata;
+ int (*msasl_open) (CONNECTION * conn);
+ int (*msasl_close) (CONNECTION * conn);
+ int (*msasl_read) (CONNECTION * conn, char *buf, ssize_t len);
+ int (*msasl_write) (CONNECTION * conn, const char *buf, ssize_t count);
+} SASL_DATA;
static sasl_callback_t mutt_sasl_callbacks[5];
struct sockaddr_storage local, remote;
socklen_t size;
- char iplocalport[IP_PORT_BUFLEN], ipremoteport[IP_PORT_BUFLEN];
+ char iplocalport[STRING], ipremoteport[STRING];
const char *service;
int rc;
size = sizeof(local);
if (getsockname(conn->fd, (struct sockaddr *) &local, &size)
- || iptostring(&local, iplocalport, IP_PORT_BUFLEN) != SASL_OK)
+ || iptostring(&local, iplocalport, STRING) != SASL_OK)
{
return -1;
}
size = sizeof(remote);
if (getpeername(conn->fd, (struct sockaddr *) &remote, &size)
- || iptostring(&remote, ipremoteport, IP_PORT_BUFLEN) != SASL_OK)
+ || iptostring(&remote, ipremoteport, STRING) != SASL_OK)
{
return -1;
}
conn->conn_write = mutt_sasl_conn_write;
}
-void mutt_sasl_done (void) {
- sasl_done ();
+void mutt_sasl_shutdown(void) {
+ sasl_done();
}
/* mutt_sasl_cb_authname: callback to retrieve authname or user from ACCOUNT */
goto fail;
}
- rc = (sasldata->msasl_write)(conn, pbuf, plen);
+ plen -= (sasldata->msasl_write)(conn, pbuf, plen);
p_delete(&pbuf);
- if (rc != plen)
+ if (plen)
goto fail;
len -= olen;