1*549b59edSchristos /* $NetBSD: options.c,v 1.3 2021/08/14 16:14:55 christos Exp $ */
24e6df137Slukem
3d11b170bStron /* $OpenLDAP$ */
42de962bdSlukem /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
52de962bdSlukem *
6*549b59edSchristos * Copyright 1998-2021 The OpenLDAP Foundation.
72de962bdSlukem * All rights reserved.
82de962bdSlukem *
92de962bdSlukem * Redistribution and use in source and binary forms, with or without
102de962bdSlukem * modification, are permitted only as authorized by the OpenLDAP
112de962bdSlukem * Public License.
122de962bdSlukem *
132de962bdSlukem * A copy of this license is available in the file LICENSE in the
142de962bdSlukem * top-level directory of the distribution or, alternatively, at
152de962bdSlukem * <http://www.OpenLDAP.org/license.html>.
162de962bdSlukem */
172de962bdSlukem
18376af7d7Schristos #include <sys/cdefs.h>
19*549b59edSchristos __RCSID("$NetBSD: options.c,v 1.3 2021/08/14 16:14:55 christos Exp $");
20376af7d7Schristos
212de962bdSlukem #include "portable.h"
222de962bdSlukem
232de962bdSlukem #include <ac/stdlib.h>
242de962bdSlukem #include <ac/string.h>
252de962bdSlukem #include <ac/stdarg.h>
262de962bdSlukem #include "lber-int.h"
272de962bdSlukem
282de962bdSlukem char ber_pvt_opt_on; /* used to get a non-NULL address for *_OPT_ON */
292de962bdSlukem
302de962bdSlukem struct lber_options ber_int_options = {
312de962bdSlukem LBER_UNINITIALIZED, 0, 0 };
322de962bdSlukem
332de962bdSlukem static BerMemoryFunctions ber_int_memory_fns_datum;
342de962bdSlukem
352de962bdSlukem int
ber_get_option(void * item,int option,void * outvalue)362de962bdSlukem ber_get_option(
372de962bdSlukem void *item,
382de962bdSlukem int option,
392de962bdSlukem void *outvalue)
402de962bdSlukem {
412de962bdSlukem const BerElement *ber;
422de962bdSlukem const Sockbuf *sb;
432de962bdSlukem
442de962bdSlukem if(outvalue == NULL) {
452de962bdSlukem /* no place to get to */
462de962bdSlukem ber_errno = LBER_ERROR_PARAM;
472de962bdSlukem return LBER_OPT_ERROR;
482de962bdSlukem }
492de962bdSlukem
502de962bdSlukem if(item == NULL) {
512de962bdSlukem switch ( option ) {
522de962bdSlukem case LBER_OPT_BER_DEBUG:
532de962bdSlukem * (int *) outvalue = ber_int_debug;
542de962bdSlukem return LBER_OPT_SUCCESS;
552de962bdSlukem
562de962bdSlukem case LBER_OPT_MEMORY_INUSE:
57*549b59edSchristos /* The memory inuse is a global variable on kernel implementations.
582de962bdSlukem * This means that memory debug is shared by all LDAP processes
592de962bdSlukem * so for this variable to have much meaning, only one LDAP process
602de962bdSlukem * should be running and memory inuse should be initialized to zero
612de962bdSlukem * using the lber_set_option() function during startup.
622de962bdSlukem * The counter is not accurate for multithreaded ldap applications.
632de962bdSlukem */
642de962bdSlukem #ifdef LDAP_MEMORY_DEBUG
652de962bdSlukem * (int *) outvalue = ber_int_meminuse;
662de962bdSlukem return LBER_OPT_SUCCESS;
672de962bdSlukem #else
682de962bdSlukem return LBER_OPT_ERROR;
692de962bdSlukem #endif
702de962bdSlukem
712de962bdSlukem case LBER_OPT_LOG_PRINT_FILE:
722de962bdSlukem *((FILE**)outvalue) = (FILE*)ber_pvt_err_file;
732de962bdSlukem return LBER_OPT_SUCCESS;
74*549b59edSchristos
75*549b59edSchristos case LBER_OPT_LOG_PRINT_FN:
76*549b59edSchristos *(BER_LOG_PRINT_FN *)outvalue = ber_pvt_log_print;
77*549b59edSchristos return LBER_OPT_SUCCESS;
782de962bdSlukem }
792de962bdSlukem
802de962bdSlukem ber_errno = LBER_ERROR_PARAM;
812de962bdSlukem return LBER_OPT_ERROR;
822de962bdSlukem }
832de962bdSlukem
842de962bdSlukem ber = item;
852de962bdSlukem sb = item;
862de962bdSlukem
872de962bdSlukem switch(option) {
882de962bdSlukem case LBER_OPT_BER_OPTIONS:
892de962bdSlukem assert( LBER_VALID( ber ) );
902de962bdSlukem * (int *) outvalue = ber->ber_options;
912de962bdSlukem return LBER_OPT_SUCCESS;
922de962bdSlukem
932de962bdSlukem case LBER_OPT_BER_DEBUG:
942de962bdSlukem assert( LBER_VALID( ber ) );
952de962bdSlukem * (int *) outvalue = ber->ber_debug;
962de962bdSlukem return LBER_OPT_SUCCESS;
972de962bdSlukem
982de962bdSlukem case LBER_OPT_BER_REMAINING_BYTES:
992de962bdSlukem assert( LBER_VALID( ber ) );
1002de962bdSlukem *((ber_len_t *) outvalue) = ber_pvt_ber_remaining(ber);
1012de962bdSlukem return LBER_OPT_SUCCESS;
1022de962bdSlukem
1032de962bdSlukem case LBER_OPT_BER_TOTAL_BYTES:
1042de962bdSlukem assert( LBER_VALID( ber ) );
1052de962bdSlukem *((ber_len_t *) outvalue) = ber_pvt_ber_total(ber);
1062de962bdSlukem return LBER_OPT_SUCCESS;
1072de962bdSlukem
1082de962bdSlukem case LBER_OPT_BER_BYTES_TO_WRITE:
1092de962bdSlukem assert( LBER_VALID( ber ) );
1102de962bdSlukem *((ber_len_t *) outvalue) = ber_pvt_ber_write(ber);
1112de962bdSlukem return LBER_OPT_SUCCESS;
1122de962bdSlukem
1132de962bdSlukem case LBER_OPT_BER_MEMCTX:
1142de962bdSlukem assert( LBER_VALID( ber ) );
1152de962bdSlukem *((void **) outvalue) = ber->ber_memctx;
1162de962bdSlukem return LBER_OPT_SUCCESS;
1172de962bdSlukem
1182de962bdSlukem default:
1192de962bdSlukem /* bad param */
1202de962bdSlukem ber_errno = LBER_ERROR_PARAM;
1212de962bdSlukem break;
1222de962bdSlukem }
1232de962bdSlukem
1242de962bdSlukem return LBER_OPT_ERROR;
1252de962bdSlukem }
1262de962bdSlukem
1272de962bdSlukem int
ber_set_option(void * item,int option,LDAP_CONST void * invalue)1282de962bdSlukem ber_set_option(
1292de962bdSlukem void *item,
1302de962bdSlukem int option,
1312de962bdSlukem LDAP_CONST void *invalue)
1322de962bdSlukem {
1332de962bdSlukem BerElement *ber;
1342de962bdSlukem Sockbuf *sb;
1352de962bdSlukem
1362de962bdSlukem if(invalue == NULL) {
1372de962bdSlukem /* no place to set from */
1382de962bdSlukem ber_errno = LBER_ERROR_PARAM;
1392de962bdSlukem return LBER_OPT_ERROR;
1402de962bdSlukem }
1412de962bdSlukem
1422de962bdSlukem if(item == NULL) {
1432de962bdSlukem switch ( option ) {
1442de962bdSlukem case LBER_OPT_BER_DEBUG:
1452de962bdSlukem ber_int_debug = * (const int *) invalue;
1462de962bdSlukem return LBER_OPT_SUCCESS;
1472de962bdSlukem
1482de962bdSlukem case LBER_OPT_LOG_PRINT_FN:
1492de962bdSlukem ber_pvt_log_print = (BER_LOG_PRINT_FN) invalue;
1502de962bdSlukem return LBER_OPT_SUCCESS;
1512de962bdSlukem
1522de962bdSlukem case LBER_OPT_LOG_PRINT_FILE:
1532de962bdSlukem ber_pvt_err_file = (void *) invalue;
1542de962bdSlukem return LBER_OPT_SUCCESS;
1552de962bdSlukem
1562de962bdSlukem case LBER_OPT_MEMORY_INUSE:
157*549b59edSchristos /* The memory inuse is a global variable on kernel implementations.
1582de962bdSlukem * This means that memory debug is shared by all LDAP processes
1592de962bdSlukem * so for this variable to have much meaning, only one LDAP process
1602de962bdSlukem * should be running and memory inuse should be initialized to zero
1612de962bdSlukem * using the lber_set_option() function during startup.
1622de962bdSlukem * The counter is not accurate for multithreaded applications.
1632de962bdSlukem */
1642de962bdSlukem #ifdef LDAP_MEMORY_DEBUG
1652de962bdSlukem ber_int_meminuse = * (int *) invalue;
1662de962bdSlukem return LBER_OPT_SUCCESS;
1672de962bdSlukem #else
1682de962bdSlukem return LBER_OPT_ERROR;
1692de962bdSlukem #endif
1702de962bdSlukem case LBER_OPT_MEMORY_FNS:
1712de962bdSlukem if ( ber_int_memory_fns == NULL )
1722de962bdSlukem {
1732de962bdSlukem const BerMemoryFunctions *f =
1742de962bdSlukem (const BerMemoryFunctions *) invalue;
1752de962bdSlukem /* make sure all functions are provided */
1762de962bdSlukem if(!( f->bmf_malloc && f->bmf_calloc
1772de962bdSlukem && f->bmf_realloc && f->bmf_free ))
1782de962bdSlukem {
1792de962bdSlukem ber_errno = LBER_ERROR_PARAM;
1802de962bdSlukem return LBER_OPT_ERROR;
1812de962bdSlukem }
1822de962bdSlukem
1832de962bdSlukem ber_int_memory_fns = &ber_int_memory_fns_datum;
1842de962bdSlukem
1852de962bdSlukem AC_MEMCPY(ber_int_memory_fns, f,
1862de962bdSlukem sizeof(BerMemoryFunctions));
1872de962bdSlukem
1882de962bdSlukem return LBER_OPT_SUCCESS;
1892de962bdSlukem }
1902de962bdSlukem break;
1912de962bdSlukem
1922de962bdSlukem case LBER_OPT_LOG_PROC:
1932de962bdSlukem ber_int_log_proc = (BER_LOG_FN)invalue;
1942de962bdSlukem return LBER_OPT_SUCCESS;
1952de962bdSlukem }
1962de962bdSlukem
1972de962bdSlukem ber_errno = LBER_ERROR_PARAM;
1982de962bdSlukem return LBER_OPT_ERROR;
1992de962bdSlukem }
2002de962bdSlukem
2012de962bdSlukem ber = item;
2022de962bdSlukem sb = item;
2032de962bdSlukem
2042de962bdSlukem switch(option) {
2052de962bdSlukem case LBER_OPT_BER_OPTIONS:
2062de962bdSlukem assert( LBER_VALID( ber ) );
2072de962bdSlukem ber->ber_options = * (const int *) invalue;
2082de962bdSlukem return LBER_OPT_SUCCESS;
2092de962bdSlukem
2102de962bdSlukem case LBER_OPT_BER_DEBUG:
2112de962bdSlukem assert( LBER_VALID( ber ) );
2122de962bdSlukem ber->ber_debug = * (const int *) invalue;
2132de962bdSlukem return LBER_OPT_SUCCESS;
2142de962bdSlukem
2152de962bdSlukem case LBER_OPT_BER_REMAINING_BYTES:
2162de962bdSlukem assert( LBER_VALID( ber ) );
2172de962bdSlukem ber->ber_end = &ber->ber_ptr[* (const ber_len_t *) invalue];
2182de962bdSlukem return LBER_OPT_SUCCESS;
2192de962bdSlukem
2202de962bdSlukem case LBER_OPT_BER_TOTAL_BYTES:
2212de962bdSlukem assert( LBER_VALID( ber ) );
2222de962bdSlukem ber->ber_end = &ber->ber_buf[* (const ber_len_t *) invalue];
2232de962bdSlukem return LBER_OPT_SUCCESS;
2242de962bdSlukem
2252de962bdSlukem case LBER_OPT_BER_BYTES_TO_WRITE:
2262de962bdSlukem assert( LBER_VALID( ber ) );
2272de962bdSlukem ber->ber_ptr = &ber->ber_buf[* (const ber_len_t *) invalue];
2282de962bdSlukem return LBER_OPT_SUCCESS;
2292de962bdSlukem
2302de962bdSlukem case LBER_OPT_BER_MEMCTX:
2312de962bdSlukem assert( LBER_VALID( ber ) );
2322de962bdSlukem ber->ber_memctx = *(void **)invalue;
2332de962bdSlukem return LBER_OPT_SUCCESS;
2342de962bdSlukem
2352de962bdSlukem default:
2362de962bdSlukem /* bad param */
2372de962bdSlukem ber_errno = LBER_ERROR_PARAM;
2382de962bdSlukem break;
2392de962bdSlukem }
2402de962bdSlukem
2412de962bdSlukem return LBER_OPT_ERROR;
2422de962bdSlukem }
243