1/* listmech.c --- List active client and server mechanisms.
2 * Copyright (C) 2002-2012 Simon Josefsson
3 *
4 * This file is part of GNU SASL Library.
5 *
6 * GNU SASL Library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public License
8 * as published by the Free Software Foundation; either version 2.1 of
9 * the License, or (at your option) any later version.
10 *
11 * GNU SASL Library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License License along with GNU SASL Library; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
20 *
21 */
22
23#include "internal.h"
24
25static int
26_gsasl_listmech (Gsasl * ctx,
27 Gsasl_mechanism * mechs,
28 size_t n_mechs, char **out, int clientp)
29{
30 Gsasl_session *sctx;
31 char *list;
32 size_t i;
33 int rc;
34
35 list = calloc (n_mechs + 1, GSASL_MAX_MECHANISM_SIZE + 1);
36 if (!list)
37 return GSASL_MALLOC_ERROR;
38
39 for (i = 0; i < n_mechs; i++)
40 {
41 if (clientp)
42 rc = gsasl_client_start (ctx, mechs[i].name, &sctx);
43 else
44 rc = gsasl_server_start (ctx, mechs[i].name, &sctx);
45
46 if (rc == GSASL_OK)
47 {
48 gsasl_finish (sctx);
49
50 strcat (list, mechs[i].name);
51 if (i < n_mechs - 1)
52 strcat (list, " ");
53 }
54 }
55
56 *out = list;
57
58 return GSASL_OK;
59}
60
61/**
62 * gsasl_client_mechlist:
63 * @ctx: libgsasl handle.
64 * @out: newly allocated output character array.
65 *
66 * Return a newly allocated string containing SASL names, separated by
67 * space, of mechanisms supported by the libgsasl client. @out is
68 * allocated by this function, and it is the responsibility of caller
69 * to deallocate it.
70 *
71 * Return value: Returns %GSASL_OK if successful, or error code.
72 **/
73int
74gsasl_client_mechlist (Gsasl * ctx, char **out)
75{
76 return _gsasl_listmech (ctx, ctx->client_mechs, ctx->n_client_mechs,
77 out, 1);
78}
79
80/**
81 * gsasl_server_mechlist:
82 * @ctx: libgsasl handle.
83 * @out: newly allocated output character array.
84 *
85 * Return a newly allocated string containing SASL names, separated by
86 * space, of mechanisms supported by the libgsasl server. @out is
87 * allocated by this function, and it is the responsibility of caller
88 * to deallocate it.
89 *
90 * Return value: Returns %GSASL_OK if successful, or error code.
91 **/
92int
93gsasl_server_mechlist (Gsasl * ctx, char **out)
94{
95 return _gsasl_listmech (ctx, ctx->server_mechs, ctx->n_server_mechs,
96 out, 0);
97}
98