1/*
2 * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 *
25 *---------------------------------------------------------------------------
26 *
27 *	isdnd - common aliasfile handling
28 *      =================================
29 *
30 *	NOTE:	this has to stay in sync with isdntel/alias.c to be able
31 *		to share a common aliasfile!
32 *
33 *      $Id: alias.c,v 1.5 2006/05/24 23:44:34 christos Exp $
34 *
35 * $FreeBSD$
36 *
37 *      last edit-date: [Mon Dec 13 21:45:19 1999]
38 *
39 *----------------------------------------------------------------------------*/
40
41#include "isdnd.h"
42
43static struct alias *firsta = NULL;
44
45#define MAXBUFSZ	256
46
47static void free_alias(struct alias *ptr);
48
49/*---------------------------------------------------------------------------*
50 *	read in and init aliases
51 *---------------------------------------------------------------------------*/
52void
53init_alias(char *filename)
54{
55	FILE *fp;
56	unsigned char buffer[MAXBUFSZ + 1];
57	unsigned char number[MAXBUFSZ + 1];
58	unsigned char name[MAXBUFSZ + 1];
59	unsigned char *s, *d;
60	struct alias *newa = NULL;
61	struct alias *lasta = NULL;
62
63	firsta = NULL;
64
65	if ((fp = fopen(filename, "r")) == NULL)
66	{
67		logit(LL_ERR, "init_alias: error opening aliasfile %s: %s!", filename, strerror(errno));
68		exit(1);
69	}
70
71	while((fgets(buffer, MAXBUFSZ, fp)) != NULL)
72	{
73		if (buffer[0] == '#'  || buffer[0] == ' ' ||
74		   buffer[0] == '\t' || buffer[0] == '\n')
75		{
76			continue;
77		}
78
79		s = buffer;
80		d = number;
81
82		while(*s && (isdigit(*s)))
83			*d++ = *s++;
84
85		*d = '\0';
86
87		while(*s && (isspace(*s)))
88			s++;
89
90		d = name;
91
92		while(*s && (isprint(*s)))
93			*d++ = *s++;
94
95		*d = '\0';
96
97		if ((strlen(number) > 1) && (strlen(name) > 1))
98		{
99			if ((newa = (struct alias *) malloc(sizeof(struct alias))) == NULL)
100			{
101				logit(LL_ERR, "init_alias: malloc failed for struct alias!\n");
102				exit(1);
103			}
104
105			if ((newa->number = strdup(number)) == NULL)
106			{
107				logit(LL_ERR, "init_alias: malloc failed for number alias!\n");
108				exit(1);
109			}
110
111			if ((newa->name = strdup(name)) == NULL)
112			{
113				logit(LL_ERR, "init_alias: malloc failed for name alias!\n");
114				exit(1);
115			}
116
117			newa->next = NULL;
118
119			if (firsta == NULL || lasta == NULL)
120			{
121				firsta = newa;
122			}
123			else
124			{
125				lasta->next = newa;
126			}
127			lasta = newa;
128		}
129	}
130	fclose(fp);
131}
132
133/*---------------------------------------------------------------------------*
134 *	free all aliases
135 *---------------------------------------------------------------------------*/
136void
137free_aliases(void)
138{
139	free_alias(firsta);
140}
141
142/*---------------------------------------------------------------------------*
143 *	free aliases
144 *---------------------------------------------------------------------------*/
145static void
146free_alias(struct alias *ptr)
147{
148
149	if (ptr == NULL)
150		return;
151
152	if (ptr->next != NULL)
153		free_alias(ptr->next);
154
155	if (ptr->number != NULL)
156		free(ptr->number);
157
158	if (ptr->name != NULL)
159		free(ptr->name);
160
161	free(ptr);
162}
163
164/*---------------------------------------------------------------------------*
165 *	try to find alias for number. if no alias found, return number.
166 *---------------------------------------------------------------------------*/
167char *
168get_alias(char *number)
169{
170	struct alias *ca = NULL;
171
172	if (firsta == NULL)
173		return(number);
174
175	ca = firsta;
176
177	for (;;)
178	{
179		if (strlen(number) == strlen(ca->number))
180		{
181			if (!(strcmp(number, ca->number)))
182				return(ca->name);
183		}
184		if (ca->next == NULL)
185			break;
186		ca = ca->next;
187	}
188	return(number);
189}
190
191/* EOF */
192