diff options
author | Volker Lendecke <vl@samba.org> | 2009-09-23 15:21:40 +0200 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2009-09-23 18:50:33 +0200 |
commit | 76d95b9a2dcfff9df1865ffff74f0e9c32bce609 (patch) | |
tree | 885a46adcfeccb1b8b3cf631f9f0bdc58dee676d | |
parent | adf66e75c060e6462b9f8819944d0f8ff1ef2c1b (diff) | |
download | samba-76d95b9a2dcfff9df1865ffff74f0e9c32bce609.tar.gz samba-76d95b9a2dcfff9df1865ffff74f0e9c32bce609.tar.bz2 samba-76d95b9a2dcfff9df1865ffff74f0e9c32bce609.zip |
s3:gencache: Add a "was_expired" argument to gencache_get_data_blob
This is set to true if the routine returns failure due to an existing but
expired entry.
-rw-r--r-- | source3/include/proto.h | 2 | ||||
-rw-r--r-- | source3/lib/gencache.c | 29 | ||||
-rw-r--r-- | source3/libsmb/dsgetdcname.c | 2 | ||||
-rw-r--r-- | source3/torture/torture.c | 4 |
4 files changed, 23 insertions, 14 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index f2350e7d88..d664a26949 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -535,7 +535,7 @@ bool gencache_set(const char *keystr, const char *value, time_t timeout); bool gencache_del(const char *keystr); bool gencache_get(const char *keystr, char **valstr, time_t *timeout); bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob, - time_t *timeout); + time_t *timeout, bool *was_expired); bool gencache_stabilize(void); bool gencache_set_data_blob(const char *keystr, const DATA_BLOB *blob, time_t timeout); void gencache_iterate(void (*fn)(const char* key, const char *value, time_t timeout, void* dptr), diff --git a/source3/lib/gencache.c b/source3/lib/gencache.c index ee1f4b70b3..5c030cddab 100644 --- a/source3/lib/gencache.c +++ b/source3/lib/gencache.c @@ -273,24 +273,25 @@ static bool gencache_pull_timeout(char *val, time_t *pres, char **pendptr) **/ bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob, - time_t *timeout) + time_t *timeout, bool *was_expired) { TDB_DATA databuf; time_t t; char *endptr; + bool expired = false; if (keystr == NULL) { - return false; + goto fail; } if (tdb_data_cmp(string_term_tdb_data(keystr), last_stabilize_key()) == 0) { DEBUG(10, ("Can't get %s as a key\n", keystr)); - return false; + goto fail; } if (!gencache_init()) { - return False; + goto fail; } databuf = tdb_fetch_bystring(cache_notrans, keystr); @@ -302,12 +303,12 @@ bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob, if (databuf.dptr == NULL) { DEBUG(10, ("Cache entry with key = %s couldn't be found \n", keystr)); - return False; + goto fail; } if (!gencache_pull_timeout((char *)databuf.dptr, &t, &endptr)) { SAFE_FREE(databuf.dptr); - return False; + goto fail; } DEBUG(10, ("Returning %s cache entry: key = %s, value = %s, " @@ -317,7 +318,7 @@ bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob, if (t == 0) { /* Deleted */ SAFE_FREE(databuf.dptr); - return False; + goto fail; } if (t <= time(NULL)) { @@ -331,7 +332,9 @@ bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob, gencache_set(keystr, "", 0); SAFE_FREE(databuf.dptr); - return False; + + expired = true; + goto fail; } if (blob != NULL) { @@ -341,7 +344,7 @@ bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob, if (blob->data == NULL) { SAFE_FREE(databuf.dptr); DEBUG(0, ("memdup failed\n")); - return False; + goto fail; } } @@ -352,6 +355,12 @@ bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob, } return True; + +fail: + if (was_expired != NULL) { + *was_expired = expired; + } + return false; } struct stabilize_state { @@ -503,7 +512,7 @@ bool gencache_get(const char *keystr, char **value, time_t *ptimeout) DATA_BLOB blob; bool ret = False; - ret = gencache_get_data_blob(keystr, &blob, ptimeout); + ret = gencache_get_data_blob(keystr, &blob, ptimeout, NULL); if (!ret) { return false; } diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 99d21eb641..98b65942e4 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -331,7 +331,7 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx, return NT_STATUS_NO_MEMORY; } - if (!gencache_get_data_blob(key, &blob, NULL)) { + if (!gencache_get_data_blob(key, &blob, NULL, NULL)) { return NT_STATUS_NOT_FOUND; } diff --git a/source3/torture/torture.c b/source3/torture/torture.c index 98694ed3d0..9e1ac7648e 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -5863,7 +5863,7 @@ static bool run_local_gencache(int dummy) return False; } - if (!gencache_get_data_blob("foo", &blob, NULL)) { + if (!gencache_get_data_blob("foo", &blob, NULL, NULL)) { d_printf("%s: gencache_get_data_blob() failed\n", __location__); return False; } @@ -5887,7 +5887,7 @@ static bool run_local_gencache(int dummy) return False; } - if (gencache_get_data_blob("foo", &blob, NULL)) { + if (gencache_get_data_blob("foo", &blob, NULL, NULL)) { d_printf("%s: gencache_get_data_blob() on deleted entry " "succeeded\n", __location__); return False; |