diff options
author | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-05-30 17:49:32 -0400 |
---|---|---|
committer | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-05-30 17:49:32 -0400 |
commit | 2a4501dfb7b04dc1359b4bbbff13b5351392d669 (patch) | |
tree | 312f9a131e5549c221a7d4a357cf286a6a866bd8 /src/nis.c | |
parent | 6c316e9ae234a97aa0cf6c240bcf38e35a53ae7c (diff) | |
download | slapi-nis-2a4501dfb7b04dc1359b4bbbff13b5351392d669.tar.gz slapi-nis-2a4501dfb7b04dc1359b4bbbff13b5351392d669.tar.xz slapi-nis-2a4501dfb7b04dc1359b4bbbff13b5351392d669.zip |
- add read-locking when we read from the map cache
Diffstat (limited to 'src/nis.c')
-rw-r--r-- | src/nis.c | 16 |
1 files changed, 16 insertions, 0 deletions
@@ -62,6 +62,7 @@ nis_domain(struct plugin_state *state, char *domain = NULL; *reply_bool = FALSE; if (xdr_string(request_xdrs, &domain, YPMAXDOMAIN)) { + map_rdlock(); map_supports_domain(state, domain, reply_bool); if (*reply_bool || reply_on_failure) { slapi_log_error(SLAPI_LOG_PLUGIN, @@ -75,6 +76,7 @@ nis_domain(struct plugin_state *state, "domain(%s) -> %d (no reply)\n", domain, *reply_bool ? "TRUE" : "FALSE"); } + map_unlock(); } else { slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id, @@ -98,6 +100,7 @@ nis_match(struct plugin_state *state, memset(&req_key, 0, sizeof(req_key)); memset(reply_val, 0, sizeof(*reply_val)); if (xdr_ypreq_key(request_xdrs, &req_key)) { + map_rdlock(); if (map_match(state, req_key.domain, req_key.map, req_key.keydat.keydat_len, req_key.keydat.keydat_val, @@ -119,6 +122,7 @@ nis_match(struct plugin_state *state, reply_val->status = map_supported ? YP_NOKEY : YP_NOMAP; } (*reply_fn)(state, cdata, reply, reply_xdrs, reply_buf); + map_unlock(); } else { /* XXX */ } @@ -139,6 +143,7 @@ nis_first(struct plugin_state *state, memset(&req_nokey, 0, sizeof(req_nokey)); memset(reply_key_val, 0, sizeof(*reply_key_val)); if (xdr_ypreq_nokey(request_xdrs, &req_nokey)) { + map_rdlock(); if (map_first(state, req_nokey.domain, req_nokey.map, &reply_key_val->keydat.keydat_len, &reply_key_val->keydat.keydat_val, @@ -159,6 +164,7 @@ nis_first(struct plugin_state *state, YP_NOMAP; } (*reply_fn)(state, cdata, reply, reply_xdrs, reply_buf); + map_unlock(); } else { /* XXX */ } @@ -177,6 +183,7 @@ nis_next(struct plugin_state *state, memset(&req_key, 0, sizeof(req_key)); memset(reply_key_val, 0, sizeof(*reply_key_val)); if (xdr_ypreq_key(request_xdrs, &req_key)) { + map_rdlock(); if (map_next(state, req_key.domain, req_key.map, req_key.keydat.keydat_len, req_key.keydat.keydat_val, @@ -214,6 +221,7 @@ nis_next(struct plugin_state *state, req_key.map); } (*reply_fn)(state, cdata, reply, reply_xdrs, reply_buf); + map_unlock(); } else { /* XXX */ } @@ -233,6 +241,7 @@ nis_master(struct plugin_state *state, memset(&req_nokey, 0, sizeof(req_nokey)); memset(reply_master, 0, sizeof(*reply_master)); if (xdr_ypreq_nokey(request_xdrs, &req_nokey)) { + map_rdlock(); reply_master->status = YP_TRUE; if (map_master_name(state, &master) != 0) { master = "localhost"; @@ -245,6 +254,7 @@ nis_master(struct plugin_state *state, req_nokey.map, reply_master->master); (*reply_fn)(state, cdata, reply, reply_xdrs, reply_buf); + map_unlock(); } else { /* XXX */ } @@ -263,6 +273,7 @@ nis_order(struct plugin_state *state, memset(&req_nokey, 0, sizeof(req_nokey)); memset(reply_order, 0, sizeof(*reply_order)); if (xdr_ypreq_nokey(request_xdrs, &req_nokey)) { + map_rdlock(); reply_order->status = YP_TRUE; if (map_order(state, req_nokey.domain, req_nokey.map, &reply_order->ordernum)) { @@ -282,6 +293,7 @@ nis_order(struct plugin_state *state, req_nokey.map); } (*reply_fn)(state, cdata, reply, reply_xdrs, reply_buf); + map_unlock(); } else { /* XXX */ } @@ -331,6 +343,7 @@ nis_maplist(struct plugin_state *state, struct ypmaplist *list; memset(reply_maplist, 0, sizeof(*reply_maplist)); if (xdr_string(request_xdrs, &domain, YPMAXDOMAIN)) { + map_rdlock(); list = NULL; map_data_foreach_map(state, domain, nis_maplist_cb, &list); reply_maplist->status = YP_TRUE; @@ -352,6 +365,7 @@ nis_maplist(struct plugin_state *state, } (*reply_fn)(state, cdata, reply, reply_xdrs, reply_buf); nis_free_maplist_cb_result(&list); + map_unlock(); } else { /* XXX */ } @@ -440,6 +454,7 @@ nis_all(struct plugin_state *state, 0, NULL); } /* Check if we even support the map. */ + map_rdlock(); supported = FALSE; if (!map_supports_map(state, req_nokey.domain, req_nokey.map, &supported) || @@ -711,6 +726,7 @@ nis_all(struct plugin_state *state, break; } } + map_unlock(); /* Return the cookie if we can, else destroy it. */ if (continuation_cookie) { *continuation_cookie = cookie; |