#ifndef INCL_SX_SASL_H
#define INCL_SX_SASL_H
#include "sx.h"
#include <sasl/sasl.h>
#include <sasl/saslutil.h>
#ifdef __cplusplus
extern "C" {
#endif
int sx_sasl_init(sx_env_t env, sx_plugin_t p, va_list args);
#define SX_SASL_OFFER (1<<3)
typedef int (*sx_sasl_callback_t)(int cb, void *arg, void **res, sx_t s, void *cbarg);
#define sx_sasl_cb_GET_REALM (0x00)
#define sx_sasl_cb_GET_PASS (0x01)
#define sx_sasl_cb_CHECK_PASS (0x02)
#define sx_sasl_cb_CHECK_AUTHZID (0x03)
#define sx_sasl_cb_GEN_AUTHZID (0x04)
#define sx_sasl_cb_CHECK_MECH (0x05)
#define sx_sasl_ret_OK 0
#define sx_sasl_ret_FAIL 1
int sx_sasl_auth(sx_plugin_t p, sx_t s, char *appname, char *mech, char *user, char *pass);
typedef struct _sx_sasl_st {
char *appname;
sasl_security_properties_t sec_props;
sx_sasl_callback_t cb;
void *cbarg;
} *_sx_sasl_t;
typedef struct _sx_sasl_data_st {
char *user;
sasl_secret_t *psecret;
sasl_callback_t *callbacks;
_sx_sasl_t ctx;
sasl_conn_t *sasl;
sx_t stream;
} *_sx_sasl_data_t;
typedef struct sx_sasl_creds_st {
const char *authnid;
const char *realm;
const char *authzid;
const char *pass;
} *sx_sasl_creds_t;
#define SX_SASL_SSL_MAGIC (0x01)
#ifdef __cplusplus
}
#endif
#endif