diff options
Diffstat (limited to 'nss/nss_database.h')
-rw-r--r-- | nss/nss_database.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/nss/nss_database.h b/nss/nss_database.h new file mode 100644 index 0000000..7a91b72 --- /dev/null +++ b/nss/nss_database.h @@ -0,0 +1,88 @@ +/* Mapping NSS services to action lists. + Copyright (C) 2020 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#ifndef _NSS_DATABASE_H +#define _NSS_DATABASE_H + +#include <file_change_detection.h> + +/* Each "line" in nsswitch.conf maps a supported database (example: + passwd) to one or more name service providers (example: files dns). + Internally, each name service provider (example: dns) is a + dynamically loadable module (i.e. libnss_dns.so), managed by + nss_module.h. The sequence of providers and rules (example: files + [SUCCESS=RETURN] dns) is mapped by nss_action.h to a cached entry + which encodes the sequence of modules and rules. Keeping track of + all supported databases and their corresponding actions is done + here. + + The key entry is __nss_database_get, which provides a set of + actions which can be used with nss_lookup_function() and + nss_next(). Callers should assume that these functions are fast, + and should not cache the result longer than needed. */ + +#include "nss_action.h" + +/* The enumeration literal in enum nss_database for the database NAME + (e.g., nss_database_hosts for hosts). */ +#define NSS_DATABASE_LITERAL(name) nss_database_##name + +enum nss_database +{ +#define DEFINE_DATABASE(name) NSS_DATABASE_LITERAL (name), +#include "databases.def" +#undef DEFINE_DATABASE + + /* Total number of databases. */ + NSS_DATABASE_COUNT +}; + + +/* Looks up the action list for DB and stores it in *ACTIONS. Returns + true on success or false on failure. Success can mean that + *ACTIONS is NULL. */ +bool __nss_database_get (enum nss_database db, nss_action_list *actions) + attribute_hidden; + +/* Like __nss_database_get, but does not reload /etc/nsswitch.conf + from disk. This assumes that there has been a previous successful + __nss_database_get call (which may not have returned any data). */ +nss_action_list __nss_database_get_noreload (enum nss_database db) + attribute_hidden; + +/* Called from __libc_freeres. */ +void __nss_database_freeres (void) attribute_hidden; + +/* Internal type. Exposed only for fork handling purposes. */ +struct nss_database_data +{ + struct file_change_detection nsswitch_conf; + nss_action_list services[NSS_DATABASE_COUNT]; + int reload_disabled; /* Actually bool; int for atomic access. */ + bool initialized; +}; + +/* Called by fork in the parent process, before forking. */ +void __nss_database_fork_prepare_parent (struct nss_database_data *data) + attribute_hidden; + +/* Called by fork in the new subprocess, after forking. */ +void __nss_database_fork_subprocess (struct nss_database_data *data) + attribute_hidden; + +#endif /* _NSS_DATABASE_H */ |