Ignore:
Timestamp:
Nov 24, 2016, 1:14:11 PM (9 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update vendor to version 4.4.3

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source3/lib/serverid.c

    r860 r988  
    2222#include "serverid.h"
    2323#include "util_tdb.h"
    24 #include "dbwrap.h"
    25 #include "lib/util/tdb_wrap.h"
     24#include "dbwrap/dbwrap.h"
     25#include "dbwrap/dbwrap_open.h"
     26#include "lib/tdb_wrap/tdb_wrap.h"
     27#include "lib/param/param.h"
     28#include "ctdbd_conn.h"
     29#include "messages.h"
     30#include "lib/messages_dgm.h"
    2631
    2732struct serverid_key {
    2833        pid_t pid;
     34        uint32_t task_id;
    2935        uint32_t vnn;
    3036};
     
    3541};
    3642
    37 static struct db_context *db_ptr = NULL;
    38 
    39 static struct db_context *serverid_init(TALLOC_CTX *mem_ctx,
    40                                         bool readonly)
    41 {
    42         db_ptr = db_open(mem_ctx, lock_path("serverid.tdb"),
    43                          0, TDB_DEFAULT|TDB_CLEAR_IF_FIRST|TDB_INCOMPATIBLE_HASH,
    44                          readonly ? O_RDONLY : O_RDWR | O_CREAT,
    45                          0644);
    46         return db_ptr;
     43static struct db_context *serverid_db(void)
     44{
     45        static struct db_context *db;
     46        char *db_path;
     47
     48        if (db != NULL) {
     49                return db;
     50        }
     51
     52        db_path = lock_path("serverid.tdb");
     53        if (db_path == NULL) {
     54                return NULL;
     55        }
     56
     57        db = db_open(NULL, db_path, 0,
     58                     TDB_DEFAULT|TDB_CLEAR_IF_FIRST|TDB_INCOMPATIBLE_HASH,
     59                     O_RDWR|O_CREAT, 0644, DBWRAP_LOCK_ORDER_2,
     60                     DBWRAP_FLAG_NONE);
     61        TALLOC_FREE(db_path);
     62        return db;
    4763}
    4864
    4965bool serverid_parent_init(TALLOC_CTX *mem_ctx)
    5066{
    51         /*
    52          * Open the tdb in the parent process (smbd) so that our
    53          * CLEAR_IF_FIRST optimization in tdb_reopen_all can properly
    54          * work.
    55          */
    56 
    57         if (serverid_init(mem_ctx, false) == NULL) {
     67        struct db_context *db;
     68
     69        db = serverid_db();
     70        if (db == NULL) {
    5871                DEBUG(1, ("could not open serverid.tdb: %s\n",
    5972                          strerror(errno)));
     
    6477}
    6578
    66 bool serverid_init_readonly(TALLOC_CTX *mem_ctx)
    67 {
    68         if (serverid_init(mem_ctx, true) == NULL) {
    69                 DEBUG(1, ("could not open serverid.tdb: %s\n",
    70                           strerror(errno)));
    71                 return false;
    72         }
    73 
    74         return true;
    75 }
    76 
    77 static struct db_context *serverid_db(void)
    78 {
    79         if (db_ptr != NULL) {
    80                 return db_ptr;
    81         }
    82 
    83         return serverid_init(NULL, false);
    84 }
    85 
    8679static void serverid_fill_key(const struct server_id *id,
    8780                              struct serverid_key *key)
     
    8982        ZERO_STRUCTP(key);
    9083        key->pid = id->pid;
     84        key->task_id = id->task_id;
    9185        key->vnn = id->vnn;
    9286}
     
    110104        tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key));
    111105
    112         rec = db->fetch_locked(db, talloc_tos(), tdbkey);
     106        rec = dbwrap_fetch_locked(db, talloc_tos(), tdbkey);
    113107        if (rec == NULL) {
    114108                DEBUG(1, ("Could not fetch_lock serverid.tdb record\n"));
     
    121115
    122116        tdbdata = make_tdb_data((uint8_t *)&data, sizeof(data));
    123         status = rec->store(rec, tdbdata, 0);
     117        status = dbwrap_record_store(rec, tdbdata, 0);
    124118        if (!NT_STATUS_IS_OK(status)) {
    125119                DEBUG(1, ("Storing serverid.tdb record failed: %s\n",
     
    127121                goto done;
    128122        }
    129         ret = true;
    130 done:
    131         TALLOC_FREE(rec);
    132         return ret;
    133 }
    134 
    135 bool serverid_register_msg_flags(const struct server_id id, bool do_reg,
    136                                  uint32_t msg_flags)
    137 {
    138         struct db_context *db;
    139         struct serverid_key key;
    140         struct serverid_data *data;
    141         struct db_record *rec;
    142         TDB_DATA tdbkey;
    143         NTSTATUS status;
    144         bool ret = false;
    145 
    146         db = serverid_db();
    147         if (db == NULL) {
    148                 return false;
    149         }
    150 
    151         serverid_fill_key(&id, &key);
    152         tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key));
    153 
    154         rec = db->fetch_locked(db, talloc_tos(), tdbkey);
    155         if (rec == NULL) {
    156                 DEBUG(1, ("Could not fetch_lock serverid.tdb record\n"));
    157                 return false;
    158         }
    159 
    160         if (rec->value.dsize != sizeof(struct serverid_data)) {
    161                 DEBUG(1, ("serverid record has unexpected size %d "
    162                           "(wanted %d)\n", (int)rec->value.dsize,
    163                           (int)sizeof(struct serverid_data)));
    164                 goto done;
    165         }
    166 
    167         data = (struct serverid_data *)rec->value.dptr;
    168 
    169         if (do_reg) {
    170                 data->msg_flags |= msg_flags;
    171         } else {
    172                 data->msg_flags &= ~msg_flags;
    173         }
    174 
    175         status = rec->store(rec, rec->value, 0);
    176         if (!NT_STATUS_IS_OK(status)) {
    177                 DEBUG(1, ("Storing serverid.tdb record failed: %s\n",
    178                           nt_errstr(status)));
    179                 goto done;
    180         }
     123
     124        if (lp_clustering()) {
     125                register_with_ctdbd(messaging_ctdbd_connection(), id.unique_id,
     126                                    NULL, NULL);
     127        }
     128
    181129        ret = true;
    182130done:
     
    202150        tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key));
    203151
    204         rec = db->fetch_locked(db, talloc_tos(), tdbkey);
     152        rec = dbwrap_fetch_locked(db, talloc_tos(), tdbkey);
    205153        if (rec == NULL) {
    206154                DEBUG(1, ("Could not fetch_lock serverid.tdb record\n"));
     
    208156        }
    209157
    210         status = rec->delete_rec(rec);
     158        status = dbwrap_record_delete(rec);
    211159        if (!NT_STATUS_IS_OK(status)) {
    212160                DEBUG(1, ("Deleting serverid.tdb record failed: %s\n",
     
    220168}
    221169
    222 struct serverid_exists_state {
    223         const struct server_id *id;
    224         bool exists;
    225 };
    226 
    227 static int server_exists_parse(TDB_DATA key, TDB_DATA data, void *priv)
    228 {
    229         struct serverid_exists_state *state =
    230                 (struct serverid_exists_state *)priv;
    231 
    232         if (data.dsize != sizeof(struct serverid_data)) {
    233                 return -1;
    234         }
    235 
    236         /*
    237          * Use memcmp, not direct compare. data.dptr might not be
    238          * aligned.
    239          */
    240         state->exists = (memcmp(&state->id->unique_id, data.dptr,
    241                                 sizeof(state->id->unique_id)) == 0);
    242         return 0;
    243 }
    244 
    245 bool serverid_exists(const struct server_id *id)
    246 {
    247         struct db_context *db;
    248         struct serverid_exists_state state;
    249         struct serverid_key key;
    250         TDB_DATA tdbkey;
    251 
    252         if (procid_is_me(id)) {
    253                 return true;
    254         }
    255 
    256         if (!process_exists(*id)) {
     170static bool serverid_exists_local(const struct server_id *id)
     171{
     172        bool exists = process_exists_by_pid(id->pid);
     173        uint64_t unique;
     174        int ret;
     175
     176        if (!exists) {
    257177                return false;
    258178        }
     
    262182        }
    263183
    264         db = serverid_db();
    265         if (db == NULL) {
    266                 return false;
    267         }
    268 
    269         serverid_fill_key(id, &key);
    270         tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key));
    271 
    272         state.id = id;
    273         state.exists = false;
    274 
    275         if (db->parse_record(db, tdbkey, server_exists_parse, &state) == -1) {
    276                 return false;
    277         }
    278         return state.exists;
     184        ret = messaging_dgm_get_unique(id->pid, &unique);
     185        if (ret != 0) {
     186                return false;
     187        }
     188
     189        return (unique == id->unique_id);
     190}
     191
     192bool serverid_exists(const struct server_id *id)
     193{
     194        if (procid_is_local(id)) {
     195                return serverid_exists_local(id);
     196        }
     197
     198        if (lp_clustering()) {
     199                return ctdbd_process_exists(messaging_ctdbd_connection(),
     200                                            id->vnn, id->pid);
     201        }
     202
     203        return false;
    279204}
    280205
     
    284209        struct serverid_key key;
    285210        struct serverid_data data;
    286 
    287         if (rec->key.dsize != sizeof(key)) {
     211        TDB_DATA tdbkey;
     212        TDB_DATA tdbdata;
     213
     214        tdbkey = dbwrap_record_get_key(rec);
     215        tdbdata = dbwrap_record_get_value(rec);
     216
     217        if (tdbkey.dsize != sizeof(key)) {
    288218                DEBUG(1, ("Found invalid key length %d in serverid.tdb\n",
    289                           (int)rec->key.dsize));
    290                 return false;
    291         }
    292         if (rec->value.dsize != sizeof(data)) {
     219                          (int)tdbkey.dsize));
     220                return false;
     221        }
     222        if (tdbdata.dsize != sizeof(data)) {
    293223                DEBUG(1, ("Found invalid value length %d in serverid.tdb\n",
    294                           (int)rec->value.dsize));
    295                 return false;
    296         }
    297 
    298         memcpy(&key, rec->key.dptr, sizeof(key));
    299         memcpy(&data, rec->value.dptr, sizeof(data));
     224                          (int)tdbdata.dsize));
     225                return false;
     226        }
     227
     228        memcpy(&key, tdbkey.dptr, sizeof(key));
     229        memcpy(&data, tdbdata.dptr, sizeof(data));
    300230
    301231        id->pid = key.pid;
     232        id->task_id = key.task_id;
    302233        id->vnn = key.vnn;
    303234        id->unique_id = data.unique_id;
     
    331262        struct db_context *db;
    332263        struct serverid_traverse_read_state state;
     264        NTSTATUS status;
    333265
    334266        db = serverid_db();
     
    338270        state.fn = fn;
    339271        state.private_data = private_data;
    340         return db->traverse_read(db, serverid_traverse_read_fn, &state);
     272
     273        status = dbwrap_traverse_read(db, serverid_traverse_read_fn, &state,
     274                                      NULL);
     275        return NT_STATUS_IS_OK(status);
    341276}
    342277
     
    367302        struct db_context *db;
    368303        struct serverid_traverse_state state;
     304        NTSTATUS status;
    369305
    370306        db = serverid_db();
     
    374310        state.fn = fn;
    375311        state.private_data = private_data;
    376         return db->traverse(db, serverid_traverse_fn, &state);
    377 }
    378 
    379 uint64_t serverid_get_random_unique_id(void)
    380 {
    381         uint64_t unique_id = SERVERID_UNIQUE_ID_NOT_TO_VERIFY;
    382 
    383         while (unique_id == SERVERID_UNIQUE_ID_NOT_TO_VERIFY) {
    384                 generate_random_buffer((uint8_t *)&unique_id,
    385                                         sizeof(unique_id));
    386         }
    387 
    388         return unique_id;
    389 }
     312
     313        status = dbwrap_traverse(db, serverid_traverse_fn, &state, NULL);
     314        return NT_STATUS_IS_OK(status);
     315}
Note: See TracChangeset for help on using the changeset viewer.