summaryrefslogtreecommitdiffstats
path: root/src/nis.c
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-05-30 17:49:32 -0400
committerNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-05-30 17:49:32 -0400
commit2a4501dfb7b04dc1359b4bbbff13b5351392d669 (patch)
tree312f9a131e5549c221a7d4a357cf286a6a866bd8 /src/nis.c
parent6c316e9ae234a97aa0cf6c240bcf38e35a53ae7c (diff)
downloadslapi-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.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/nis.c b/src/nis.c
index fefb331..68129ae 100644
--- a/src/nis.c
+++ b/src/nis.c
@@ -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;