diff options
| author | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2007-11-29 19:18:59 -0500 |
|---|---|---|
| committer | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2007-11-29 19:18:59 -0500 |
| commit | 40a367c818dd8b073a192d3b0c23965b6f68f19d (patch) | |
| tree | 8128425a6b746e8d49ddb250b0f49ef463d546fa /src | |
| parent | 9e27311aaa9f422f9c1d3afb3be3e0d9d7cc6dc6 (diff) | |
- some ldap-for-nis work, finally
Diffstat (limited to 'src')
| -rw-r--r-- | src/nis.c | 192 |
1 files changed, 97 insertions, 95 deletions
@@ -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 { |
