support ; for comments for compatability with MIT
[heimdal.git] / lib / krb5 / context.c
blobc21f0acea37e218a0e5b3e32e0f3e94c6270a4e5
1 /*
2 * Copyright (c) 1997 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
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.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed by Kungliga Tekniska
20 * Högskolan and its contributors.
22 * 4. Neither the name of the Institute nor the names of its contributors
23 * may be used to endorse or promote products derived from this software
24 * without specific prior written permission.
26 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
39 #include "krb5_locl.h"
41 RCSID("$Id$");
43 krb5_error_code
44 krb5_init_context(krb5_context *context)
46 krb5_context p;
47 int val;
49 ALLOC(p, 1);
50 if(!p)
51 return ENOMEM;
52 memset(p, 0, sizeof(krb5_context_data));
53 krb5_init_ets(p);
54 p->cc_ops = NULL;
55 krb5_config_parse_file (krb5_config_file, &p->cf);
56 p->max_skew = 5 * 60;
57 val = krb5_config_get_time (p->cf, "libdefaults", "clockskew", NULL);
58 if (val >= 0)
59 p->max_skew = val;
61 p->kdc_timeout = 3;
62 val = krb5_config_get_time (p->cf, "libdefaults", "kdc_timeout", NULL);
63 if(val >= 0)
64 p->kdc_timeout = val;
66 p->max_retries = 3;
67 val = krb5_config_get_int (p->cf, "libdefaults", "max_retries", NULL);
68 if (val >= 0)
69 p->max_retries = val;
71 krb5_set_default_realm(p, NULL);
72 *context = p;
73 return 0;
76 void
77 krb5_free_context(krb5_context context)
79 int i;
81 free(context->etypes);
82 free(context->default_realm);
83 krb5_config_file_free (context->cf);
84 free_error_table (context->et_list);
85 for(i = 0; i < context->num_ops; ++i)
86 free(context->cc_ops[i].prefix);
87 free(context->cc_ops);
88 free(context);
93 * XXX - This information needs to be coordinated with encrypt.c
96 static krb5_boolean
97 valid_etype(krb5_enctype e)
99 return e == ETYPE_DES_CBC_CRC
100 || e == ETYPE_DES_CBC_MD4
101 || e == ETYPE_DES_CBC_MD5;
104 static krb5_error_code
105 default_etypes(krb5_enctype **etype)
107 krb5_enctype *p;
108 ALLOC(p, 4);
109 if(!p)
110 return ENOMEM;
111 p[0] = ETYPE_DES_CBC_MD5;
112 p[1] = ETYPE_DES_CBC_MD4;
113 p[2] = ETYPE_DES_CBC_CRC;
114 p[3] = 0;
115 *etype = p;
116 return 0;
119 krb5_error_code
120 krb5_set_default_in_tkt_etypes(krb5_context context,
121 const krb5_enctype *etypes)
123 int i;
124 krb5_enctype *p = NULL;
126 if(etypes) {
127 i = 0;
128 while(etypes[i])
129 if(!valid_etype(etypes[i++]))
130 return KRB5_PROG_ETYPE_NOSUPP;
131 ++i;
132 ALLOC(p, i);
133 if(!p)
134 return ENOMEM;
135 memmove(p, etypes, i * sizeof(krb5_enctype));
137 if(context->etypes)
138 free(context->etypes);
139 context->etypes = p;
140 return 0;
145 krb5_error_code
146 krb5_get_default_in_tkt_etypes(krb5_context context,
147 krb5_enctype **etypes)
149 krb5_enctype *p;
150 int i;
152 if(context->etypes) {
153 for(i = 0; context->etypes[i]; i++);
154 ++i;
155 ALLOC(p, i);
156 if(!p)
157 return ENOMEM;
158 memmove(p, context->etypes, i * sizeof(krb5_enctype));
159 } else
160 if(default_etypes(&p))
161 return ENOMEM;
162 *etypes = p;
163 return 0;
166 const char *
167 krb5_get_err_text(krb5_context context, long code)
169 const char *p = com_right(context->et_list, code);
170 if(p == NULL)
171 p = strerror(code);
172 return p;
175 void
176 krb5_init_ets(krb5_context context)
178 if(context->et_list == NULL){
179 initialize_krb5_error_table(&context->et_list);
180 initialize_asn1_error_table(&context->et_list);
181 initialize_heim_error_table(&context->et_list);