Blame common/nslcd-prot.c

Packit 6bd9ab
/*
Packit 6bd9ab
   nslcd-prot.c - common functions for NSLCD lookups
Packit 6bd9ab
Packit 6bd9ab
   Copyright (C) 2006 West Consulting
Packit 6bd9ab
   Copyright (C) 2006, 2007, 2008, 2009, 2010, 2012 Arthur de Jong
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
#ifdef HAVE_STDINT_H
Packit 6bd9ab
#include <stdint.h>
Packit 6bd9ab
#endif /* HAVE_STDINT_H */
Packit 6bd9ab
#include <unistd.h>
Packit 6bd9ab
#include <stdio.h>
Packit 6bd9ab
#include <sys/socket.h>
Packit 6bd9ab
#include <sys/un.h>
Packit 6bd9ab
#include <sys/types.h>
Packit 6bd9ab
#include <sys/stat.h>
Packit 6bd9ab
#include <errno.h>
Packit 6bd9ab
#include <string.h>
Packit 6bd9ab
#include <fcntl.h>
Packit 6bd9ab
Packit 6bd9ab
#include "nslcd.h"
Packit 6bd9ab
#include "nslcd-prot.h"
Packit 6bd9ab
#include "compat/socket.h"
Packit 6bd9ab
Packit 6bd9ab
/* read timeout is 60 seconds because looking up stuff may take some time
Packit 6bd9ab
   write timeout is 10 secods because nslcd could be loaded with requests */
Packit 6bd9ab
#define READ_TIMEOUT 60 * 1000
Packit 6bd9ab
#define WRITE_TIMEOUT 10 * 1000
Packit 6bd9ab
Packit 6bd9ab
/* buffer sizes for I/O */
Packit 6bd9ab
#define READBUFFER_MINSIZE 1024
Packit 6bd9ab
#define READBUFFER_MAXSIZE 2 * 1024 * 1024
Packit 6bd9ab
#define WRITEBUFFER_MINSIZE 32
Packit 6bd9ab
#define WRITEBUFFER_MAXSIZE 32
Packit 6bd9ab
Packit 6bd9ab
/* Note that the READBUFFER_MAXSIZE should be large enough to hold any single
Packit 6bd9ab
   result entity as defined in nslcd.h because the get*ent() functions expect
Packit 6bd9ab
   to be able to tio_reset() the stream to re-read the current entity.
Packit 6bd9ab
   Since group entities can grow arbitrarily large, this setting limits the
Packit 6bd9ab
   number of users that can be put in a group. */
Packit 6bd9ab
Packit 6bd9ab
/* returns a socket to the server or NULL on error (see errno),
Packit 6bd9ab
   socket should be closed with fclose() */
Packit 6bd9ab
TFILE *nslcd_client_open()
Packit 6bd9ab
{
Packit 6bd9ab
  int sock;
Packit 6bd9ab
  struct sockaddr_un addr;
Packit 6bd9ab
  TFILE *fp;
Packit 6bd9ab
  int flags;
Packit 6bd9ab
  /* create a socket */
Packit 6bd9ab
  if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
Packit 6bd9ab
    return NULL;
Packit 6bd9ab
  /* create socket address structure */
Packit 6bd9ab
  memset(&addr, 0, sizeof(struct sockaddr_un));
Packit 6bd9ab
  addr.sun_family = AF_UNIX;
Packit 6bd9ab
  strncpy(addr.sun_path, NSLCD_SOCKET, sizeof(addr.sun_path));
Packit 6bd9ab
  addr.sun_path[sizeof(addr.sun_path) - 1] = '\0';
Packit 6bd9ab
  /* close the file descriptor on exec (ignore errors) */
Packit 6bd9ab
  flags = fcntl(sock, F_GETFL);
Packit 6bd9ab
  if (flags >= 0)
Packit 6bd9ab
    (void)fcntl(sock, F_SETFD, flags | FD_CLOEXEC);
Packit 6bd9ab
  /* connect to the socket */
Packit 6bd9ab
  if (connect(sock, (struct sockaddr *)&addr, SUN_LEN(&addr)) < 0)
Packit 6bd9ab
  {
Packit 6bd9ab
    (void)close(sock);
Packit 6bd9ab
    return NULL;
Packit 6bd9ab
  }
Packit 6bd9ab
  /* create a stream object */
Packit 6bd9ab
  if ((fp = tio_fdopen(sock, READ_TIMEOUT, WRITE_TIMEOUT,
Packit 6bd9ab
                       READBUFFER_MINSIZE, READBUFFER_MAXSIZE,
Packit 6bd9ab
                       WRITEBUFFER_MINSIZE, WRITEBUFFER_MAXSIZE)) == NULL)
Packit 6bd9ab
  {
Packit 6bd9ab
    (void)close(sock);
Packit 6bd9ab
    return NULL;
Packit 6bd9ab
  }
Packit 6bd9ab
  /* return the stream */
Packit 6bd9ab
  return fp;
Packit 6bd9ab
}