]> git.sur5r.net Git - openldap/blob - libraries/libldap/friendly.c
Merge in all devel changes since 2.0-alpha2.
[openldap] / libraries / libldap / friendly.c
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
4  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
5  */
6 /*  Portions
7  *  Copyright (c) 1990 Regents of the University of Michigan.
8  *  All rights reserved.
9  *
10  *  friendly.c
11  */
12
13 #include "portable.h"
14
15 #include <stdio.h>
16 #include <ac/stdlib.h>
17
18 #include <ac/ctype.h>
19 #include <ac/errno.h>
20 #include <ac/socket.h>
21 #include <ac/string.h>
22 #include <ac/time.h>
23
24 #include "ldap-int.h"
25
26 char *
27 ldap_friendly_name(
28         LDAP_CONST char *filename,
29         /* LDAP_CONST */ char *uname,
30         LDAPFriendlyMap **map )
31 {
32         int     i, entries;
33         FILE    *fp;
34         char    *s;
35         char    buf[BUFSIZ];
36
37         if ( map == NULL ) {
38                 errno = EINVAL;
39                 return( uname );
40         }
41
42         if ( *map == NULL ) {
43                 if ( (fp = fopen( filename, "r" )) == NULL )
44                         return( uname );
45
46                 entries = 0;
47                 while ( fgets( buf, sizeof(buf), fp ) != NULL ) {
48                         if ( buf[0] != '#' )
49                                 entries++;
50                 }
51                 rewind( fp );
52
53                 if ( (*map = (LDAPFriendlyMap *) LDAP_MALLOC( (entries + 1) *
54                     sizeof(LDAPFriendlyMap) )) == NULL ) {
55                         fclose( fp );
56                         return( uname );
57                 }
58
59                 i = 0;
60                 while ( fgets( buf, sizeof(buf), fp ) != NULL && i < entries ) {
61                         if ( buf[0] == '#' )
62                                 continue;
63
64                         if ( (s = strchr( buf, '\n' )) != NULL )
65                                 *s = '\0';
66
67                         if ( (s = strchr( buf, '\t' )) == NULL )
68                                 continue;
69                         *s++ = '\0';
70
71                         if ( *s == '"' ) {
72                                 int     esc = 0, found = 0;
73
74                                 for ( ++s; *s && !found; s++ ) {
75                                         switch ( *s ) {
76                                         case '\\':
77                                                 esc = 1;
78                                                 break;
79                                         case '"':
80                                                 if ( !esc )
81                                                         found = 1;
82                                                 /* FALL */
83                                         default:
84                                                 esc = 0;
85                                                 break;
86                                         }
87                                 }
88                         }
89
90                         (*map)[i].lf_unfriendly = LDAP_STRDUP( buf );
91                         (*map)[i].lf_friendly   = LDAP_STRDUP( s );
92                         i++;
93                 }
94
95                 fclose( fp );
96                 (*map)[i].lf_unfriendly = NULL;
97         }
98
99         for ( i = 0; (*map)[i].lf_unfriendly != NULL; i++ ) {
100                 if ( strcasecmp( uname, (*map)[i].lf_unfriendly ) == 0 )
101                         return( (*map)[i].lf_friendly );
102         }
103         return( uname );
104 }
105
106
107 void
108 ldap_free_friendlymap( LDAPFriendlyMap **map )
109 {
110         LDAPFriendlyMap* pF = *map;
111
112         if ( pF == NULL )
113                 return;
114
115         while ( pF->lf_unfriendly )
116         {
117                 LDAP_FREE( pF->lf_unfriendly );
118                 LDAP_FREE( pF->lf_friendly );
119                 pF++;
120         }
121         LDAP_FREE( *map );
122         *map = NULL;
123 }