nss_netgroup.c revision c640ae818270b1e8d57190516587d06c007d3938
/*
SSSD
Authors:
Stephen Gallagher <sgallagh@redhat.com>
Copyright (C) 2010 Red Hat
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 <http://www.gnu.org/licenses/>.
*/
#include <nss.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "sss_cli.h"
#include "nss_compat.h"
#define MAX_NETGR_NAME_LENGTH 2048
static struct sss_nss_getnetgrent_data {
char *name;
/*
* Replies:
*
* 0-3: 32bit unsigned number of results
* For each result:
* 8-X: sequence of \0 terminated strings representing tuple
* (host, user, domain)
*/
struct sss_nss_netgr_rep {
struct __netgrent *result;
char *buffer;
};
static void sss_nss_getnetgrent_data_clean(void) {
}
}
}
{
char *sbuf;
if (*len < 3) {
/* Not enough space for data, bad packet */
return EBADMSG;
}
/* Host value */
i = 0;
i++;
dlen--;
}
if (slen <= i) { /* premature end of buf */
return EBADMSG;
}
if (dlen <= 0) { /* not enough memory */
return ERANGE; /* not ENOMEM, ERANGE is what glibc looks for */
}
i++;
dlen--;
/* libc expects NULL instead of empty string */
}
/* User value */
i++;
dlen--;
}
if (slen <= i) { /* premature end of buf */
return EBADMSG;
}
if (dlen <= 0) { /* not enough memory */
return ERANGE; /* not ENOMEM, ERANGE is what glibc looks for */
}
i++;
dlen--;
/* libc expects NULL instead of empty string */
}
/* Domain value */
i++;
dlen--;
}
if (slen <= i) { /* premature end of buf */
return EBADMSG;
}
if (dlen <= 0) { /* not enough memory */
return ERANGE; /* not ENOMEM, ERANGE is what glibc looks for */
}
i++;
dlen--;
/* libc expects NULL instead of empty string */
}
return 0;
}
struct __netgrent *result)
{
enum nss_status nret;
struct sss_cli_req_data rd;
int errnop;
if (!netgroup) return NSS_STATUS_NOTFOUND;
/* make sure we do not have leftovers, and release memory */
if (ret != 0) return NSS_STATUS_NOTFOUND;
return NSS_STATUS_TRYAGAIN;
}
if (nret != NSS_STATUS_SUCCESS) {
return nret;
}
/* no results if not found */
return NSS_STATUS_NOTFOUND;
}
return NSS_STATUS_SUCCESS;
}
int *errnop)
{
struct sss_cli_req_data rd;
struct sss_nss_netgr_rep netgrrep;
enum nss_status nret;
int ret;
/* Caught once glibc passing in buffer == 0x0 */
/* If we're already processing result data, continue to
* return it.
*/
if (ret != 0) {
return NSS_STATUS_TRYAGAIN;
}
return NSS_STATUS_SUCCESS;
}
/* Release memory, if any */
/* retrieve no more than SSS_NSS_MAX_ENTRIES at a time */
if (nret != NSS_STATUS_SUCCESS) {
return nret;
}
/* no results if not found */
return NSS_STATUS_RETURN;
}
/* skip metadata fields */
/* call again ourselves, this will return the first result */
}
enum nss_status _nss_sss_endnetgrent(void)
{
enum nss_status nret;
int errnop;
/* make sure we do not have leftovers, and release memory */
if (nret != NSS_STATUS_SUCCESS) {
return nret;
}
return NSS_STATUS_SUCCESS;
}