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.
}
/**
- * 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);
}
/**
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.
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,
#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
}
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);
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);
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;
}
}