gss_common.c revision 57419
1/*
2 * Copyright (c) 1997 - 2000 Kungliga Tekniska H�gskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 *
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * 3. Neither the name of the Institute nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#include "test_locl.h"
35#include <gssapi.h>
36#include "gss_common.h"
37RCSID("$Id: gss_common.c,v 1.7 2000/02/12 21:31:38 assar Exp $");
38
39void
40write_token (int sock, gss_buffer_t buf)
41{
42    u_int32_t len, net_len;
43    OM_uint32 min_stat;
44
45    len = buf->length;
46
47    net_len = htonl(len);
48
49    if (write (sock, &net_len, 4) != 4)
50	err (1, "write");
51    if (write (sock, buf->value, len) != len)
52	err (1, "write");
53
54    gss_release_buffer (&min_stat, buf);
55}
56
57void
58read_token (int sock, gss_buffer_t buf)
59{
60    u_int32_t len, net_len;
61
62    if (read(sock, &net_len, 4) != 4)
63	err (1, "read");
64    len = ntohl(net_len);
65    buf->length = len;
66    buf->value  = malloc(len);
67    if (buf->value == NULL)
68	err (1, "malloc %u", len);
69    if (read (sock, buf->value, len) != len)
70	err (1, "read");
71}
72
73void
74gss_print_errors (int min_stat)
75{
76    OM_uint32 new_stat;
77    OM_uint32 msg_ctx = 0;
78    gss_buffer_desc status_string;
79    OM_uint32 ret;
80
81    do {
82	ret = gss_display_status (&new_stat,
83				  min_stat,
84				  GSS_C_MECH_CODE,
85				  GSS_C_NO_OID,
86				  &msg_ctx,
87				  &status_string);
88	fprintf (stderr, "%s\n", (char *)status_string.value);
89	gss_release_buffer (&new_stat, &status_string);
90    } while (!GSS_ERROR(ret) && msg_ctx != 0);
91}
92
93void
94gss_verr(int exitval, int status, const char *fmt, va_list ap)
95{
96    vwarnx (fmt, ap);
97    gss_print_errors (status);
98    exit (exitval);
99}
100
101void
102gss_err(int exitval, int status, const char *fmt, ...)
103{
104    va_list args;
105
106    va_start(args, fmt);
107    gss_verr (exitval, status, fmt, args);
108    va_end(args);
109}
110
111