diff options
-rw-r--r-- | source3/lib/smbconf/smbconf.c | 38 | ||||
-rw-r--r-- | source3/lib/smbconf/smbconf.h | 9 | ||||
-rw-r--r-- | source3/param/loadparm.c | 14 |
3 files changed, 42 insertions, 19 deletions
diff --git a/source3/lib/smbconf/smbconf.c b/source3/lib/smbconf/smbconf.c index dc45a16c48..454056167e 100644 --- a/source3/lib/smbconf/smbconf.c +++ b/source3/lib/smbconf/smbconf.c @@ -417,6 +417,20 @@ static int smbconf_destroy_ctx(struct smbconf_ctx *ctx) return regdb_close(); } +/** + * Get the change sequence number of the given service/parameter. + * service and parameter strings may be NULL. + */ +static void smbconf_reg_get_csn(struct smbconf_ctx *ctx, + struct smbconf_csn *csn, + const char *service, const char *param) +{ + if (csn == NULL) { + return; + } + csn->csn = (uint64_t)regdb_get_seqnum(); +} + /********************************************************************** * * The actual net conf api functions, that are exported. @@ -475,16 +489,24 @@ void smbconf_close(struct smbconf_ctx *ctx) } /** - * Get the change sequence number of the given service/parameter. - * - * NOTE: Currently, for registry configuration, this is independent - * of the service and parameter, it returns the registry-sequence - * number. + * Detect changes in the configuration. + * The given csn struct is filled with the current csn. + * smbconf_changed() can also be used for initial retrieval + * of the csn. */ -uint64_t smbconf_get_seqnum(struct smbconf_ctx *ctx, - const char *service, const char *param) +bool smbconf_changed(struct smbconf_ctx *ctx, struct smbconf_csn *csn, + const char *service, const char *param) { - return (uint64_t)regdb_get_seqnum(); + struct smbconf_csn old_csn; + + if (csn == NULL) { + return false; + } + + old_csn = *csn; + + smbconf_reg_get_csn(ctx, csn, service, param); + return (csn->csn != old_csn.csn); } /** diff --git a/source3/lib/smbconf/smbconf.h b/source3/lib/smbconf/smbconf.h index d2e05045f7..134dc29c09 100644 --- a/source3/lib/smbconf/smbconf.h +++ b/source3/lib/smbconf/smbconf.h @@ -24,6 +24,11 @@ struct smbconf_ctx { NT_USER_TOKEN *token; }; +/* the change sequence number */ +struct smbconf_csn { + uint64_t csn; +}; + /* * WARNING: * Of this API, at least the open function is still subject to change. @@ -32,8 +37,8 @@ struct smbconf_ctx { WERROR smbconf_open(TALLOC_CTX *mem_ctx, struct smbconf_ctx **conf_ctx); void smbconf_close(struct smbconf_ctx *ctx); -uint64_t smbconf_get_seqnum(struct smbconf_ctx *ctx, - const char *service, const char *param); +bool smbconf_changed(struct smbconf_ctx *ctx, struct smbconf_csn *csn, + const char *service, const char *param); WERROR smbconf_drop(struct smbconf_ctx *ctx); WERROR smbconf_get_config(TALLOC_CTX *mem_ctx, struct smbconf_ctx *ctx, uint32_t *num_shares, diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 04fade5789..37d68ba4af 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -71,7 +71,7 @@ extern userdom_struct current_user_info; #endif static bool in_client = False; /* Not in the client by default */ -static uint64_t conf_last_seqnum = 0; +static struct smbconf_csn conf_last_csn; static struct smbconf_ctx *conf_ctx = NULL; #define CONFIG_BACKEND_FILE 0 @@ -6524,7 +6524,8 @@ static bool process_registry_globals(bool (*pfunc)(const char *, const char *)) } ret = pfunc("registry shares", "yes"); - conf_last_seqnum = smbconf_get_seqnum(conf_ctx, NULL, NULL); + /* store the csn */ + smbconf_changed(conf_ctx, &conf_last_csn, NULL, NULL); done: TALLOC_FREE(mem_ctx); @@ -6604,7 +6605,6 @@ bool lp_file_list_changed(void) DEBUG(6, ("lp_file_list_changed()\n")); if (lp_config_backend_is_registry()) { - uint64_t conf_cur_seqnum; if (conf_ctx == NULL) { WERROR werr; werr = smbconf_open(NULL, &conf_ctx); @@ -6614,12 +6614,8 @@ bool lp_file_list_changed(void) return false; } } - conf_cur_seqnum = smbconf_get_seqnum(conf_ctx, NULL, NULL); - if (conf_last_seqnum != conf_cur_seqnum) { - DEBUGADD(6, ("regdb seqnum changed: old = %llu, " - "new = %llu\n", - (unsigned long long)conf_last_seqnum, - (unsigned long long)conf_cur_seqnum)); + if (smbconf_changed(conf_ctx, &conf_last_csn, NULL, NULL)) { + DEBUGADD(6, ("registry config changed\n")); return true; } } |