]> git.sur5r.net Git - openldap/blob - servers/slapd/suffixalias.c
More changes from -devel.
[openldap] / servers / slapd / suffixalias.c
1 /*
2  * Copyright (c) 1998 Will Ballantyne, ITSD, Government of BC
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that this notice is preserved and that due credit is given
7  * to ITSD, Government of BC. The name of ITSD
8  * may not be used to endorse or promote products derived from this
9  * software without specific prior written permission. This software
10  * is provided ``as is'' without express or implied warranty.
11  */
12
13 #include "portable.h"
14
15 #include <stdio.h>
16 #include <string.h>
17 #include <ac/socket.h>          /* Get struct sockaddr for slap.h */
18 #include "slap.h"
19
20 /* 
21  * given a dn (or root part), return an aliased dn if any of the 
22  * alias suffixes match
23  */
24 char *suffixAlias ( dn, op, be )
25         char *dn;
26         Operation *op;
27         Backend *be;
28 {
29         int     i, dnLength;
30
31         dnLength = strlen ( dn );
32         op->o_suffix = NULL;
33         op->o_suffixAliased = NULL;
34         for ( i = 0;
35               be->be_suffixAlias != NULL && be->be_suffixAlias[i] != NULL;
36               i += 2) {
37                 int aliasLength = strlen (be->be_suffixAlias[i]);
38                 if (aliasLength > dnLength) {
39                         continue;
40                 }
41
42                 if (!strcasecmp(be->be_suffixAlias[i], 
43                                 dn + (dnLength - aliasLength))) {
44                         char *oldDN = dn;
45                         op->o_suffixAliased = strdup ( be->be_suffixAlias[i] );
46                         dn = ch_malloc ( (dnLength - aliasLength) +
47                                           strlen (be->be_suffixAlias[ i+1 ]) + 1);
48                         strncpy (dn, oldDN, dnLength - aliasLength);
49                         strcpy  (dn + (dnLength - aliasLength), be->be_suffixAlias[ i+1 ]);
50                         op->o_suffix = strdup (dn);
51                         Debug( LDAP_DEBUG_ARGS, "ALIAS: converted %s to %s", oldDN, dn, 0);
52                         free (oldDN);
53                         break;
54                 }
55         }
56         return dn;
57 }