summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin.dahyabhai@pobox.com>2007-11-29 19:18:59 -0500
committerNalin Dahyabhai <nalin.dahyabhai@pobox.com>2007-11-29 19:18:59 -0500
commit40a367c818dd8b073a192d3b0c23965b6f68f19d (patch)
tree8128425a6b746e8d49ddb250b0f49ef463d546fa /src
parent9e27311aaa9f422f9c1d3afb3be3e0d9d7cc6dc6 (diff)
- some ldap-for-nis work, finally
Diffstat (limited to 'src')
-rw-r--r--src/nis.c192
1 files changed, 97 insertions, 95 deletions
diff --git a/src/nis.c b/src/nis.c
index 719cf33..627df4e 100644
--- a/src/nis.c
+++ b/src/nis.c
@@ -22,90 +22,6 @@
#define DUMMY_KEY "leeroy"
#define DUMMY_VAL "jimbo:*K*:1234:5678:Leeroy Jenkins:/home/leeroy:/bin/bash"
-struct search_stream_data {
- struct plugin_state *state;
- int client;
-};
-
-static void
-cb_stream_result(int rc, void *callback_data)
-{
- struct search_stream_data *data = callback_data;
- char buf[sizeof(rc) * 4 + 1];
- slapi_log_error(SLAPI_LOG_PLUGIN, "cb_result",
- "returning result %d\n", rc);
- sprintf(buf, "%d\n", rc);
- write(data->client, buf, strlen(buf));
-}
-
-static int
-cb_stream_entry(Slapi_Entry *e, void *callback_data)
-{
- struct search_stream_data *data = callback_data;
- Slapi_Attr *attr;
- Slapi_ValueSet *values;
- Slapi_Value *value;
- const char *dn;
- const struct berval *val;
- int i;
- attr = NULL;
- if (slapi_entry_attr_find(e, "ou", &attr) == 0) {
- dn = slapi_entry_get_dn(e);
- slapi_log_error(SLAPI_LOG_PLUGIN, "cb_entry",
- "returning entry \"%s\"\n", dn);
- write(data->client, "[", 1);
- write(data->client, dn, strlen(dn));
- write(data->client, "]\n", 2);
- values = NULL;
- if (slapi_attr_get_valueset(attr, &values) == 0) {
- i = slapi_valueset_first_value(values, &value);
- while (i != -1) {
- val = slapi_value_get_berval(value);
- if (val != NULL) {
- write(data->client,
- val->bv_val, val->bv_len);
- write(data->client, "\n", 1);
- }
- i = slapi_valueset_next_value(values, i,
- &value);
- }
- }
- }
- return 0;
-}
-
-static int
-cb_stream_referral(char *referral, void *callback_data)
-{
- struct search_stream_data *data = callback_data;
- slapi_log_error(SLAPI_LOG_PLUGIN, "cb_referral",
- "returning referral to \"%s\"\n", referral);
- write(data->client, "See also ", 9);
- write(data->client, referral, strlen(referral));
- write(data->client, "\n", 1);
- return 0;
-}
-
-#if 0
- pblock = slapi_pblock_new();
- slapi_pblock_set(pblock, SLAPI_CONN_DN, "");
- slapi_pblock_set(pblock, SLAPI_CONN_AUTHMETHOD, SLAPD_AUTH_NONE);
- slapi_search_internal_set_pb(pblock,
- "dc=boston,dc=redhat,dc=com",
- LDAP_SCOPE_ONE,
- "(objectclass=*)",
- attrs, 0,
- NULL,
- NULL,
- state->plugin_identity,
- 0);
- i = slapi_search_internal_callback_pb(pblock, &data,
- cb_stream_result,
- cb_stream_entry,
- cb_stream_referral);
- slapi_pblock_destroy(pblock);
- close(client);
-#endif
/* send a reply which _could_ be sent over a datagram */
static void
@@ -187,6 +103,65 @@ nis_domain(struct plugin_state *state,
}
}
+struct nis_match_data {
+ struct plugin_state *state;
+ const char *format;
+
+ int result;
+ char *value;
+};
+
+static void
+nis_match_cb_result(int rc, void *callback_data)
+{
+ struct search_stream_data *data = callback_data;
+ data->result = rc;
+}
+
+static int
+nis_match_cb_entry(Slapi_Entry *e, void *callback_data)
+{
+ struct nis_match_data *data = callback_data;
+ Slapi_Attr *attr;
+ Slapi_ValueSet *values;
+ Slapi_Value *value;
+ const char *dn;
+ const struct berval *val;
+ int i;
+
+ attr = NULL;
+ if (slapi_entry_attr_find(e, "ou", &attr) == 0) {
+ dn = slapi_entry_get_dn(e);
+ slapi_log_error(SLAPI_LOG_PLUGIN, "cb_entry",
+ "returning entry \"%s\"\n", dn);
+ write(data->client, "[", 1);
+ write(data->client, dn, strlen(dn));
+ write(data->client, "]\n", 2);
+ values = NULL;
+ if (slapi_attr_get_valueset(attr, &values) == 0) {
+ i = slapi_valueset_first_value(values, &value);
+ while (i != -1) {
+ val = slapi_value_get_berval(value);
+ if (val != NULL) {
+ write(data->client,
+ val->bv_val, val->bv_len);
+ write(data->client, "\n", 1);
+ }
+ i = slapi_valueset_next_value(values, i,
+ &value);
+ }
+ }
+ }
+ return 0;
+}
+
+static int
+nis_match_cb_referral(char *referral, void *callback_data)
+{
+ /* no referral chasing for us */
+ return 0;
+}
+
static void
nis_match(struct plugin_state *state,
int client, struct sockaddr *client_addr, socklen_t client_addrlen,
@@ -194,20 +169,47 @@ nis_match(struct plugin_state *state,
struct rpc_msg *reply, XDR *reply_xdrs, char *reply_buf,
struct ypresp_val *reply_val)
{
+ Slapi_PBlock *pblock;
+ struct nis_match_data match_data;
+ char *base, *scope, *key, *format;
struct ypreq_key req_key;
+
memset(&req_key, 0, sizeof(req_key));
if (xdr_ypreq_key(request_xdrs, &req_key)) {
- reply_val->status = YP_TRUE;
- reply_val->valdat.valdat_val = DUMMY_VAL;
- reply_val->valdat.valdat_len = strlen(DUMMY_VAL);
- slapi_log_error(SLAPI_LOG_PLUGIN,
- state->plugin_desc->spd_id,
- "match(%s/%s/%.*s) -> %d\n",
- req_key.domain,
- req_key.map,
- (int) req_key.keydat.keydat_len,
- req_key.keydat.keydat_val,
- reply_val->status);
+ pblock = slapi_pblock_new();
+ slapi_pblock_set(pblock, SLAPI_CONN_DN, "");
+ slapi_pblock_set(pblock, SLAPI_CONN_AUTHMETHOD, SLAPD_AUTH_NONE);
+ memset(&match_data, 0, sizeof(match_data));
+ match_data.state = state;
+ slapi_search_internal_set_pb(pblock,
+ "dc=boston,dc=redhat,dc=com",
+ LDAP_SCOPE_ONE,
+ "(objectclass=*)",
+ attrs, 0,
+ NULL,
+ NULL,
+ state->plugin_identity,
+ 0);
+ i = slapi_search_internal_callback_pb(pblock, &match_data,
+ nis_match_cb_result,
+ nis_match_cb_entry,
+ nis_match_cb_referral);
+ slapi_pblock_destroy(pblock);
+ if (match_data.result == 0) {
+ reply_val->status = YP_TRUE;
+ reply_val->valdat.valdat_val = DUMMY_VAL;
+ reply_val->valdat.valdat_len = strlen(DUMMY_VAL);
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ state->plugin_desc->spd_id,
+ "match(%s/%s/%.*s) -> %d\n",
+ req_key.domain,
+ req_key.map,
+ (int) req_key.keydat.keydat_len,
+ req_key.keydat.keydat_val,
+ reply_val->status);
+ } else {
+ reply_val->status = YP_FALSE;
+ }
nis_reply(client, client_addr, client_addrlen,
reply, reply_xdrs, reply_buf);
} else {