]> git.sur5r.net Git - openldap/blob - libraries/libldap/friendly.c
cleanup
[openldap] / libraries / libldap / friendly.c
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 1998-2000 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/errno.h>
19 #include <ac/socket.h>
20 #include <ac/string.h>
21 #include <ac/time.h>
22
23 #include "ldap-int.h"
24
25 char *
26 ldap_friendly_name(
27         LDAP_CONST char *filename,
28         /* LDAP_CONST */ char *uname,
29         LDAPFriendlyMap **map )
30 {
31         int     i, entries;
32         FILE    *fp;
33         char    *s;
34         char    buf[BUFSIZ];
35
36         if ( map == NULL ) {
37                 errno = EINVAL;
38                 return( uname );
39         }
40
41         if ( *map == NULL ) {
42                 if ( (fp = fopen( filename, "r" )) == NULL )
43                         return( uname );
44
45                 entries = 0;
46                 while ( fgets( buf, sizeof(buf), fp ) != NULL ) {
47                         if ( buf[0] != '#' )
48                                 entries++;
49                 }
50                 rewind( fp );
51
52                 if ( (*map = (LDAPFriendlyMap *) LDAP_MALLOC( (entries + 1) *
53                     sizeof(LDAPFriendlyMap) )) == NULL ) {
54                         fclose( fp );
55                         return( uname );
56                 }
57
58                 i = 0;
59                 while ( fgets( buf, sizeof(buf), fp ) != NULL && i < entries ) {
60                         if ( buf[0] == '#' )
61                                 continue;
62
63                         if ( (s = strchr( buf, '\n' )) != NULL )
64                                 *s = '\0';
65
66                         if ( (s = strchr( buf, '\t' )) == NULL )
67                                 continue;
68                         *s++ = '\0';
69
70                         if ( *s == '"' ) {
71                                 int     esc = 0, found = 0;
72
73                                 for ( ++s; *s && !found; s++ ) {
74                                         switch ( *s ) {
75                                         case '\\':
76                                                 esc = 1;
77                                                 break;
78                                         case '"':
79                                                 if ( !esc )
80                                                         found = 1;
81                                                 /* FALL */
82                                         default:
83                                                 esc = 0;
84                                                 break;
85                                         }
86                                 }
87                         }
88
89                         (*map)[i].lf_unfriendly = LDAP_STRDUP( buf );
90                         (*map)[i].lf_friendly   = LDAP_STRDUP( s );
91                         i++;
92                 }
93
94                 fclose( fp );
95                 (*map)[i].lf_unfriendly = NULL;
96         }
97
98         for ( i = 0; (*map)[i].lf_unfriendly != NULL; i++ ) {
99                 if ( strcasecmp( uname, (*map)[i].lf_unfriendly ) == 0 )
100                         return( (*map)[i].lf_friendly );
101         }
102         return( uname );
103 }
104
105
106 void
107 ldap_free_friendlymap( LDAPFriendlyMap **map )
108 {
109         LDAPFriendlyMap* pF = *map;
110
111         if ( pF == NULL )
112                 return;
113
114         while ( pF->lf_unfriendly )
115         {
116                 LDAP_FREE( pF->lf_unfriendly );
117                 LDAP_FREE( pF->lf_friendly );
118                 pF++;
119         }
120         LDAP_FREE( *map );
121         *map = NULL;
122 }