~zulcss/samba/server-dailies-3.4

« back to all changes in this revision

Viewing changes to source4/nbt_server/wins/wins_ldb.c

  • Committer: Chuck Short
  • Date: 2010-09-28 20:38:39 UTC
  • Revision ID: zulcss@ubuntu.com-20100928203839-pgjulytsi9ue63x1
Initial version

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* 
 
2
   ldb database module
 
3
 
 
4
   Copyright (C) Stefan Metzmacher 2006
 
5
 
 
6
   This program is free software; you can redistribute it and/or modify
 
7
   it under the terms of the GNU General Public License as published by
 
8
   the Free Software Foundation; either version 3 of the License, or
 
9
   (at your option) any later version.
 
10
   
 
11
   This program is distributed in the hope that it will be useful,
 
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
   GNU General Public License for more details.
 
15
   
 
16
   You should have received a copy of the GNU General Public License
 
17
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
18
*/
 
19
 
 
20
/*
 
21
 *  Name: ldb
 
22
 *
 
23
 *  Component: ldb winsdb module
 
24
 *
 
25
 *  Description: verify winsdb records before they're written to disk
 
26
 *
 
27
 *  Author: Stefan Metzmacher
 
28
 */
 
29
 
 
30
#include "includes.h"
 
31
#include "lib/events/events.h"
 
32
#include "nbt_server/nbt_server.h"
 
33
#include "nbt_server/wins/winsdb.h"
 
34
#include "lib/ldb/include/ldb_module.h"
 
35
#include "system/network.h"
 
36
#include "lib/socket/netif.h"
 
37
#include "param/param.h"
 
38
 
 
39
static int wins_ldb_verify(struct ldb_module *module, struct ldb_request *req)
 
40
{
 
41
        struct ldb_context *ldb = ldb_module_get_ctx(module);
 
42
        struct winsdb_handle *h = talloc_get_type(ldb_get_opaque(ldb, "winsdb_handle"),
 
43
                                                  struct winsdb_handle);
 
44
        const struct ldb_message *msg;
 
45
 
 
46
        switch (req->operation) {
 
47
        case LDB_ADD:
 
48
                msg = req->op.add.message;
 
49
                break;
 
50
                
 
51
        case LDB_MODIFY:
 
52
                msg = req->op.mod.message;
 
53
                break;
 
54
 
 
55
        default:
 
56
                return ldb_next_request(module, req);
 
57
        }
 
58
 
 
59
        /* do not manipulate our control entries */
 
60
        if (ldb_dn_is_special(msg->dn)) {
 
61
                return ldb_next_request(module, req);
 
62
        }
 
63
 
 
64
        if (!h) {
 
65
                ldb_debug_set(ldb, LDB_DEBUG_FATAL, "%s", "WINS_LDB: INTERNAL ERROR: no winsdb_handle present!");
 
66
                return LDB_ERR_OTHER;
 
67
        }
 
68
 
 
69
        switch (h->caller) {
 
70
        case WINSDB_HANDLE_CALLER_NBTD:
 
71
        case WINSDB_HANDLE_CALLER_WREPL:
 
72
                /* we trust our nbt and wrepl code ... */
 
73
                return ldb_next_request(module, req);
 
74
 
 
75
        case WINSDB_HANDLE_CALLER_ADMIN:
 
76
                ldb_debug(ldb, LDB_DEBUG_WARNING, "%s\n", "WINS_LDB: TODO verify add/modify for WINSDB_HANDLE_CALLER_ADMIN");
 
77
                return ldb_next_request(module, req);
 
78
        }
 
79
 
 
80
        return LDB_ERR_OTHER;
 
81
}
 
82
 
 
83
static int wins_ldb_init(struct ldb_module *module)
 
84
{
 
85
        struct ldb_context *ldb = ldb_module_get_ctx(module);
 
86
        struct winsdb_handle *h;
 
87
        const char *owner;
 
88
        struct loadparm_context *lp_ctx = ldb_get_opaque(ldb, "loadparm");
 
89
 
 
90
        ldb_module_set_private(module, NULL);
 
91
 
 
92
        owner = lp_parm_string(lp_ctx, NULL, "winsdb", "local_owner");
 
93
        if (!owner) {
 
94
                struct interface *ifaces;
 
95
                load_interfaces(module, lp_interfaces(lp_ctx), &ifaces);
 
96
                owner = iface_n_ip(ifaces, 0);
 
97
                if (!owner) {
 
98
                        owner = "0.0.0.0";
 
99
                }
 
100
        }
 
101
 
 
102
        h = talloc_zero(module, struct winsdb_handle);
 
103
        if (!h) goto failed;
 
104
        h->ldb          = ldb;
 
105
        h->caller       = WINSDB_HANDLE_CALLER_ADMIN;
 
106
        h->local_owner  = talloc_strdup(h, owner);
 
107
        if (!h->local_owner) goto failed;
 
108
 
 
109
        return ldb_set_opaque(ldb, "winsdb_handle", h);
 
110
 
 
111
failed:
 
112
        talloc_free(h);
 
113
        return LDB_ERR_OTHER;
 
114
}
 
115
 
 
116
_PUBLIC_ const struct ldb_module_ops ldb_wins_ldb_module_ops = {
 
117
        .name          = "wins_ldb",
 
118
        .add           = wins_ldb_verify,
 
119
        .modify        = wins_ldb_verify,
 
120
        .init_context  = wins_ldb_init
 
121
};