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