static int bs_cf_gen( ConfigArgs *c ) { struct sockinfo *si = c->be->be_private; int rc; if ( c->op == SLAP_CONFIG_EMIT ) { switch( c->type ) { case BS_EXT: return mask_to_verbs( bs_exts, si->si_extensions, &c->rvalue_vals ); } } else if ( c->op == LDAP_MOD_DELETE ) { switch( c->type ) { case BS_EXT: if ( c->valx < 0 ) { si->si_extensions = 0; rc = 0; } else { slap_mask_t dels = 0; rc = verbs_to_mask( c->argc, c->argv, bs_exts, &dels ); if ( rc == 0 ) si->si_extensions ^= dels; } return rc; } } else { switch( c->type ) { case BS_EXT: return verbs_to_mask( c->argc, c->argv, bs_exts, &si->si_extensions ); } } return 1; }
static int nss_cf_gen(ConfigArgs *c) { slap_overinst *on = (slap_overinst *)c->bi; nssov_info *ni = on->on_bi.bi_private; nssov_mapinfo *mi; int i, j, rc = 0; slap_mask_t m; if ( c->op == SLAP_CONFIG_EMIT ) { switch(c->type) { case NSS_SSD: rc = 1; for (i=NM_alias;i<NM_NONE;i++) { struct berval scope; struct berval ssd; struct berval base; mi = &ni->ni_maps[i]; /* ignore all-default services */ if ( mi->mi_scope == LDAP_SCOPE_DEFAULT && bvmatch( &mi->mi_filter, &mi->mi_filter0 ) && BER_BVISNULL( &mi->mi_base )) continue; if ( BER_BVISNULL( &mi->mi_base )) base = ni->ni_db->be_nsuffix[0]; else base = mi->mi_base; ldap_pvt_scope2bv(mi->mi_scope == LDAP_SCOPE_DEFAULT ? LDAP_SCOPE_SUBTREE : mi->mi_scope, &scope); ssd.bv_len = STRLENOF(" ldap:///???") + nss_svcs[i].word.bv_len + base.bv_len + scope.bv_len + mi->mi_filter.bv_len; ssd.bv_val = ch_malloc( ssd.bv_len + 1 ); sprintf(ssd.bv_val, "%s ldap:///%s??%s?%s", nss_svcs[i].word.bv_val, base.bv_val, scope.bv_val, mi->mi_filter.bv_val ); ber_bvarray_add( &c->rvalue_vals, &ssd ); rc = 0; } break; case NSS_MAP: rc = 1; for (i=NM_alias;i<NM_NONE;i++) { mi = &ni->ni_maps[i]; for (j=0;!BER_BVISNULL(&mi->mi_attrkeys[j]);j++) { if ( ber_bvstrcasecmp(&mi->mi_attrkeys[j], &mi->mi_attrs[j].an_name)) { struct berval map; map.bv_len = nss_svcs[i].word.bv_len + mi->mi_attrkeys[j].bv_len + mi->mi_attrs[j].an_desc->ad_cname.bv_len + 2; map.bv_val = ch_malloc(map.bv_len + 1); sprintf(map.bv_val, "%s %s %s", nss_svcs[i].word.bv_val, mi->mi_attrkeys[j].bv_val, mi->mi_attrs[j].an_desc->ad_cname.bv_val ); ber_bvarray_add( &c->rvalue_vals, &map ); rc = 0; } } } break; case NSS_PAM: rc = mask_to_verbs( pam_opts, ni->ni_pam_opts, &c->rvalue_vals ); break; case NSS_PAMGROUP: if (!BER_BVISEMPTY( &ni->ni_pam_group_dn )) { value_add_one( &c->rvalue_vals, &ni->ni_pam_group_dn ); value_add_one( &c->rvalue_nvals, &ni->ni_pam_group_dn ); } else { rc = 1; } break; case NSS_PAMSESS: if (ni->ni_pam_sessions) { ber_bvarray_dup_x( &c->rvalue_vals, ni->ni_pam_sessions, NULL ); } else { rc = 1; } break; } return rc; } else if ( c->op == LDAP_MOD_DELETE ) { /* FIXME */ return 1; } switch( c->type ) { case NSS_SSD: { LDAPURLDesc *lud; i = verb_to_mask(c->argv[1], nss_svcs); if ( i == NM_NONE ) return 1; mi = &ni->ni_maps[i]; rc = ldap_url_parse(c->argv[2], &lud); if ( rc ) return 1; do { struct berval base; /* Must be LDAP scheme */ if (strcasecmp(lud->lud_scheme,"ldap")) { rc = 1; break; } /* Host part, attrs, and extensions must be empty */ if (( lud->lud_host && *lud->lud_host ) || lud->lud_attrs || lud->lud_exts ) { rc = 1; break; } ber_str2bv( lud->lud_dn,0,0,&base); rc = dnNormalize( 0,NULL,NULL,&base,&mi->mi_base,NULL); if ( rc ) break; if ( lud->lud_filter ) { /* steal this */ ber_str2bv( lud->lud_filter,0,0,&mi->mi_filter); lud->lud_filter = NULL; } mi->mi_scope = lud->lud_scope; } while(0); ldap_free_urldesc( lud ); } break; case NSS_MAP: i = verb_to_mask(c->argv[1], nss_svcs); if ( i == NM_NONE ) return 1; rc = 1; mi = &ni->ni_maps[i]; for (j=0; !BER_BVISNULL(&mi->mi_attrkeys[j]); j++) { if (!strcasecmp(c->argv[2],mi->mi_attrkeys[j].bv_val)) { AttributeDescription *ad = NULL; const char *text; rc = slap_str2ad( c->argv[3], &ad, &text); if ( rc == 0 ) { mi->mi_attrs[j].an_desc = ad; mi->mi_attrs[j].an_name = ad->ad_cname; } break; } } break; case NSS_PAM: m = ni->ni_pam_opts; i = verbs_to_mask(c->argc, c->argv, pam_opts, &m); if (i == 0) { ni->ni_pam_opts = m; if ((m & NI_PAM_USERHOST) && !nssov_pam_host_ad) { const char *text; i = slap_str2ad("host", &nssov_pam_host_ad, &text); if (i != LDAP_SUCCESS) { snprintf(c->cr_msg, sizeof(c->cr_msg), "nssov: host attr unknown: %s", text); Debug(LDAP_DEBUG_ANY,"%s\n",c->cr_msg,0,0); rc = 1; break; } } if ((m & (NI_PAM_USERSVC|NI_PAM_HOSTSVC)) && !nssov_pam_svc_ad) { const char *text; i = slap_str2ad("authorizedService", &nssov_pam_svc_ad, &text); if (i != LDAP_SUCCESS) { snprintf(c->cr_msg, sizeof(c->cr_msg), "nssov: authorizedService attr unknown: %s", text); Debug(LDAP_DEBUG_ANY,"%s\n",c->cr_msg,0,0); rc = 1; break; } } } else { rc = 1; } break; case NSS_PAMGROUP: ni->ni_pam_group_dn = c->value_ndn; ch_free( c->value_dn.bv_val ); break; case NSS_PAMSESS: ber_bvarray_add( &ni->ni_pam_sessions, &c->value_bv ); break; } return rc; }
static int bs_cf_gen( ConfigArgs *c ) { struct sockinfo *si; int rc; if ( c->be && c->table == Cft_Database ) si = c->be->be_private; else if ( c->bi ) si = c->bi->bi_private; else return ARG_BAD_CONF; if ( c->op == SLAP_CONFIG_EMIT ) { switch( c->type ) { case BS_EXT: return mask_to_verbs( bs_exts, si->si_extensions, &c->rvalue_vals ); case BS_OPS: return mask_to_verbs( ov_ops, si->si_ops, &c->rvalue_vals ); case BS_RESP: return mask_to_verbs( ov_resps, si->si_resps, &c->rvalue_vals ); } } else if ( c->op == LDAP_MOD_DELETE ) { switch( c->type ) { case BS_EXT: if ( c->valx < 0 ) { si->si_extensions = 0; rc = 0; } else { slap_mask_t dels = 0; rc = verbs_to_mask( c->argc, c->argv, bs_exts, &dels ); if ( rc == 0 ) si->si_extensions ^= dels; } return rc; case BS_OPS: if ( c->valx < 0 ) { si->si_ops = 0; rc = 0; } else { slap_mask_t dels = 0; rc = verbs_to_mask( c->argc, c->argv, ov_ops, &dels ); if ( rc == 0 ) si->si_ops ^= dels; } return rc; case BS_RESP: if ( c->valx < 0 ) { si->si_resps = 0; rc = 0; } else { slap_mask_t dels = 0; rc = verbs_to_mask( c->argc, c->argv, ov_resps, &dels ); if ( rc == 0 ) si->si_resps ^= dels; } return rc; } } else { switch( c->type ) { case BS_EXT: return verbs_to_mask( c->argc, c->argv, bs_exts, &si->si_extensions ); case BS_OPS: return verbs_to_mask( c->argc, c->argv, ov_ops, &si->si_ops ); case BS_RESP: return verbs_to_mask( c->argc, c->argv, ov_resps, &si->si_resps ); } } return 1; }