Merge from vendor branch GPERF:
[dragonfly.git] / crypto / heimdal-0.6.3 / appl / test / tcp_server.c
1 /*
2  * Copyright (c) 1997 - 1999 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 RCSID("$Id: tcp_server.c,v 1.16 1999/12/16 10:31:08 assar Exp $");
36
37 krb5_context context;
38
39 static int
40 proto (int sock, const char *service)
41 {
42     krb5_auth_context auth_context;
43     krb5_error_code status;
44     krb5_principal server;
45     krb5_ticket *ticket;
46     char *name;
47     char hostname[MAXHOSTNAMELEN];
48     krb5_data packet;
49     krb5_data data;
50     u_int32_t len, net_len;
51     ssize_t n;
52
53     status = krb5_auth_con_init (context, &auth_context);
54     if (status)
55         krb5_err (context, 1, status, "krb5_auth_con_init");
56
57     status = krb5_auth_con_setaddrs_from_fd (context,
58                                              auth_context,
59                                              &sock);
60
61     if (status)
62         krb5_err (context, 1, status, "krb5_auth_con_setaddrs_from_fd");
63
64     if(gethostname (hostname, sizeof(hostname)) < 0)
65         krb5_err (context, 1, errno, "gethostname");
66
67     status = krb5_sname_to_principal (context,
68                                       hostname,
69                                       service,
70                                       KRB5_NT_SRV_HST,
71                                       &server);
72     if (status)
73         krb5_err (context, 1, status, "krb5_sname_to_principal");
74
75     status = krb5_recvauth (context,
76                             &auth_context,
77                             &sock,
78                             VERSION,
79                             server,
80                             0,
81                             NULL,
82                             &ticket);
83     if (status)
84         krb5_err (context, 1, status, "krb5_recvauth");
85
86     status = krb5_unparse_name (context,
87                                 ticket->client,
88                                 &name);
89     if (status)
90         krb5_err (context, 1, status, "krb5_unparse_name");
91
92     fprintf (stderr, "User is `%s'\n", name);
93     free (name);
94
95     krb5_data_zero (&data);
96     krb5_data_zero (&packet);
97
98     n = krb5_net_read (context, &sock, &net_len, 4);
99     if (n == 0)
100         krb5_errx (context, 1, "EOF in krb5_net_read");
101     if (n < 0)
102         krb5_err (context, 1, errno, "krb5_net_read");
103
104     len = ntohl(net_len);
105
106     krb5_data_alloc (&packet, len);
107
108     n = krb5_net_read (context, &sock, packet.data, len);
109     if (n == 0)
110         krb5_errx (context, 1, "EOF in krb5_net_read");
111     if (n < 0)
112         krb5_err (context, 1, errno, "krb5_net_read");
113     
114     status = krb5_rd_safe (context,
115                            auth_context,
116                            &packet,
117                            &data,
118                            NULL);
119     if (status)
120         krb5_err (context, 1, status, "krb5_rd_safe");
121
122     fprintf (stderr, "safe packet: %.*s\n", (int)data.length,
123             (char *)data.data);
124
125     n = krb5_net_read (context, &sock, &net_len, 4);
126     if (n == 0)
127         krb5_errx (context, 1, "EOF in krb5_net_read");
128     if (n < 0)
129         krb5_err (context, 1, errno, "krb5_net_read");
130
131     len = ntohl(net_len);
132
133     krb5_data_alloc (&packet, len);
134
135     n = krb5_net_read (context, &sock, packet.data, len);
136     if (n == 0)
137         krb5_errx (context, 1, "EOF in krb5_net_read");
138     if (n < 0)
139         krb5_err (context, 1, errno, "krb5_net_read");
140     
141     status = krb5_rd_priv (context,
142                            auth_context,
143                            &packet,
144                            &data,
145                            NULL);
146     if (status)
147         krb5_err (context, 1, status, "krb5_rd_priv");
148
149     fprintf (stderr, "priv packet: %.*s\n", (int)data.length,
150             (char *)data.data);
151
152     return 0;
153 }
154
155 static int
156 doit (int port, const char *service)
157 {
158     mini_inetd (port);
159
160     return proto (STDIN_FILENO, service);
161 }
162
163 int
164 main(int argc, char **argv)
165 {
166     int port = server_setup(&context, argc, argv);
167     return doit (port, service);
168 }