s3: Use autogenerated open_files.idl
authorVolker Lendecke <vl@samba.org>
Thu, 24 Nov 2011 13:11:28 +0000 (14:11 +0100)
committerJeremy Allison <jra@samba.org>
Fri, 2 Dec 2011 21:43:05 +0000 (22:43 +0100)
15 files changed:
source3/Makefile.in
source3/include/smb.h
source3/librpc/idl/wscript_build
source3/librpc/wscript_build
source3/libsmb/smb_share_modes.c
source3/locking/locking.c
source3/rpc_server/srvsvc/srv_srvsvc_nt.c
source3/smbd/close.c
source3/smbd/open.c
source3/smbd/oplock.c
source3/smbd/reply.c
source3/smbd/trans2.c
source3/utils/status.c
source3/web/statuspage.c
source3/wscript_build

index 7ff08c631385010e991f7cf6ab2407f929ff7f58..62504fd941a129d3a64c8c960e6e1431f3d73e3c 100644 (file)
@@ -793,7 +793,8 @@ RPC_SERVER_OBJ = $(RPC_LSARPC_OBJ) $(RPC_WINREG_OBJ) $(RPC_INITSHUTDOWN_OBJ) \
 
 RPC_CLIENT_SCHANNEL_OBJ = rpc_client/cli_pipe_schannel.o
 
-LOCKING_OBJ = locking/locking.o locking/brlock.o locking/posix.o
+LOCKING_OBJ = locking/locking.o locking/brlock.o locking/posix.o \
+               librpc/gen_ndr/ndr_open_files.o
 
 PRIVILEGES_BASIC_OBJ = ../libcli/security/privileges.o
 
index b46f49881ef6cfbac6fa87485591ef9cc6175f05..d3a27e9f73ac36ae87c1e8d75c64942e72da0187 100644 (file)
@@ -545,25 +545,6 @@ struct pending_message_list {
 
 #include "librpc/gen_ndr/server_id.h"
 
-/* struct returned by get_share_modes */
-struct share_mode_entry {
-       struct server_id pid;
-       uint64_t op_mid;        /* For compatibility with SMB2 opens. */
-       uint16 op_type;
-       uint32 access_mask;             /* NTCreateX access bits (FILE_READ_DATA etc.) */
-       uint32 share_access;            /* NTCreateX share constants (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE). */
-       uint32 private_options; /* NT Create options, but we only look at
-                                * NTCREATEX_OPTIONS_PRIVATE_DENY_DOS and
-                                * NTCREATEX_OPTIONS_PRIVATE_DENY_FCB for
-                                * smbstatus and swat */
-       struct timeval time;
-       struct file_id id;
-       unsigned long share_file_id;
-       uint32 uid;             /* uid of file opener. */
-       uint16 flags;           /* See SHARE_MODE_XX above. */
-       uint32_t name_hash;             /* Jenkins hash of full pathname. */
-};
-
 /* oplock break message definition - linearization of share_mode_entry.
 
 Offset  Data                   length.
@@ -605,56 +586,6 @@ Offset  Data                       length.
 #define OP_BREAK_MSG_VNN_OFFSET 72
 #define MSG_SMB_SHARE_MODE_ENTRY_SIZE 76
 
-struct delete_token {
-       uint32_t name_hash;
-       struct security_unix_token *delete_token;
-};
-
-struct share_mode_lock {
-       const char *servicepath; /* canonicalized. */
-       const char *base_name;
-       const char *stream_name;
-       struct file_id id;
-       int num_share_modes;
-       struct share_mode_entry *share_modes;
-       int num_delete_tokens;
-       struct delete_token *delete_tokens;
-       struct timespec old_write_time;
-       struct timespec changed_write_time;
-       bool fresh;
-       bool modified;
-       struct db_record *record;
-};
-
-/*
- * Internal structure of locking.tdb share mode db.
- * Used by locking.c and libsmbsharemodes.c
- */
-
-struct locking_data {
-       union {
-               struct {
-                       int num_share_mode_entries;
-                       struct timespec old_write_time;
-                       struct timespec changed_write_time;
-                       uint32 num_delete_token_entries;
-               } s;
-               struct share_mode_entry dummy; /* Needed for alignment. */
-       } u;
-       /* The following four entries are implicit
-
-          (1) struct share_mode_entry modes[num_share_mode_entries];
-
-          (2) A num_delete_token_entries of structs {
-               uint32_t len_delete_token;
-               char unix_token[len_delete_token] (divisible by 4).
-          };
-
-          (3) char share_name[];
-          (4) char file_name[];
-        */
-};
-
 #define NT_HASH_LEN 16
 #define LM_HASH_LEN 16
 
index 3e07542320db2d952db0b14e5c2727804352dc26..949eecd7dd922cec4b2916a1e479909adce3a2fa 100644 (file)
@@ -5,7 +5,7 @@ import os
 topinclude=os.path.join(bld.srcnode.abspath(), 'librpc/idl')
 
 bld.SAMBA_PIDL_LIST('PIDL',
-                    '''messaging.idl libnetapi.idl
+                    '''messaging.idl libnetapi.idl open_files.idl
                        perfcount.idl secrets.idl libnet_join.idl''',
                     options='--includedir=%s --header --ndr-parser' % topinclude,
                     output_dir='../gen_ndr')
index a4af551e7f25859e38d9f716034442cb32c06a49..8aa016135b7c1803e1c4355ad88650d979f6208a 100644 (file)
@@ -15,6 +15,11 @@ bld.SAMBA3_SUBSYSTEM('NDR_MESSAGING',
        public_deps='ndr NDR_SERVER_ID'
        )
 
+bld.SAMBA3_SUBSYSTEM('NDR_OPEN_FILES',
+       source='gen_ndr/ndr_open_files.c',
+       public_deps='ndr NDR_SERVER_ID NDR_FILE_ID NDR_SECURITY'
+       )
+
 bld.SAMBA3_SUBSYSTEM('NDR_SECRETS',
        source='gen_ndr/ndr_secrets.c',
        public_deps='ndr'
index 42640e0cea46a7ed043ee0e90a21dacdbee86da4..f6f8bf9a1bee615946ea7a391967ee8f8ff53244 100644 (file)
@@ -29,6 +29,7 @@
 #include "system/filesys.h"
 #include "smb_share_modes.h"
 #include "tdb_compat.h"
+#include "librpc/gen_ndr/open_files.h"
 #include <ccan/hash/hash.h>
 
 /* Database context handle. */
@@ -41,6 +42,35 @@ struct smbdb_ctx {
 #undef malloc
 #endif
 
+/*
+ * Internal structure of locking.tdb share mode db.
+ * Used by locking.c and libsmbsharemodes.c
+ */
+
+struct locking_data {
+       union {
+               struct {
+                       int num_share_mode_entries;
+                       struct timespec old_write_time;
+                       struct timespec changed_write_time;
+                       uint32 num_delete_token_entries;
+               } s;
+               struct share_mode_entry dummy; /* Needed for alignment. */
+       } u;
+       /* The following four entries are implicit
+
+          (1) struct share_mode_entry modes[num_share_mode_entries];
+
+          (2) A num_delete_token_entries of structs {
+               uint32_t len_delete_token;
+               char unix_token[len_delete_token] (divisible by 4).
+          };
+
+          (3) char share_name[];
+          (4) char file_name[];
+        */
+};
+
 int smb_create_share_mode_entry_ex(struct smbdb_ctx *db_ctx, uint64_t dev,
                                uint64_t ino, uint64_t extid,
                                const struct smb_share_mode_entry *new_entry,
index 611b2d2990144837b8b580d484f46ccf2900eea6..caa2b5aef6417418ed87e576b854f169a8e809f0 100644 (file)
@@ -45,6 +45,7 @@
 #include "serverid.h"
 #include "messages.h"
 #include "util_tdb.h"
+#include "../librpc/gen_ndr/ndr_open_files.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_LOCKING
@@ -509,222 +510,36 @@ char *share_mode_str(TALLOC_CTX *ctx, int num, const struct share_mode_entry *e)
                 (unsigned int)e->name_hash);
 }
 
-/*******************************************************************
- Print out a share mode table.
-********************************************************************/
-
-static void print_share_mode_table(struct locking_data *data)
-{
-       int num_share_modes = data->u.s.num_share_mode_entries;
-       struct share_mode_entry *shares =
-               (struct share_mode_entry *)(data + 1);
-       int i;
-
-       for (i = 0; i < num_share_modes; i++) {
-               struct share_mode_entry entry;
-               char *str;
-
-               /*
-                * We need to memcpy the entry here due to alignment
-                * restrictions that are not met when directly accessing
-                * shares[i]
-                */
-
-               memcpy(&entry, &shares[i], sizeof(struct share_mode_entry));
-               str = share_mode_str(talloc_tos(), i, &entry);
-
-               DEBUG(10,("print_share_mode_table: %s\n", str ? str : ""));
-               TALLOC_FREE(str);
-       }
-}
-
-static int parse_delete_tokens_list(struct share_mode_lock *lck,
-               struct locking_data *pdata,
-               const TDB_DATA dbuf)
-{
-       uint8_t *p = dbuf.dptr + sizeof(struct locking_data) +
-                       (lck->num_share_modes *
-                       sizeof(struct share_mode_entry));
-       uint8_t *end_ptr = dbuf.dptr + (dbuf.dsize - 2);
-       int delete_tokens_size = 0;
-       int i;
-
-       lck->num_delete_tokens = 0;
-       lck->delete_tokens = NULL;
-
-       for (i = 0; i < pdata->u.s.num_delete_token_entries; i++) {
-               uint32_t token_len;
-               struct delete_token *pdt;
-
-               if (end_ptr - p < (sizeof(uint32_t) + sizeof(uint32_t) +
-                                       sizeof(uid_t) + sizeof(gid_t))) {
-                       DEBUG(0,("parse_delete_tokens_list: "
-                               "corrupt token list (%u)",
-                               (unsigned int)(end_ptr - p)));
-                       smb_panic("corrupt token list");
-                       return -1;
-               }
-
-               memcpy(&token_len, p, sizeof(token_len));
-               delete_tokens_size += token_len;
-
-               if (p + token_len > end_ptr || token_len < sizeof(token_len) +
-                                               sizeof(pdt->name_hash) +
-                                               sizeof(uid_t) +
-                                               sizeof(gid_t)) {
-                       DEBUG(0,("parse_delete_tokens_list: "
-                               "invalid token length (%u)\n",
-                               (unsigned int)token_len ));
-                       smb_panic("invalid token length");
-                       return -1;
-               }
-
-               p += sizeof(token_len);
-
-               lck->delete_tokens = talloc_realloc(
-                       lck, lck->delete_tokens, struct delete_token,
-                       lck->num_delete_tokens+1);
-
-               if (lck->delete_tokens == NULL) {
-                       DEBUG(0, ("parse_delete_tokens_list: talloc failed"));
-                       return -1;
-               }
-               pdt = &lck->delete_tokens[lck->num_delete_tokens];
-
-               /* Copy out the name_hash. */
-               memcpy(&pdt->name_hash, p, sizeof(pdt->name_hash));
-               p += sizeof(pdt->name_hash);
-
-               pdt->delete_token = talloc_zero(
-                       lck->delete_tokens, struct security_unix_token);
-               if (pdt->delete_token == NULL) {
-                       DEBUG(0,("parse_delete_tokens_list: talloc failed"));
-                       return -1;
-               }
-
-               /* Copy out the uid and gid. */
-               memcpy(&pdt->delete_token->uid, p, sizeof(uid_t));
-               p += sizeof(uid_t);
-               memcpy(&pdt->delete_token->gid, p, sizeof(gid_t));
-               p += sizeof(gid_t);
-
-               token_len -= (sizeof(token_len) + sizeof(pdt->name_hash) +
-                               sizeof(uid_t) + sizeof(gid_t));
-
-               /* Any supplementary groups ? */
-               if (token_len) {
-                       int j;
-
-                       if (token_len % sizeof(gid_t) != 0) {
-                               DEBUG(0,("parse_delete_tokens_list: "
-                                       "corrupt group list (%u)",
-                                       (unsigned int)(token_len % sizeof(gid_t)) ));
-                               smb_panic("corrupt group list");
-                               return -1;
-                       }
-
-                       pdt->delete_token->ngroups = token_len / sizeof(gid_t);
-                       pdt->delete_token->groups = talloc_array(
-                               pdt->delete_token, gid_t,
-                               pdt->delete_token->ngroups);
-                       if (pdt->delete_token->groups == NULL) {
-                               DEBUG(0,("parse_delete_tokens_list: talloc failed"));
-                               return -1;
-                       }
-
-                       for (j = 0; j < pdt->delete_token->ngroups; j++) {
-                               memcpy(&pdt->delete_token->groups[j], p,
-                                      sizeof(gid_t));
-                               p += sizeof(gid_t);
-                       }
-               }
-               lck->num_delete_tokens += 1;
-       }
-
-       return delete_tokens_size;
-}
-
 /*******************************************************************
  Get all share mode entries for a dev/inode pair.
 ********************************************************************/
 
 static bool parse_share_modes(const TDB_DATA dbuf, struct share_mode_lock *lck)
 {
-       struct locking_data data;
-       int delete_tokens_size;
        int i;
        struct server_id *pids;
        bool *pid_exists;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
 
-       if (dbuf.dsize < sizeof(struct locking_data)) {
-               smb_panic("parse_share_modes: buffer too short");
-       }
-
-       memcpy(&data, dbuf.dptr, sizeof(data));
-
-       lck->old_write_time = data.u.s.old_write_time;
-       lck->changed_write_time = data.u.s.changed_write_time;
-       lck->num_share_modes = data.u.s.num_share_mode_entries;
+       blob.data = dbuf.dptr;
+       blob.length = dbuf.dsize;
 
-       DEBUG(10, ("parse_share_modes: owrt: %s, "
-                  "cwrt: %s, ntok: %u, num_share_modes: %d\n",
-                  timestring(talloc_tos(),
-                             convert_timespec_to_time_t(lck->old_write_time)),
-                  timestring(talloc_tos(),
-                             convert_timespec_to_time_t(
-                                     lck->changed_write_time)),
-                  (unsigned int)data.u.s.num_delete_token_entries,
-                  lck->num_share_modes));
-
-       if ((lck->num_share_modes < 0) || (lck->num_share_modes > 1000000)) {
-               DEBUG(0, ("invalid number of share modes: %d\n",
-                         lck->num_share_modes));
-               smb_panic("parse_share_modes: invalid number of share modes");
+       ndr_err = ndr_pull_struct_blob(
+               &blob, lck, lck,
+               (ndr_pull_flags_fn_t)ndr_pull_share_mode_lock);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               DEBUG(1, ("ndr_pull_share_mode_lock failed\n"));
+               return false;
        }
 
-       lck->share_modes = NULL;
-
-       if (lck->num_share_modes != 0) {
-
-               if (dbuf.dsize < (sizeof(struct locking_data) +
-                                 (lck->num_share_modes *
-                                  sizeof(struct share_mode_entry)))) {
-                       smb_panic("parse_share_modes: buffer too short");
-               }
-
-               lck->share_modes = (struct share_mode_entry *)
-                       talloc_memdup(lck,
-                                     dbuf.dptr+sizeof(struct locking_data),
-                                     lck->num_share_modes *
-                                     sizeof(struct share_mode_entry));
-
-               if (lck->share_modes == NULL) {
-                       smb_panic("parse_share_modes: talloc failed");
-               }
-       }
+       lck->modified = false;
 
-       /* Get any delete tokens. */
-       delete_tokens_size = parse_delete_tokens_list(lck, &data, dbuf);
-       if (delete_tokens_size < 0) {
-               smb_panic("parse_share_modes: parse_delete_tokens_list failed");
+       if (DEBUGLEVEL >= 10) {
+               DEBUG(10, ("parse_share_modes:\n"));
+               NDR_PRINT_DEBUG(share_mode_lock, lck);
        }
 
-       /* Save off the associated service path and filename. */
-       lck->servicepath = (const char *)dbuf.dptr + sizeof(struct locking_data) +
-               (lck->num_share_modes * sizeof(struct share_mode_entry)) +
-               delete_tokens_size;
-
-       lck->base_name = (const char *)dbuf.dptr + sizeof(struct locking_data) +
-               (lck->num_share_modes * sizeof(struct share_mode_entry)) +
-               delete_tokens_size +
-               strlen(lck->servicepath) + 1;
-
-       lck->stream_name = (const char *)dbuf.dptr + sizeof(struct locking_data) +
-               (lck->num_share_modes * sizeof(struct share_mode_entry)) +
-               delete_tokens_size +
-               strlen(lck->servicepath) + 1 +
-               strlen(lck->base_name) + 1;
-
        /*
         * Ensure that each entry has a real process attached.
         */
@@ -749,19 +564,10 @@ static bool parse_share_modes(const TDB_DATA dbuf, struct share_mode_lock *lck)
 
        for (i = 0; i < lck->num_share_modes; i++) {
                struct share_mode_entry *entry_p = &lck->share_modes[i];
-               char *str = NULL;
-               if (DEBUGLEVEL >= 10) {
-                       str = share_mode_str(talloc_tos(), i, entry_p);
-               }
-               DEBUG(10,("parse_share_modes: %s\n",
-                       str ? str : ""));
                if (!pid_exists[i]) {
-                       DEBUG(10,("parse_share_modes: deleted %s\n",
-                               str ? str : ""));
                        entry_p->op_type = UNUSED_SHARE_MODE_ENTRY;
                        lck->modified = True;
                }
-               TALLOC_FREE(str);
        }
        TALLOC_FREE(pid_exists);
        TALLOC_FREE(pids);
@@ -769,125 +575,35 @@ static bool parse_share_modes(const TDB_DATA dbuf, struct share_mode_lock *lck)
        return True;
 }
 
-static TDB_DATA unparse_share_modes(const struct share_mode_lock *lck)
+static TDB_DATA unparse_share_modes(struct share_mode_lock *lck)
 {
-       TDB_DATA result;
-       int num_valid = 0;
-       int i;
-       struct locking_data *data;
-       ssize_t offset;
-       ssize_t sp_len, bn_len, sn_len;
-       uint32_t delete_tokens_size = 0;
+       DATA_BLOB blob;
+       enum ndr_err_code ndr_err;
+       uint32_t i;
 
-       result.dptr = NULL;
-       result.dsize = 0;
+       if (DEBUGLEVEL >= 10) {
+               DEBUG(10, ("unparse_share_modes:\n"));
+               NDR_PRINT_DEBUG(share_mode_lock, lck);
+       }
 
        for (i=0; i<lck->num_share_modes; i++) {
                if (!is_unused_share_mode_entry(&lck->share_modes[i])) {
-                       num_valid += 1;
+                       break;
                }
        }
-
-       if (num_valid == 0) {
-               return result;
-       }
-
-       sp_len = strlen(lck->servicepath);
-       bn_len = strlen(lck->base_name);
-       sn_len = lck->stream_name != NULL ? strlen(lck->stream_name) : 0;
-
-       for (i=0; i<lck->num_delete_tokens; i++) {
-               struct delete_token *pdt = &lck->delete_tokens[i];
-               delete_tokens_size +=
-                       (sizeof(uint32_t) +
-                        sizeof(uint32_t) +
-                        sizeof(uid_t) +
-                        sizeof(gid_t) +
-                        pdt->delete_token->ngroups*sizeof(gid_t));
-       }
-
-       result.dsize = sizeof(*data) +
-               lck->num_share_modes * sizeof(struct share_mode_entry) +
-               delete_tokens_size +
-               sp_len + 1 +
-               bn_len + 1 +
-               sn_len + 1;
-       result.dptr = talloc_array(lck, uint8, result.dsize);
-
-       if (result.dptr == NULL) {
-               smb_panic("talloc failed");
-       }
-
-       data = (struct locking_data *)result.dptr;
-       ZERO_STRUCTP(data);
-       data->u.s.num_share_mode_entries = lck->num_share_modes;
-       data->u.s.old_write_time = lck->old_write_time;
-       data->u.s.changed_write_time = lck->changed_write_time;
-       data->u.s.num_delete_token_entries = lck->num_delete_tokens;
-
-       DEBUG(10,("unparse_share_modes: owrt: %s cwrt: %s, ntok: %u, "
-                 "num: %d\n",
-                 timestring(talloc_tos(),
-                            convert_timespec_to_time_t(lck->old_write_time)),
-                 timestring(talloc_tos(),
-                            convert_timespec_to_time_t(
-                                    lck->changed_write_time)),
-                 (unsigned int)data->u.s.num_delete_token_entries,
-                 data->u.s.num_share_mode_entries));
-
-       memcpy(result.dptr + sizeof(*data), lck->share_modes,
-              sizeof(struct share_mode_entry)*lck->num_share_modes);
-       offset = sizeof(*data) +
-               sizeof(struct share_mode_entry)*lck->num_share_modes;
-
-       /* Store any delete on close tokens. */
-
-       for (i=0; i<lck->num_delete_tokens; i++) {
-               struct delete_token *pdtl = &lck->delete_tokens[i];
-               struct security_unix_token *pdt = pdtl->delete_token;
-               uint32_t token_size = sizeof(uint32_t) +
-                                       sizeof(uint32_t) +
-                                       sizeof(uid_t) +
-                                       sizeof(gid_t) +
-                                       (pdt->ngroups * sizeof(gid_t));
-               uint8_t *p = result.dptr + offset;
-
-               memcpy(p, &token_size, sizeof(uint32_t));
-               p += sizeof(uint32_t);
-
-               memcpy(p, &pdtl->name_hash, sizeof(uint32_t));
-               p += sizeof(uint32_t);
-
-               memcpy(p, &pdt->uid, sizeof(uid_t));
-               p += sizeof(uid_t);
-
-               memcpy(p, &pdt->gid, sizeof(gid_t));
-               p += sizeof(gid_t);
-
-               for (i = 0; i < pdt->ngroups; i++) {
-                       memcpy(p, &pdt->groups[i], sizeof(gid_t));
-                       p += sizeof(gid_t);
-               }
-               offset += token_size;
+       if (i == lck->num_share_modes) {
+               DEBUG(10, ("No used share mode found\n"));
+               return make_tdb_data(NULL, 0);
        }
 
-       strlcpy((char *)result.dptr + offset,
-               lck->servicepath ? lck->servicepath : "",
-               result.dsize - offset);
-       offset += sp_len + 1;
-       strlcpy((char *)result.dptr + offset,
-               lck->base_name ? lck->base_name : "",
-               result.dsize - offset);
-       offset += bn_len + 1;
-       strlcpy((char *)result.dptr + offset,
-               lck->stream_name ? lck->stream_name : "",
-               result.dsize - offset);
-
-       if (DEBUGLEVEL >= 10) {
-               print_share_mode_table(data);
+       ndr_err = ndr_push_struct_blob(
+               &blob, lck, lck,
+               (ndr_push_flags_fn_t)ndr_push_share_mode_lock);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               smb_panic("ndr_push_share_mode_lock failed");
        }
 
-       return result;
+       return make_tdb_data(blob.data, blob.length);
 }
 
 static int share_mode_lock_destructor(struct share_mode_lock *lck)
@@ -949,6 +665,8 @@ static bool fill_share_mode_lock(struct share_mode_lock *lck,
                                 TDB_DATA share_mode_data,
                                 const struct timespec *old_write_time)
 {
+       bool fresh;
+
        /* Ensure we set every field here as the destructor must be
           valid even if parse_share_modes fails. */
 
@@ -962,12 +680,10 @@ static bool fill_share_mode_lock(struct share_mode_lock *lck,
        lck->delete_tokens = NULL;
        ZERO_STRUCT(lck->old_write_time);
        ZERO_STRUCT(lck->changed_write_time);
-       lck->fresh = False;
-       lck->modified = False;
 
-       lck->fresh = (share_mode_data.dptr == NULL);
+       fresh = (share_mode_data.dptr == NULL);
 
-       if (lck->fresh) {
+       if (fresh) {
                bool has_stream;
                if (smb_fname == NULL || servicepath == NULL
                    || old_write_time == NULL) {
@@ -986,12 +702,14 @@ static bool fill_share_mode_lock(struct share_mode_lock *lck,
                        return False;
                }
                lck->old_write_time = *old_write_time;
+               lck->modified = false;
        } else {
                if (!parse_share_modes(share_mode_data, lck)) {
                        DEBUG(0, ("Could not parse share modes\n"));
                        return False;
                }
        }
+       lck->fresh = fresh;
 
        return True;
 }
@@ -1004,6 +722,7 @@ struct share_mode_lock *get_share_mode_lock(TALLOC_CTX *mem_ctx,
 {
        struct share_mode_lock *lck;
        struct file_id tmp;
+       struct db_record *rec;
        TDB_DATA key = locking_key(&id, &tmp);
        TDB_DATA value;
 
@@ -1012,13 +731,14 @@ struct share_mode_lock *get_share_mode_lock(TALLOC_CTX *mem_ctx,
                return NULL;
        }
 
-       if (!(lck->record = dbwrap_fetch_locked(lock_db, lck, key))) {
+       rec = dbwrap_fetch_locked(lock_db, lck, key);
+       if (rec == NULL) {
                DEBUG(3, ("Could not lock share entry\n"));
                TALLOC_FREE(lck);
                return NULL;
        }
 
-       value = dbwrap_record_get_value(lck->record);
+       value = dbwrap_record_get_value(rec);
 
        if (!fill_share_mode_lock(lck, id, servicepath, smb_fname,
                                  value, old_write_time)) {
@@ -1027,6 +747,7 @@ struct share_mode_lock *get_share_mode_lock(TALLOC_CTX *mem_ctx,
                return NULL;
        }
 
+       lck->record = rec;
        talloc_set_destructor(lck, share_mode_lock_destructor);
 
        return lck;
@@ -1743,15 +1464,12 @@ struct forall_state {
 static int traverse_fn(struct db_record *rec, void *_state)
 {
        struct forall_state *state = (struct forall_state *)_state;
-       struct locking_data *data;
-       struct share_mode_entry *shares;
-       const char *sharepath;
-       const char *fname;
-       const char *del_tokens;
-       uint32_t total_del_token_size = 0;
-       int i;
+       uint32_t i;
        TDB_DATA key;
        TDB_DATA value;
+       DATA_BLOB blob;
+       enum ndr_err_code ndr_err;
+       struct share_mode_lock *lck;
 
        key = dbwrap_record_get_key(rec);
        value = dbwrap_record_get_value(rec);
@@ -1760,30 +1478,28 @@ static int traverse_fn(struct db_record *rec, void *_state)
        if (key.dsize != sizeof(struct file_id))
                return 0;
 
-       data = (struct locking_data *)value.dptr;
-       shares = (struct share_mode_entry *)(value.dptr + sizeof(*data));
-       del_tokens = (const char *)value.dptr + sizeof(*data) +
-               data->u.s.num_share_mode_entries*sizeof(*shares);
-
-       for (i = 0; i < data->u.s.num_delete_token_entries; i++) {
-               uint32_t del_token_size;
-               memcpy(&del_token_size, del_tokens, sizeof(uint32_t));
-               total_del_token_size += del_token_size;
-               del_tokens += del_token_size;
+       lck = talloc(talloc_tos(), struct share_mode_lock);
+       if (lck == NULL) {
+               return 0;
        }
 
-       sharepath = (const char *)value.dptr + sizeof(*data) +
-               data->u.s.num_share_mode_entries*sizeof(*shares) +
-               total_del_token_size;
-       fname = (const char *)value.dptr + sizeof(*data) +
-               data->u.s.num_share_mode_entries*sizeof(*shares) +
-               total_del_token_size +
-               strlen(sharepath) + 1;
+       blob.data = value.dptr;
+       blob.length = value.dsize;
 
-       for (i=0;i<data->u.s.num_share_mode_entries;i++) {
-               state->fn(&shares[i], sharepath, fname,
+       ndr_err = ndr_pull_struct_blob(
+               &blob, lck, lck,
+               (ndr_pull_flags_fn_t)ndr_pull_share_mode_lock);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               DEBUG(1, ("ndr_pull_share_mode_lock failed\n"));
+               return 0;
+       }
+       for (i=0; i<lck->num_share_modes; i++) {
+               state->fn(&lck->share_modes[i],
+                         lck->servicepath, lck->base_name,
                          state->private_data);
        }
+       TALLOC_FREE(lck);
+
        return 0;
 }
 
index 5db268c1e631f3ac2f8a43bff689acf4ab7d15ce..fca616e66b4d7c36cf76f154e69a77a02925fa30 100644 (file)
@@ -29,6 +29,7 @@
 #include "../librpc/gen_ndr/srv_srvsvc.h"
 #include "../libcli/security/security.h"
 #include "../librpc/gen_ndr/ndr_security.h"
+#include "../librpc/gen_ndr/open_files.h"
 #include "dbwrap/dbwrap.h"
 #include "session.h"
 #include "../lib/util/util_pw.h"
index 837e3607696bd220a856681abd965900b7a7a37b..b259045ddf6114ee0f7cc3f44e015017cc73ce75 100644 (file)
@@ -28,6 +28,7 @@
 #include "transfer_file.h"
 #include "auth.h"
 #include "messages.h"
+#include "../librpc/gen_ndr/open_files.h"
 
 /****************************************************************************
  Run a file if it is a magic script.
index 5cda44c930934261e7c31d75bd332ece79aa2abd..fceebcb6dddca5e3b6ecf3d0501e63c0feaa3fa5 100644 (file)
@@ -27,6 +27,7 @@
 #include "fake_file.h"
 #include "../libcli/security/security.h"
 #include "../librpc/gen_ndr/ndr_security.h"
+#include "../librpc/gen_ndr/open_files.h"
 #include "auth.h"
 #include "messages.h"
 
index bba2e356f5cb3e98082a982a32258b357eafda3d..1bf957d810efc87d0e872637f0503ff33c12dc1f 100644 (file)
@@ -24,6 +24,7 @@
 #include "smbd/smbd.h"
 #include "smbd/globals.h"
 #include "messages.h"
+#include "../librpc/gen_ndr/open_files.h"
 
 /****************************************************************************
  Get the number of current exclusive oplocks.
index 7dd3260f0b05532a992cc26b447b9070c45835c5..a06e7b83391c0700fc192922450fb52898ebfa23 100644 (file)
@@ -32,6 +32,7 @@
 #include "fake_file.h"
 #include "rpc_client/rpc_client.h"
 #include "../librpc/gen_ndr/ndr_spoolss_c.h"
+#include "../librpc/gen_ndr/open_files.h"
 #include "rpc_client/cli_spoolss.h"
 #include "rpc_client/init_spoolss.h"
 #include "rpc_server/rpc_ncacn_np.h"
index 024979c20097af2b5418ef5ae24a37d1ccb79d76..0126419393c4fbc28f237cb254edfc53e4e5c8d9 100644 (file)
@@ -31,6 +31,7 @@
 #include "../libcli/auth/libcli_auth.h"
 #include "../librpc/gen_ndr/xattr.h"
 #include "../librpc/gen_ndr/ndr_security.h"
+#include "../librpc/gen_ndr/open_files.h"
 #include "libcli/security/security.h"
 #include "trans2.h"
 #include "auth.h"
index f341cb86368a365c52a12be660b84397e7aaae22..8bae5bc1ae56fc786ae0666f8e7dc35dd5c5b0c1 100644 (file)
@@ -39,6 +39,7 @@
 #include "session.h"
 #include "locking/proto.h"
 #include "messages.h"
+#include "librpc/gen_ndr/open_files.h"
 
 #define SMB_MAXPIDS            2048
 static uid_t           Ucrit_uid = 0;               /* added by OH */
index 5314f3343269f5d7bdd4a2f384cf9345245f68dd..49fb32e4fd9ec02123205a9d204ec9494d13c9a9 100644 (file)
@@ -21,6 +21,7 @@
 #include "web/swat_proto.h"
 #include "libcli/security/security.h"
 #include "locking/proto.h"
+#include "librpc/gen_ndr/open_files.h"
 
 #define _(x) lang_msg_rotate(talloc_tos(),x)
 
index 43d121a8dd8c88063d0371c7eb8105d1703b6bb7..a3b5704065657e4bba1a794741e0a4a3c68cdfa6 100755 (executable)
@@ -890,6 +890,7 @@ bld.SAMBA3_LIBRARY('smbd_base',
                     vfs vfs_default vfs_posixacl auth rpc LOCKING LIBAFS LIBAFS_SETTOKEN PROFILE
                     PRINTING PRINTBACKEND NDR_XATTR NDR_NOTIFY REGFIO
                     smbconf REG_FULL FNAME_UTIL
+                    NDR_OPEN_FILES
                     LIBCLI_SAMR libcli_lsa3 libcli_netlogon3 cli_spoolss
                     RPC_NDR_SRVSVC npa_tstream INIT_SAMR
                     cli_smb_common RPC_SERVER smbd_conn param_service