Blame nss/services.c

Packit 6bd9ab
/*
Packit 6bd9ab
   service.c - NSS lookup functions for services database
Packit 6bd9ab
Packit 6bd9ab
   Copyright (C) 2006 West Consulting
Packit 6bd9ab
   Copyright (C) 2006-2015 Arthur de Jong
Packit 6bd9ab
   Copyright (C) 2010 Symas Corporation
Packit 6bd9ab
Packit 6bd9ab
   This library is free software; you can redistribute it and/or
Packit 6bd9ab
   modify it under the terms of the GNU Lesser General Public
Packit 6bd9ab
   License as published by the Free Software Foundation; either
Packit 6bd9ab
   version 2.1 of the License, or (at your option) any later version.
Packit 6bd9ab
Packit 6bd9ab
   This library is distributed in the hope that it will be useful,
Packit 6bd9ab
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6bd9ab
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6bd9ab
   Lesser General Public License for more details.
Packit 6bd9ab
Packit 6bd9ab
   You should have received a copy of the GNU Lesser General Public
Packit 6bd9ab
   License along with this library; if not, write to the Free Software
Packit 6bd9ab
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit 6bd9ab
   02110-1301 USA
Packit 6bd9ab
*/
Packit 6bd9ab
Packit 6bd9ab
#include "config.h"
Packit 6bd9ab
Packit 6bd9ab
#include <string.h>
Packit 6bd9ab
#include <errno.h>
Packit 6bd9ab
Packit 6bd9ab
#include "prototypes.h"
Packit 6bd9ab
#include "common.h"
Packit 6bd9ab
#include "compat/attrs.h"
Packit 6bd9ab
Packit 6bd9ab
/* read a single services result entry from the stream */
Packit 6bd9ab
static nss_status_t read_servent(TFILE *fp, struct servent *result,
Packit 6bd9ab
                                 char *buffer, size_t buflen, int *errnop)
Packit 6bd9ab
{
Packit 6bd9ab
  int32_t tmpint32, tmp2int32, tmp3int32;
Packit 6bd9ab
  size_t bufptr = 0;
Packit 6bd9ab
  memset(result, 0, sizeof(struct servent));
Packit 6bd9ab
  READ_BUF_STRING(fp, result->s_name);
Packit 6bd9ab
  READ_BUF_STRINGLIST(fp, result->s_aliases);
Packit 6bd9ab
  /* store port number in network byte order */
Packit 6bd9ab
  READ_INT32(fp, tmp2int32);
Packit 6bd9ab
  result->s_port = htons((uint16_t)tmp2int32);
Packit 6bd9ab
  READ_BUF_STRING(fp, result->s_proto);
Packit 6bd9ab
  /* we're done */
Packit 6bd9ab
  return NSS_STATUS_SUCCESS;
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
#ifdef NSS_FLAVOUR_GLIBC
Packit 6bd9ab
Packit 6bd9ab
/* get a service entry by name and protocol */
Packit 6bd9ab
nss_status_t NSS_NAME(getservbyname_r)(const char *name, const char *protocol,
Packit 6bd9ab
                                       struct servent *result, char *buffer,
Packit 6bd9ab
                                       size_t buflen, int *errnop)
Packit 6bd9ab
{
Packit 6bd9ab
  NSS_GETONE(NSLCD_ACTION_SERVICE_BYNAME,
Packit 6bd9ab
             WRITE_STRING(fp, name);
Packit 6bd9ab
             WRITE_STRING(fp, protocol),
Packit 6bd9ab
             read_servent(fp, result, buffer, buflen, errnop));
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
/* get a service entry by port and protocol */
Packit 6bd9ab
nss_status_t NSS_NAME(getservbyport_r)(int port, const char *protocol,
Packit 6bd9ab
                                       struct servent *result, char *buffer,
Packit 6bd9ab
                                       size_t buflen, int *errnop)
Packit 6bd9ab
{
Packit 6bd9ab
  /* port is already in network byte order */
Packit 6bd9ab
  NSS_GETONE(NSLCD_ACTION_SERVICE_BYNUMBER,
Packit 6bd9ab
             tmpint32 = ntohs(port);
Packit 6bd9ab
             WRITE_INT32(fp, tmpint32);
Packit 6bd9ab
             WRITE_STRING(fp, protocol),
Packit 6bd9ab
             read_servent(fp, result, buffer, buflen, errnop));
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
/* thread-local file pointer to an ongoing request */
Packit 6bd9ab
static TLS TFILE *serventfp;
Packit 6bd9ab
Packit 6bd9ab
/* open request to get all services */
Packit 6bd9ab
nss_status_t NSS_NAME(setservent)(int UNUSED(stayopen))
Packit 6bd9ab
{
Packit 6bd9ab
  NSS_SETENT(serventfp);
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
/* read a single returned service definition */
Packit 6bd9ab
nss_status_t NSS_NAME(getservent_r)(struct servent *result,
Packit 6bd9ab
                                    char *buffer, size_t buflen, int *errnop)
Packit 6bd9ab
{
Packit 6bd9ab
  NSS_GETENT(serventfp, NSLCD_ACTION_SERVICE_ALL,
Packit 6bd9ab
             read_servent(serventfp, result, buffer, buflen, errnop));
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
/* close the stream opened by setservent() above */
Packit 6bd9ab
nss_status_t NSS_NAME(endservent)(void)
Packit 6bd9ab
{
Packit 6bd9ab
  NSS_ENDENT(serventfp);
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
#endif /* NSS_FLAVOUR_GLIBC */
Packit 6bd9ab
Packit 6bd9ab
#ifdef NSS_FLAVOUR_SOLARIS
Packit 6bd9ab
Packit 6bd9ab
#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN
Packit 6bd9ab
static char *servent2str(struct servent *result, char *buffer, size_t buflen)
Packit 6bd9ab
{
Packit 6bd9ab
  int res, i;
Packit 6bd9ab
  res = snprintf(buffer, buflen, "%s %d/%s", result->s_name, ntohs(result->s_port),
Packit 6bd9ab
                 result->s_proto);
Packit 6bd9ab
  if ((res < 0) || (res >= (int)buflen))
Packit 6bd9ab
    return NULL;
Packit 6bd9ab
  if (result->s_aliases)
Packit 6bd9ab
    for (i = 0; result->s_aliases[i]; i++)
Packit 6bd9ab
    {
Packit 6bd9ab
      strlcat(buffer, " ", buflen);
Packit 6bd9ab
      strlcat(buffer, result->s_aliases[i], buflen);
Packit 6bd9ab
    }
Packit 6bd9ab
  if (strlen(buffer) >= buflen - 1)
Packit 6bd9ab
    return NULL;
Packit 6bd9ab
  return buffer;
Packit 6bd9ab
}
Packit 6bd9ab
#endif /* HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */
Packit 6bd9ab
Packit 6bd9ab
static nss_status_t read_result(TFILE *fp, nss_XbyY_args_t *args)
Packit 6bd9ab
{
Packit 6bd9ab
  READ_RESULT(servent, &args->erange);
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
static nss_status_t services_getservbyname(nss_backend_t UNUSED(*be), void *args)
Packit 6bd9ab
{
Packit 6bd9ab
  NSS_GETONE(NSLCD_ACTION_SERVICE_BYNAME,
Packit 6bd9ab
             WRITE_STRING(fp, NSS_ARGS(args)->key.serv.serv.name);
Packit 6bd9ab
             WRITE_STRING(fp, NSS_ARGS(args)->key.serv.proto),
Packit 6bd9ab
             read_result(fp, args));
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
static nss_status_t services_getservbyport(nss_backend_t UNUSED(*be), void *args)
Packit 6bd9ab
{
Packit 6bd9ab
  NSS_GETONE(NSLCD_ACTION_SERVICE_BYNUMBER,
Packit 6bd9ab
             WRITE_INT32(fp, ntohs(NSS_ARGS(args)->key.serv.serv.port));
Packit 6bd9ab
             WRITE_STRING(fp, NSS_ARGS(args)->key.serv.proto),
Packit 6bd9ab
             read_result(fp, args));
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
static nss_status_t services_setservent(nss_backend_t *be, void UNUSED(*args))
Packit 6bd9ab
{
Packit 6bd9ab
  NSS_SETENT(LDAP_BE(be)->fp);
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
static nss_status_t services_getservent(nss_backend_t *be, void *args)
Packit 6bd9ab
{
Packit 6bd9ab
  NSS_GETENT(LDAP_BE(be)->fp, NSLCD_ACTION_SERVICE_ALL,
Packit 6bd9ab
             read_result(LDAP_BE(be)->fp, args));
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
static nss_status_t services_endservent(nss_backend_t *be, void UNUSED(*args))
Packit 6bd9ab
{
Packit 6bd9ab
  NSS_ENDENT(LDAP_BE(be)->fp);
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
static nss_backend_op_t services_ops[] = {
Packit 6bd9ab
  nss_ldap_destructor,
Packit 6bd9ab
  services_endservent,
Packit 6bd9ab
  services_setservent,
Packit 6bd9ab
  services_getservent,
Packit 6bd9ab
  services_getservbyname,
Packit 6bd9ab
  services_getservbyport
Packit 6bd9ab
};
Packit 6bd9ab
Packit 6bd9ab
nss_backend_t *NSS_NAME(services_constr)(const char UNUSED(*db_name),
Packit 6bd9ab
                                         const char UNUSED(*src_name),
Packit 6bd9ab
                                         const char UNUSED(*cfg_args))
Packit 6bd9ab
{
Packit 6bd9ab
  return nss_ldap_constructor(services_ops, sizeof(services_ops));
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
#endif /* NSS_FLAVOUR_SOLARIS */