The branch, master has been updated
       via  8503eec s3-notify: Lift "/." handling up one level
       via  640a7d0 s3-notify: Simplify if-expressions
       via  1909af4 s3-dbwrap: Move "lock_order" initialization to db_open_xx
      from  af68fe7 build: Fix build issue on OpenBSD 5.x

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 8503eecabb9cbd47db6167f7394dc2257714ebd9
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Mar 15 13:02:15 2012 +0100

    s3-notify: Lift "/." handling up one level
    
    This slightly simplifies the code
    
    Autobuild-User: Volker Lendecke <v...@samba.org>
    Autobuild-Date: Fri Mar 16 14:28:44 CET 2012 on sn-devel-104

commit 640a7d0db71e038223a2f5afed70c5df5db509ac
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Mar 15 12:22:50 2012 +0100

    s3-notify: Simplify if-expressions

commit 1909af434eef5473c236aa46e531818e392b80b3
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Mar 15 11:10:35 2012 +0100

    s3-dbwrap: Move "lock_order" initialization to db_open_xx

-----------------------------------------------------------------------

Summary of changes:
 source3/lib/dbwrap/dbwrap_ctdb.c |    1 +
 source3/lib/dbwrap/dbwrap_open.c |    6 +---
 source3/lib/dbwrap/dbwrap_tdb.c  |    4 ++-
 source3/lib/dbwrap/dbwrap_tdb.h  |    3 +-
 source3/smbd/notify.c            |    9 +++++++
 source3/smbd/notify_internal.c   |   44 +++++++++++--------------------------
 6 files changed, 30 insertions(+), 37 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/lib/dbwrap/dbwrap_ctdb.c b/source3/lib/dbwrap/dbwrap_ctdb.c
index d50f75e..41adfd8 100644
--- a/source3/lib/dbwrap/dbwrap_ctdb.c
+++ b/source3/lib/dbwrap/dbwrap_ctdb.c
@@ -1505,6 +1505,7 @@ struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
        db_path = ctdbd_dbpath(conn, db_ctdb, db_ctdb->db_id);
 
        result->persistent = ((tdb_flags & TDB_CLEAR_IF_FIRST) == 0);
+       result->lock_order = lock_order;
 
        /* only pass through specific flags */
        tdb_flags &= TDB_SEQNUM;
diff --git a/source3/lib/dbwrap/dbwrap_open.c b/source3/lib/dbwrap/dbwrap_open.c
index 7315296..06ae7c6 100644
--- a/source3/lib/dbwrap/dbwrap_open.c
+++ b/source3/lib/dbwrap/dbwrap_open.c
@@ -123,10 +123,8 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx,
 
        if (result == NULL) {
                result = db_open_tdb(mem_ctx, name, hash_size,
-                                    tdb_flags, open_flags, mode);
-       }
-       if (result != NULL) {
-               result->lock_order = lock_order;
+                                    tdb_flags, open_flags, mode,
+                                    lock_order);
        }
        return result;
 }
diff --git a/source3/lib/dbwrap/dbwrap_tdb.c b/source3/lib/dbwrap/dbwrap_tdb.c
index 454073a..46d6cdb 100644
--- a/source3/lib/dbwrap/dbwrap_tdb.c
+++ b/source3/lib/dbwrap/dbwrap_tdb.c
@@ -343,7 +343,8 @@ static int db_tdb_transaction_cancel(struct db_context *db)
 struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx,
                               const char *name,
                               int hash_size, int tdb_flags,
-                              int open_flags, mode_t mode)
+                              int open_flags, mode_t mode,
+                              enum dbwrap_lock_order lock_order)
 {
        struct db_context *result = NULL;
        struct db_tdb_ctx *db_tdb;
@@ -361,6 +362,7 @@ struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx,
                DEBUG(0, ("talloc failed\n"));
                goto fail;
        }
+       result->lock_order = lock_order;
 
        db_tdb->wtdb = tdb_wrap_open(db_tdb, name, hash_size, tdb_flags,
                                     open_flags, mode, lp_ctx);
diff --git a/source3/lib/dbwrap/dbwrap_tdb.h b/source3/lib/dbwrap/dbwrap_tdb.h
index 86673d0..1f7a223 100644
--- a/source3/lib/dbwrap/dbwrap_tdb.h
+++ b/source3/lib/dbwrap/dbwrap_tdb.h
@@ -27,7 +27,8 @@ struct db_context;
 struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx,
                               const char *name,
                               int hash_size, int tdb_flags,
-                              int open_flags, mode_t mode);
+                              int open_flags, mode_t mode,
+                              enum dbwrap_lock_order lock_order);
 
 
 #endif /* __DBWRAP_TDB_H__ */
diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c
index 37d585b..534ed84 100644
--- a/source3/smbd/notify.c
+++ b/source3/smbd/notify.c
@@ -178,6 +178,7 @@ NTSTATUS change_notify_create(struct files_struct *fsp, 
uint32 filter,
                              bool recursive)
 {
        char *fullpath;
+       size_t len;
        struct notify_entry e;
        NTSTATUS status;
 
@@ -202,6 +203,14 @@ NTSTATUS change_notify_create(struct files_struct *fsp, 
uint32 filter,
                return NT_STATUS_NO_MEMORY;
        }
 
+       /*
+        * Avoid /. at the end of the path name. notify can't deal with it.
+        */
+       len = strlen(fullpath);
+       if (len > 1 && fullpath[len-1] == '.' && fullpath[len-2] == '/') {
+               fullpath[len-2] = '\0';
+       }
+
        ZERO_STRUCT(e);
        e.path = fullpath;
        e.dir_fd = fsp->fh->fd;
diff --git a/source3/smbd/notify_internal.c b/source3/smbd/notify_internal.c
index d442367..906f767 100644
--- a/source3/smbd/notify_internal.c
+++ b/source3/smbd/notify_internal.c
@@ -511,9 +511,7 @@ NTSTATUS notify_add(struct notify_context *notify, struct 
notify_entry *e0,
 {
        struct notify_entry e = *e0;
        NTSTATUS status;
-       char *tmp_path = NULL;
        struct notify_list *listel;
-       size_t len;
        int depth;
 
        /* see if change notify is enabled at all */
@@ -521,17 +519,6 @@ NTSTATUS notify_add(struct notify_context *notify, struct 
notify_entry *e0,
                return NT_STATUS_NOT_IMPLEMENTED;
        }
 
-       /* cope with /. on the end of the path */
-       len = strlen(e.path);
-       if (len > 1 && e.path[len-1] == '.' && e.path[len-2] == '/') {
-               tmp_path = talloc_strndup(notify, e.path, len-2);
-               if (tmp_path == NULL) {
-                       status = NT_STATUS_NO_MEMORY;
-                       goto done;
-               }
-               e.path = tmp_path;
-       }
-
        depth = count_chars(e.path, '/');
 
        listel = talloc_zero(notify, struct notify_list);
@@ -586,8 +573,6 @@ NTSTATUS notify_add(struct notify_context *notify, struct 
notify_entry *e0,
        }
        status = NT_STATUS_OK;
 done:
-       talloc_free(tmp_path);
-
        return status;
 }
 
@@ -958,6 +943,7 @@ void notify_trigger(struct notify_context *notify,
                int p_len = p - path;
                int min_i, max_i, i;
                struct notify_depth *d = &notify->array->depth[depth];
+               uint32_t d_max_mask;
                next_p = strchr(p+1, '/');
 
                /* see if there are any entries at this depth */
@@ -966,14 +952,11 @@ void notify_trigger(struct notify_context *notify,
                /* try to skip based on the maximum mask. If next_p is
                 NULL then we know it will be a 'this directory'
                 match, otherwise it must be a subdir match */
-               if (next_p != NULL) {
-                       if (0 == (filter & d->max_mask_subdir)) {
-                               continue;
-                       }
-               } else {
-                       if (0 == (filter & d->max_mask)) {
-                               continue;
-                       }
+
+               d_max_mask = next_p ? d->max_mask_subdir : d->max_mask;
+
+               if ((filter & d_max_mask) == 0) {
+                       continue;
                }
 
                /* we know there is an entry here worth looking
@@ -1009,17 +992,16 @@ void notify_trigger(struct notify_context *notify,
                /* we now know that the entries start at min_i */
                for (i=min_i;i<d->num_entries;i++) {
                        struct notify_entry *e = &d->entries[i];
+                       uint32_t e_filter;
                        if (p_len != e->path_len ||
                            strncmp(path, e->path, p_len) != 0) break;
-                       if (next_p != NULL) {
-                               if (0 == (filter & e->subdir_filter)) {
-                                       continue;
-                               }
-                       } else {
-                               if (0 == (filter & e->filter)) {
-                                       continue;
-                               }
+
+                       e_filter = next_p ? e->subdir_filter : e->filter;
+
+                       if ((filter & e_filter) == 0) {
+                               continue;
                        }
+
                        status = notify_send(notify, e, path + e->path_len + 1,
                                             action);
 


-- 
Samba Shared Repository

Reply via email to