1d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o/*
2d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o * com_right.c -- provide Heimdall / Kerberos4kth com_err interfaces
3efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 	for backwards compatbility
4efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *
5d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o * Copyright (c) 2003 by Theodore Ts'o
6d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o *
7d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o * Taken from lib/com_err/error.c from Kerberos4kth distribution.
8efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *
9d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o * Copyright (c) 1997, 1998, 2001 Kungliga Tekniska H�gskolan
10efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * (Royal Institute of Technology, Stockholm, Sweden).
11efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * All rights reserved.
12d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o *
13efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * Redistribution and use in source and binary forms, with or without
14efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * modification, are permitted provided that the following conditions
15efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * are met:
16d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o *
17efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 1. Redistributions of source code must retain the above copyright
18efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *    notice, this list of conditions and the following disclaimer.
19d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o *
20efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 2. Redistributions in binary form must reproduce the above copyright
21efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *    notice, this list of conditions and the following disclaimer in the
22efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *    documentation and/or other materials provided with the distribution.
23d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o *
24efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 3. Neither the name of the Institute nor the names of its contributors
25efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *    may be used to endorse or promote products derived from this software
26efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *    without specific prior written permission.
27d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o *
28efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
29efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
32efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * SUCH DAMAGE.
39d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o */
40d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o
41d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o#include <stdio.h>
42d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o#include <stdlib.h>
43d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o#include <string.h>
44d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o#include "com_err.h"
45d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o#include "error_table.h"
46d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o
47d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'oconst char *
48d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'ocom_right(struct et_list *list, long code)
49d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o{
50d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    struct et_list *p;
51d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    for (p = list; p; p = p->next) {
52d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o	if (code >= p->table->base && code < p->table->base + p->table->n_msgs)
53d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o	    return p->table->msgs[code - p->table->base];
54d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    }
55d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    return NULL;
56d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o}
57d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o
581601b10e65a55a1f8e4b262fa295cdab8cb5d98dTheodore Ts'oconst char *
591601b10e65a55a1f8e4b262fa295cdab8cb5d98dTheodore Ts'ocom_right_r(struct et_list *list, long code, char *str, size_t len)
601601b10e65a55a1f8e4b262fa295cdab8cb5d98dTheodore Ts'o{
611601b10e65a55a1f8e4b262fa295cdab8cb5d98dTheodore Ts'o    struct et_list *p;
621601b10e65a55a1f8e4b262fa295cdab8cb5d98dTheodore Ts'o    for (p = list; p; p = p->next) {
631601b10e65a55a1f8e4b262fa295cdab8cb5d98dTheodore Ts'o	if ((code >= p->table->base) &&
641601b10e65a55a1f8e4b262fa295cdab8cb5d98dTheodore Ts'o	    (code < p->table->base + p->table->n_msgs)) {
651601b10e65a55a1f8e4b262fa295cdab8cb5d98dTheodore Ts'o            strncpy(str, p->table->msgs[code - p->table->base], len);
661601b10e65a55a1f8e4b262fa295cdab8cb5d98dTheodore Ts'o            str[len-1] = '\0';
671601b10e65a55a1f8e4b262fa295cdab8cb5d98dTheodore Ts'o            return str;
681601b10e65a55a1f8e4b262fa295cdab8cb5d98dTheodore Ts'o        }
691601b10e65a55a1f8e4b262fa295cdab8cb5d98dTheodore Ts'o    }
701601b10e65a55a1f8e4b262fa295cdab8cb5d98dTheodore Ts'o    return NULL;
711601b10e65a55a1f8e4b262fa295cdab8cb5d98dTheodore Ts'o}
721601b10e65a55a1f8e4b262fa295cdab8cb5d98dTheodore Ts'o
73d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'ostruct foobar {
74d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    struct et_list etl;
75d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    struct error_table tab;
76d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o};
77d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o
78d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o/*
79d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o * We provide this routine for compatibility with Heimdall generated
80d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o * foo_err.c files, but we don't use this ourselves for foo_err.c
81d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o * files generated by our compile_et.  This is so our foo_err.c
82d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o * files can be used with older com_err libraries without running
83d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o * afoul of dependencies.
84d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o */
85d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'ovoid
86efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'oinitialize_error_table_r(struct et_list **list,
87efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o			 const char **messages,
88d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o			 int num_errors,
89d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o			 long base)
90d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o{
91d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    struct et_list *et, **end;
92d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    struct error_table *tab;
93d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    struct foobar *f;
94d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o
95d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    for (end = list, et = *list; et; end = &et->next, et = et->next)
96d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o        if (et->table->msgs == messages)
97d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o            return;
98d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    f = malloc(sizeof(*f));
99d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    if (f == NULL)
100d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o        return;
101d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    et = &f->etl;
102d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    et->table = tab = &f->tab;
103d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    tab->msgs = messages;
104d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    tab->n_msgs = num_errors;
105d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    tab->base = base;
106d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    et->next = NULL;
107d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    *end = et;
108d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o}
109efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
110d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o
111d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'ovoid
112d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'ofree_error_table(struct et_list *et)
113d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o{
114d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    while(et){
115d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o	struct et_list *p = et;
116d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o	et = et->next;
117d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o	free(p);
118d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o    }
119d03550970c57100dbafd8941f34acafd208ec52eTheodore Ts'o}
120