~vcs-imports/samba/main

« back to all changes in this revision

Viewing changes to source/libads/ads_struct.c

  • Committer: jerry
  • Date: 2006-07-14 21:48:39 UTC
  • Revision ID: vcs-imports@canonical.com-20060714214839-586d8c489a8fcead
gutting trunk to move to svn:externals

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* 
2
 
   Unix SMB/CIFS implementation.
3
 
   ads (active directory) utility library
4
 
   Copyright (C) Andrew Tridgell 2001
5
 
   Copyright (C) Andrew Bartlett 2001
6
 
   
7
 
   This program is free software; you can redistribute it and/or modify
8
 
   it under the terms of the GNU General Public License as published by
9
 
   the Free Software Foundation; either version 2 of the License, or
10
 
   (at your option) any later version.
11
 
   
12
 
   This program is distributed in the hope that it will be useful,
13
 
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 
   GNU General Public License for more details.
16
 
   
17
 
   You should have received a copy of the GNU General Public License
18
 
   along with this program; if not, write to the Free Software
19
 
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
 
*/
21
 
 
22
 
#include "includes.h"
23
 
 
24
 
/* return a ldap dn path from a string, given separators and field name
25
 
   caller must free
26
 
*/
27
 
char *ads_build_path(const char *realm, const char *sep, const char *field, int reverse)
28
 
{
29
 
        char *p, *r;
30
 
        int numbits = 0;
31
 
        char *ret;
32
 
        int len;
33
 
        
34
 
        r = SMB_STRDUP(realm);
35
 
 
36
 
        if (!r || !*r)
37
 
                return r;
38
 
 
39
 
        for (p=r; *p; p++)
40
 
                if (strchr(sep, *p))
41
 
                        numbits++;
42
 
 
43
 
        len = (numbits+1)*(strlen(field)+1) + strlen(r) + 1;
44
 
 
45
 
        ret = SMB_MALLOC(len);
46
 
        if (!ret)
47
 
                return NULL;
48
 
 
49
 
        strlcpy(ret,field, len);
50
 
        p=strtok(r,sep); 
51
 
        if (p) {
52
 
                strlcat(ret, p, len);
53
 
        
54
 
                while ((p=strtok(NULL,sep))) {
55
 
                        char *s;
56
 
                        if (reverse)
57
 
                                asprintf(&s, "%s%s,%s", field, p, ret);
58
 
                        else
59
 
                                asprintf(&s, "%s,%s%s", ret, field, p);
60
 
                        free(ret);
61
 
                        ret = s;
62
 
                }
63
 
        }
64
 
 
65
 
        free(r);
66
 
        return ret;
67
 
}
68
 
 
69
 
/* return a dn of the form "dc=AA,dc=BB,dc=CC" from a 
70
 
   realm of the form AA.BB.CC 
71
 
   caller must free
72
 
*/
73
 
char *ads_build_dn(const char *realm)
74
 
{
75
 
        return ads_build_path(realm, ".", "dc=", 0);
76
 
}
77
 
 
78
 
 
79
 
#ifndef LDAP_PORT
80
 
#define LDAP_PORT 389
81
 
#endif
82
 
 
83
 
/*
84
 
  initialise a ADS_STRUCT, ready for some ads_ ops
85
 
*/
86
 
ADS_STRUCT *ads_init(const char *realm, 
87
 
                     const char *workgroup,
88
 
                     const char *ldap_server)
89
 
{
90
 
        ADS_STRUCT *ads;
91
 
        
92
 
        ads = SMB_XMALLOC_P(ADS_STRUCT);
93
 
        ZERO_STRUCTP(ads);
94
 
        
95
 
        ads->server.realm = realm? SMB_STRDUP(realm) : NULL;
96
 
        ads->server.workgroup = workgroup ? SMB_STRDUP(workgroup) : NULL;
97
 
        ads->server.ldap_server = ldap_server? SMB_STRDUP(ldap_server) : NULL;
98
 
 
99
 
        /* we need to know if this is a foreign realm */
100
 
        if (realm && *realm && !strequal(lp_realm(), realm)) {
101
 
                ads->server.foreign = 1;
102
 
        }
103
 
        if (workgroup && *workgroup && !strequal(lp_workgroup(), workgroup)) {
104
 
                ads->server.foreign = 1;
105
 
        }
106
 
 
107
 
        /* the caller will own the memory by default */
108
 
        ads->is_mine = 1;
109
 
 
110
 
        return ads;
111
 
}
112
 
 
113
 
/*
114
 
  free the memory used by the ADS structure initialized with 'ads_init(...)'
115
 
*/
116
 
void ads_destroy(ADS_STRUCT **ads)
117
 
{
118
 
        if (ads && *ads) {
119
 
                BOOL is_mine;
120
 
 
121
 
                is_mine = (*ads)->is_mine;
122
 
#if HAVE_LDAP
123
 
                if ((*ads)->ld) {
124
 
                        ldap_unbind((*ads)->ld);
125
 
                }
126
 
#endif
127
 
                SAFE_FREE((*ads)->server.realm);
128
 
                SAFE_FREE((*ads)->server.workgroup);
129
 
                SAFE_FREE((*ads)->server.ldap_server);
130
 
 
131
 
                SAFE_FREE((*ads)->auth.realm);
132
 
                SAFE_FREE((*ads)->auth.password);
133
 
                SAFE_FREE((*ads)->auth.user_name);
134
 
                SAFE_FREE((*ads)->auth.kdc_server);
135
 
 
136
 
                SAFE_FREE((*ads)->config.realm);
137
 
                SAFE_FREE((*ads)->config.bind_path);
138
 
                SAFE_FREE((*ads)->config.ldap_server_name);
139
 
                
140
 
                SAFE_FREE((*ads)->schema.posix_uidnumber_attr);
141
 
                SAFE_FREE((*ads)->schema.posix_gidnumber_attr);
142
 
                SAFE_FREE((*ads)->schema.posix_shell_attr);
143
 
                SAFE_FREE((*ads)->schema.posix_homedir_attr);
144
 
                SAFE_FREE((*ads)->schema.posix_gecos_attr);
145
 
                
146
 
                ZERO_STRUCTP(*ads);
147
 
 
148
 
                if ( is_mine )
149
 
                        SAFE_FREE(*ads);
150
 
        }
151
 
}