1 /*
2  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
3  * Use is subject to license terms.
4  */
5 /*
6  * The contents of this file are subject to the Netscape Public
7  * License Version 1.1 (the "License"); you may not use this file
8  * except in compliance with the License. You may obtain a copy of
9  * the License at http://www.mozilla.org/NPL/
10  *
11  * Software distributed under the License is distributed on an "AS
12  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
13  * implied. See the License for the specific language governing
14  * rights and limitations under the License.
15  *
16  * The Original Code is Mozilla Communicator client code, released
17  * March 31, 1998.
18  *
19  * The Initial Developer of the Original Code is Netscape
20  * Communications Corporation. Portions created by Netscape are
21  * Copyright (C) 1998-1999 Netscape Communications Corporation. All
22  * Rights Reserved.
23  *
24  * Contributor(s):
25  */
26 /*
27  *  Copyright (c) 1990 Regents of the University of Michigan.
28  *  All rights reserved.
29  */
30 /*
31  *  friendly.c
32  */
33 
34 #include "ldap-int.h"
35 
36 char *
37 LDAP_CALL
ldap_friendly_name(char * filename,char * name,FriendlyMap * map)38 ldap_friendly_name( char *filename, char *name, FriendlyMap *map )
39 {
40 	int	i, entries;
41 	FILE	*fp;
42 	char	*s;
43 	char	buf[BUFSIZ];
44 
45 	if ( map == NULL ) {
46 		return( name );
47 	}
48 	if ( name == NULL ) {
49 		return(name);
50 	}
51 
52 	if ( *map == NULL ) {
53 		if ( (fp = fopen( filename, "rF" )) == NULL )
54 			return( name );
55 
56 		entries = 0;
57 		while ( fgets( buf, sizeof(buf), fp ) != NULL ) {
58 			if ( buf[0] != '#' )
59 				entries++;
60 		}
61 		rewind( fp );
62 
63 		if ( (*map = (FriendlyMap)NSLDAPI_MALLOC( (entries + 1) *
64 		    sizeof(struct friendly) )) == NULL ) {
65 			fclose( fp );
66 			return( name );
67 		}
68 
69 		i = 0;
70 		while ( fgets( buf, sizeof(buf), fp ) != NULL && i < entries ) {
71 			if ( buf[0] == '#' )
72 				continue;
73 
74 			if ( (s = strchr( buf, '\n' )) != NULL )
75 				*s = '\0';
76 
77 			if ( (s = strchr( buf, '\t' )) == NULL )
78 				continue;
79 			*s++ = '\0';
80 
81 			if ( *s == '"' ) {
82 				int	esc = 0, found = 0;
83 
84 				for ( ++s; *s && !found; s++ ) {
85 					switch ( *s ) {
86 					case '\\':
87 						esc = 1;
88 						break;
89 					case '"':
90 						if ( !esc )
91 							found = 1;
92 						/* FALLTHROUGH */
93 					default:
94 						esc = 0;
95 						break;
96 					}
97 				}
98 			}
99 
100 			(*map)[i].f_unfriendly = nsldapi_strdup( buf );
101 			(*map)[i].f_friendly = nsldapi_strdup( s );
102 			i++;
103 		}
104 
105 		fclose( fp );
106 		(*map)[i].f_unfriendly = NULL;
107 	}
108 
109 	for ( i = 0; (*map)[i].f_unfriendly != NULL; i++ ) {
110 		if ( strcasecmp( name, (*map)[i].f_unfriendly ) == 0 )
111 			return( (*map)[i].f_friendly );
112 	}
113 	return( name );
114 }
115 
116 
117 void
118 LDAP_CALL
ldap_free_friendlymap(FriendlyMap * map)119 ldap_free_friendlymap( FriendlyMap *map )
120 {
121 	struct friendly* pF;
122 
123 	if ( map == NULL || *map == NULL ) {
124 		return;
125 	}
126 
127 	for ( pF = *map; pF->f_unfriendly; pF++ ) {
128 		NSLDAPI_FREE( pF->f_unfriendly );
129 		NSLDAPI_FREE( pF->f_friendly );
130 	}
131 	NSLDAPI_FREE( *map );
132 	*map = NULL;
133 }
134