106a99fe3SHajimu UMEMOTO /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3d915a14eSPedro F. Giffuni * 406a99fe3SHajimu UMEMOTO * Copyright (c) 2005 Michael Bushkov <bushman@rsu.ru> 506a99fe3SHajimu UMEMOTO * All rights reserved. 606a99fe3SHajimu UMEMOTO * 706a99fe3SHajimu UMEMOTO * Redistribution and use in source and binary forms, with or without 806a99fe3SHajimu UMEMOTO * modification, are permitted provided that the following conditions 906a99fe3SHajimu UMEMOTO * are met: 1006a99fe3SHajimu UMEMOTO * 1. Redistributions of source code must retain the above copyright 1106a99fe3SHajimu UMEMOTO * notice, this list of conditions and the following disclaimer. 1206a99fe3SHajimu UMEMOTO * 2. Redistributions in binary form must reproduce the above copyright 1306a99fe3SHajimu UMEMOTO * notice, this list of conditions and the following disclaimer in the 1406a99fe3SHajimu UMEMOTO * documentation and/or other materials provided with the distribution. 1506a99fe3SHajimu UMEMOTO * 1606a99fe3SHajimu UMEMOTO * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1706a99fe3SHajimu UMEMOTO * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1806a99fe3SHajimu UMEMOTO * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1906a99fe3SHajimu UMEMOTO * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2006a99fe3SHajimu UMEMOTO * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2106a99fe3SHajimu UMEMOTO * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2206a99fe3SHajimu UMEMOTO * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2306a99fe3SHajimu UMEMOTO * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2406a99fe3SHajimu UMEMOTO * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2506a99fe3SHajimu UMEMOTO * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2606a99fe3SHajimu UMEMOTO * SUCH DAMAGE. 2706a99fe3SHajimu UMEMOTO */ 2806a99fe3SHajimu UMEMOTO 2906a99fe3SHajimu UMEMOTO #ifndef __NS_CACHE_H__ 3006a99fe3SHajimu UMEMOTO #define __NS_CACHE_H__ 3106a99fe3SHajimu UMEMOTO 3206a99fe3SHajimu UMEMOTO #include "nscachedcli.h" 3306a99fe3SHajimu UMEMOTO 3406a99fe3SHajimu UMEMOTO typedef int (*nss_cache_id_func_t)(char *, size_t *, va_list, void *); 3506a99fe3SHajimu UMEMOTO typedef int (*nss_cache_marshal_func_t)(char *, size_t *, void *, va_list, 3606a99fe3SHajimu UMEMOTO void *); 3706a99fe3SHajimu UMEMOTO typedef int (*nss_cache_unmarshal_func_t)(char *, size_t, void *, va_list, 3806a99fe3SHajimu UMEMOTO void *); 3906a99fe3SHajimu UMEMOTO 4006a99fe3SHajimu UMEMOTO typedef void (*nss_set_mp_ws_func_t)(cached_mp_write_session); 4106a99fe3SHajimu UMEMOTO typedef cached_mp_write_session (*nss_get_mp_ws_func_t)(void); 4206a99fe3SHajimu UMEMOTO 4306a99fe3SHajimu UMEMOTO typedef void (*nss_set_mp_rs_func_t)(cached_mp_read_session); 4406a99fe3SHajimu UMEMOTO typedef cached_mp_read_session (*nss_get_mp_rs_func_t)(void); 4506a99fe3SHajimu UMEMOTO 4606a99fe3SHajimu UMEMOTO typedef struct _nss_cache_info { 4706a99fe3SHajimu UMEMOTO char *entry_name; 4806a99fe3SHajimu UMEMOTO void *mdata; 4906a99fe3SHajimu UMEMOTO 5006a99fe3SHajimu UMEMOTO /* 5106a99fe3SHajimu UMEMOTO * These 3 functions should be implemented specifically for each 5206a99fe3SHajimu UMEMOTO * nsswitch database. 5306a99fe3SHajimu UMEMOTO */ 5406a99fe3SHajimu UMEMOTO nss_cache_id_func_t id_func; /* marshals the request parameters */ 5506a99fe3SHajimu UMEMOTO nss_cache_marshal_func_t marshal_func; /* marshals response */ 5606a99fe3SHajimu UMEMOTO nss_cache_unmarshal_func_t unmarshal_func; /* unmarshals response */ 5706a99fe3SHajimu UMEMOTO 5806a99fe3SHajimu UMEMOTO /* 5906a99fe3SHajimu UMEMOTO * These 4 functions should be generated with NSS_MP_CACHE_HANDLING 6006a99fe3SHajimu UMEMOTO * macro. 6106a99fe3SHajimu UMEMOTO */ 6206a99fe3SHajimu UMEMOTO nss_set_mp_ws_func_t set_mp_ws_func; /* sets current write session */ 6306a99fe3SHajimu UMEMOTO nss_get_mp_ws_func_t get_mp_ws_func; /* gets current write session */ 6406a99fe3SHajimu UMEMOTO 6506a99fe3SHajimu UMEMOTO nss_set_mp_rs_func_t set_mp_rs_func; /* sets current read session */ 6606a99fe3SHajimu UMEMOTO nss_get_mp_rs_func_t get_mp_rs_func; /* gets current read session */ 6706a99fe3SHajimu UMEMOTO } nss_cache_info; 6806a99fe3SHajimu UMEMOTO 6906a99fe3SHajimu UMEMOTO /* 7006a99fe3SHajimu UMEMOTO * NSS_MP_CACHE_HANDLING implements the set_mp_ws, get_mp_ws, set_mp_rs, 7106a99fe3SHajimu UMEMOTO * get_mp_rs functions, that are used in _nss_cache_info. It uses 7206a99fe3SHajimu UMEMOTO * NSS_TLS_HANDLING macro to organize thread local storage. 7306a99fe3SHajimu UMEMOTO */ 7406a99fe3SHajimu UMEMOTO #define NSS_MP_CACHE_HANDLING(name) \ 7506a99fe3SHajimu UMEMOTO struct name##_mp_state { \ 7606a99fe3SHajimu UMEMOTO cached_mp_write_session mp_write_session; \ 7706a99fe3SHajimu UMEMOTO cached_mp_read_session mp_read_session; \ 7806a99fe3SHajimu UMEMOTO }; \ 7906a99fe3SHajimu UMEMOTO \ 8006a99fe3SHajimu UMEMOTO static void \ 8106a99fe3SHajimu UMEMOTO name##_mp_endstate(void *s) { \ 8206a99fe3SHajimu UMEMOTO struct name##_mp_state *mp_state; \ 8306a99fe3SHajimu UMEMOTO \ 8406a99fe3SHajimu UMEMOTO mp_state = (struct name##_mp_state *)s; \ 8506a99fe3SHajimu UMEMOTO if (mp_state->mp_write_session != INVALID_CACHED_MP_WRITE_SESSION)\ 8606a99fe3SHajimu UMEMOTO __abandon_cached_mp_write_session(mp_state->mp_write_session);\ 8706a99fe3SHajimu UMEMOTO \ 8806a99fe3SHajimu UMEMOTO if (mp_state->mp_read_session != INVALID_CACHED_MP_READ_SESSION)\ 8906a99fe3SHajimu UMEMOTO __close_cached_mp_read_session(mp_state->mp_read_session);\ 9006a99fe3SHajimu UMEMOTO } \ 9106a99fe3SHajimu UMEMOTO NSS_TLS_HANDLING(name##_mp); \ 9206a99fe3SHajimu UMEMOTO \ 9306a99fe3SHajimu UMEMOTO static void \ 9406a99fe3SHajimu UMEMOTO name##_set_mp_ws(cached_mp_write_session ws) \ 9506a99fe3SHajimu UMEMOTO { \ 9606a99fe3SHajimu UMEMOTO struct name##_mp_state *mp_state; \ 9706a99fe3SHajimu UMEMOTO int res; \ 9806a99fe3SHajimu UMEMOTO \ 9906a99fe3SHajimu UMEMOTO res = name##_mp_getstate(&mp_state); \ 10006a99fe3SHajimu UMEMOTO if (res != 0) \ 10106a99fe3SHajimu UMEMOTO return; \ 10206a99fe3SHajimu UMEMOTO \ 10306a99fe3SHajimu UMEMOTO mp_state->mp_write_session = ws; \ 10406a99fe3SHajimu UMEMOTO } \ 10506a99fe3SHajimu UMEMOTO \ 10606a99fe3SHajimu UMEMOTO static cached_mp_write_session \ 10706a99fe3SHajimu UMEMOTO name##_get_mp_ws(void) \ 10806a99fe3SHajimu UMEMOTO { \ 10906a99fe3SHajimu UMEMOTO struct name##_mp_state *mp_state; \ 11006a99fe3SHajimu UMEMOTO int res; \ 11106a99fe3SHajimu UMEMOTO \ 11206a99fe3SHajimu UMEMOTO res = name##_mp_getstate(&mp_state); \ 11306a99fe3SHajimu UMEMOTO if (res != 0) \ 11406a99fe3SHajimu UMEMOTO return (INVALID_CACHED_MP_WRITE_SESSION); \ 11506a99fe3SHajimu UMEMOTO \ 11606a99fe3SHajimu UMEMOTO return (mp_state->mp_write_session); \ 11706a99fe3SHajimu UMEMOTO } \ 11806a99fe3SHajimu UMEMOTO \ 11906a99fe3SHajimu UMEMOTO static void \ 12006a99fe3SHajimu UMEMOTO name##_set_mp_rs(cached_mp_read_session rs) \ 12106a99fe3SHajimu UMEMOTO { \ 12206a99fe3SHajimu UMEMOTO struct name##_mp_state *mp_state; \ 12306a99fe3SHajimu UMEMOTO int res; \ 12406a99fe3SHajimu UMEMOTO \ 12506a99fe3SHajimu UMEMOTO res = name##_mp_getstate(&mp_state); \ 12606a99fe3SHajimu UMEMOTO if (res != 0) \ 12706a99fe3SHajimu UMEMOTO return; \ 12806a99fe3SHajimu UMEMOTO \ 12906a99fe3SHajimu UMEMOTO mp_state->mp_read_session = rs; \ 13006a99fe3SHajimu UMEMOTO } \ 13106a99fe3SHajimu UMEMOTO \ 13206a99fe3SHajimu UMEMOTO static cached_mp_read_session \ 13306a99fe3SHajimu UMEMOTO name##_get_mp_rs(void) \ 13406a99fe3SHajimu UMEMOTO { \ 13506a99fe3SHajimu UMEMOTO struct name##_mp_state *mp_state; \ 13606a99fe3SHajimu UMEMOTO int res; \ 13706a99fe3SHajimu UMEMOTO \ 13806a99fe3SHajimu UMEMOTO res = name##_mp_getstate(&mp_state); \ 13906a99fe3SHajimu UMEMOTO if (res != 0) \ 14006a99fe3SHajimu UMEMOTO return (INVALID_CACHED_MP_READ_SESSION); \ 14106a99fe3SHajimu UMEMOTO \ 14206a99fe3SHajimu UMEMOTO return (mp_state->mp_read_session); \ 14306a99fe3SHajimu UMEMOTO } 14406a99fe3SHajimu UMEMOTO 14506a99fe3SHajimu UMEMOTO /* 14606a99fe3SHajimu UMEMOTO * These macros should be used to initialize _nss_cache_info structure. For 14706a99fe3SHajimu UMEMOTO * multipart queries in setXXXent and getXXXent functions mf and uf 14806a99fe3SHajimu UMEMOTO * (marshal function and unmarshal function) should be both NULL. 14906a99fe3SHajimu UMEMOTO */ 15006a99fe3SHajimu UMEMOTO #define NS_COMMON_CACHE_INFO_INITIALIZER(name, mdata, if, mf, uf) \ 15106a99fe3SHajimu UMEMOTO {#name, mdata, if, mf, uf, NULL, NULL, NULL, NULL} 15206a99fe3SHajimu UMEMOTO #define NS_MP_CACHE_INFO_INITIALIZER(name, mdata, mf, uf) \ 15306a99fe3SHajimu UMEMOTO {#name, mdata, NULL, mf, uf, name##_set_mp_ws, name##_get_mp_ws,\ 15406a99fe3SHajimu UMEMOTO name##_set_mp_rs, name##_get_mp_rs } 15506a99fe3SHajimu UMEMOTO 15606a99fe3SHajimu UMEMOTO /* 15706a99fe3SHajimu UMEMOTO * Analog of other XXX_CB macros. Has the pointer to _nss_cache_info 15806a99fe3SHajimu UMEMOTO * structure as the only argument. 15906a99fe3SHajimu UMEMOTO */ 16006a99fe3SHajimu UMEMOTO #define NS_CACHE_CB(cinfo) {NSSRC_CACHE, __nss_cache_handler, (void *)(cinfo) }, 16106a99fe3SHajimu UMEMOTO 16206a99fe3SHajimu UMEMOTO /* args are: current pointer, current buffer, initial buffer, pointer type */ 16306a99fe3SHajimu UMEMOTO #define NS_APPLY_OFFSET(cp, cb, ib, p_type) \ 16406a99fe3SHajimu UMEMOTO if ((cp) != NULL) \ 16506a99fe3SHajimu UMEMOTO (cp) = (p_type)((char *)(cb) + (size_t)(cp) - (size_t)(ib)) 16606a99fe3SHajimu UMEMOTO /* 16706a99fe3SHajimu UMEMOTO * Gets new pointer from the marshalled buffer by uisng initial address 16806a99fe3SHajimu UMEMOTO * and initial buffer address 16906a99fe3SHajimu UMEMOTO */ 17006a99fe3SHajimu UMEMOTO #define NS_GET_NEWP(cp, cb, ib) \ 17106a99fe3SHajimu UMEMOTO ((char *)(cb) + (size_t)(cp) - (size_t)(ib)) 17206a99fe3SHajimu UMEMOTO 17306a99fe3SHajimu UMEMOTO typedef struct _nss_cache_data { 17406a99fe3SHajimu UMEMOTO char *key; 17506a99fe3SHajimu UMEMOTO size_t key_size; 17606a99fe3SHajimu UMEMOTO 17706a99fe3SHajimu UMEMOTO nss_cache_info const *info; 17806a99fe3SHajimu UMEMOTO } nss_cache_data; 17906a99fe3SHajimu UMEMOTO 18006a99fe3SHajimu UMEMOTO __BEGIN_DECLS 18106a99fe3SHajimu UMEMOTO /* dummy function, which is needed to make nss_method_lookup happy */ 18206a99fe3SHajimu UMEMOTO extern int __nss_cache_handler(void *, void *, va_list); 18306a99fe3SHajimu UMEMOTO 18406a99fe3SHajimu UMEMOTO #ifdef _NS_PRIVATE 18506a99fe3SHajimu UMEMOTO extern int __nss_common_cache_read(void *, void *, va_list); 18606a99fe3SHajimu UMEMOTO extern int __nss_common_cache_write(void *, void *, va_list); 18706a99fe3SHajimu UMEMOTO extern int __nss_common_cache_write_negative(void *); 18806a99fe3SHajimu UMEMOTO 18906a99fe3SHajimu UMEMOTO extern int __nss_mp_cache_read(void *, void *, va_list); 19006a99fe3SHajimu UMEMOTO extern int __nss_mp_cache_write(void *, void *, va_list); 19106a99fe3SHajimu UMEMOTO extern int __nss_mp_cache_write_submit(void *, void *, va_list); 19206a99fe3SHajimu UMEMOTO extern int __nss_mp_cache_end(void *, void *, va_list); 19306a99fe3SHajimu UMEMOTO #endif /* _NS_PRIVATE */ 19406a99fe3SHajimu UMEMOTO 19506a99fe3SHajimu UMEMOTO __END_DECLS 19606a99fe3SHajimu UMEMOTO 19706a99fe3SHajimu UMEMOTO #endif 198