/* Copyright (C) 2019 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef __SSSD_NSS_DL_LOAD_H__ #define __SSSD_NSS_DL_LOAD_H__ #include #include #include #include #include "util/util_errors.h" #include "sss_client/nss_compat.h" struct sss_nss_ops { enum nss_status (*getpwnam_r)(const char *name, struct passwd *result, char *buffer, size_t buflen, int *errnop); enum nss_status (*getpwuid_r)(uid_t uid, struct passwd *result, char *buffer, size_t buflen, int *errnop); enum nss_status (*setpwent)(void); enum nss_status (*getpwent_r)(struct passwd *result, char *buffer, size_t buflen, int *errnop); enum nss_status (*endpwent)(void); enum nss_status (*getgrnam_r)(const char *name, struct group *result, char *buffer, size_t buflen, int *errnop); enum nss_status (*getgrgid_r)(gid_t gid, struct group *result, char *buffer, size_t buflen, int *errnop); enum nss_status (*setgrent)(void); enum nss_status (*getgrent_r)(struct group *result, char *buffer, size_t buflen, int *errnop); enum nss_status (*endgrent)(void); enum nss_status (*initgroups_dyn)(const char *user, gid_t group, long int *start, long int *size, gid_t **groups, long int limit, int *errnop); enum nss_status (*setnetgrent)(const char *netgroup, struct __netgrent *result); enum nss_status (*getnetgrent_r)(struct __netgrent *result, char *buffer, size_t buflen, int *errnop); enum nss_status (*endnetgrent)(struct __netgrent *result); /* Services */ enum nss_status (*getservbyname_r)(const char *name, const char *protocol, struct servent *result, char *buffer, size_t buflen, int *errnop); enum nss_status (*getservbyport_r)(int port, const char *protocol, struct servent *result, char *buffer, size_t buflen, int *errnop); enum nss_status (*setservent)(void); enum nss_status (*getservent_r)(struct servent *result, char *buffer, size_t buflen, int *errnop); enum nss_status (*endservent)(void); /* Hosts */ enum nss_status (*gethostbyname_r)(const char *name, struct hostent *result, char *buffer, size_t buflen, int *errnop, int *h_errnop); enum nss_status (*gethostbyname2_r)(const char *name, int af, struct hostent *result, char *buffer, size_t buflen, int *errnop, int *h_errnop); enum nss_status (*gethostbyaddr_r)(const void *addr, socklen_t addrlen, int af, struct hostent *result, char *buffer, size_t buflen, int *errnop, int *h_errnop); enum nss_status (*sethostent)(void); enum nss_status (*gethostent_r)(struct hostent *ret, char *buf, size_t buflen, int *errnop, int *h_errnop); enum nss_status (*endhostent)(void); /* Networks */ enum nss_status (*getnetbyname_r)(const char *name, struct netent *result, char *buffer, size_t buflen, int *errnop, int *h_errnop); enum nss_status (*getnetbyaddr_r)(uint32_t addr, int type, struct netent *result, char *buffer, size_t buflen, int *errnop, int *h_errnop); enum nss_status (*setnetent)(void); enum nss_status (*getnetent_r)(struct netent *ret, char *buffer, size_t buflen, int *errnop, int *h_errnop); enum nss_status (*endnetent)(void); void *dl_handle; }; struct sss_nss_symbols { void **fptr; bool mandatory; const char *fname; }; errno_t sss_load_nss_symbols(struct sss_nss_ops *ops, const char *libname, struct sss_nss_symbols *syms, size_t nsyms); #endif /* __SSSD_NSS_DL_LOAD_H__ */