Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "internal.h"
00024
00037 const char *
00038 gsasl_client_suggest_mechanism (Gsasl * ctx, const char *mechlist)
00039 {
00040 size_t mechlist_len, target_mech, i;
00041
00042 mechlist_len = mechlist ? strlen (mechlist) : 0;
00043 target_mech = ctx->n_client_mechs;
00044
00045 for (i = 0; i < mechlist_len;)
00046 {
00047 size_t len;
00048
00049 len = strspn (mechlist + i, GSASL_VALID_MECHANISM_CHARACTERS);
00050 if (!len)
00051 ++i;
00052 else
00053 {
00054 size_t j;
00055
00056
00057
00058 for (j = (target_mech < ctx->n_client_mechs ? target_mech + 1 : 0);
00059 j < ctx->n_client_mechs; ++j)
00060 {
00061 if (strncmp (ctx->client_mechs[j].name, mechlist + i, len) == 0)
00062 {
00063 Gsasl_session *sctx;
00064
00065 if (gsasl_client_start (ctx, ctx->client_mechs[j].name,
00066 &sctx) == GSASL_OK)
00067 {
00068 gsasl_finish (sctx);
00069 target_mech = j;
00070 }
00071
00072 break;
00073 }
00074 }
00075 i += len + 1;
00076 }
00077 }
00078
00079 return target_mech < ctx->n_client_mechs ?
00080 ctx->client_mechs[target_mech].name : NULL;
00081 }