/*
 * Copyright (c) 2009, Sun Microsystems, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 * - Neither the name of Sun Microsystems, Inc. nor the names of its
 *   contributors may be used to endorse or promote products derived
 *   from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * Copyright (c) 1989 by Sun Microsystems, Inc.
 */

#include <config.h>
#include <pthread.h>
#include <reentrant.h>
#include <sys/cdefs.h>
#include <stdio.h>
#include <errno.h>
#include <netconfig.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <rpc/rpc.h>
#include <unistd.h>

#include "rpc_com.h"

/*
 * The five library routines in this file provide application access to the
 * system network configuration database, /etc/netconfig.  In addition to the
 * netconfig database and the routines for accessing it, the environment
 * variable NETPATH and its corresponding routines in getnetpath.c may also be
 * used to specify the network transport to be used.
 */

/*
 * netconfig errors
 */

#define NC_NONETCONFIG    ENOENT
#define NC_NOMEM          ENOMEM
#define NC_NOTINIT        EINVAL	/* setnetconfig was not called first */
#define NC_BADFILE        EBADF	/* format for netconfig file is bad */
#define NC_NOTFOUND       ENOPROTOOPT	/* specified netid was not found */

/*
 * semantics as strings (should be in netconfig.h)
 */
#define NC_TPI_CLTS_S     "tpi_clts"
#define NC_TPI_COTS_S     "tpi_cots"
#define NC_TPI_COTS_ORD_S "tpi_cots_ord"
#define NC_TPI_RAW_S      "tpi_raw"

/*
 * flags as characters (also should be in netconfig.h)
 */
#define NC_NOFLAG_C       '-'
#define NC_VISIBLE_C      'v'
#define NC_BROADCAST_C    'b'

/*
 * Character used to indicate there is no name-to-address lookup library
 */
#define NC_NOLOOKUP "-"

/* serialize globals */
static mutex_t nc_mtx = MUTEX_INITIALIZER;

static const char *const _nc_errors[] = {
	"Netconfig database not found",
	"Not enough memory",
	"Not initialized",
	"Netconfig database has invalid format",
	"Netid not found in netconfig database"
};

struct netconfig_info {
	int eof;		/* all entries has been read */
	int ref;		/* # of times setnetconfig() has been called */
	struct netconfig_list *head;	/* head of the list */
	struct netconfig_list *tail;	/* last of the list */
};

struct netconfig_list {
	char *linep;		/* hold line read from netconfig */
	struct netconfig *ncp;
	struct netconfig_list *next;
};

struct netconfig_vars {
	int valid; /* token that indicates a valid netconfig_vars */
	int flag;		/* first time flag */
	struct netconfig_list *nc_configs; /* pointer to the current netconfig
					    * entry */
};

#define NC_VALID 0xfeed
#define NC_STORAGE 0xf00d
#define NC_INVALID 0

static int *__nc_error(void);
static int parse_ncp(char *, struct netconfig *);
static struct netconfig *dup_ncp(struct netconfig *);

static FILE *nc_file;		/* for netconfig db */
static struct netconfig_info ni = { 0, 0, NULL, NULL };

#define MAXNETCONFIGLINE    1000

static int *
__nc_error(void)
{
	static pthread_mutex_t nc_lock = MUTEX_INITIALIZER;
	extern thread_key_t nc_key;
	static int nc_error;
	int error, *nc_addr;

	/*
	 * Use the static `nc_error' if we are the main thread
	 * (including non-threaded programs), or if an allocation
	 * fails.
	 */
	if (nc_key == -1) {
		error = 0;
		mutex_lock(&nc_lock);
		if (nc_key == -1)
			error = thr_keycreate(&nc_key, free);	/* XXX */
		mutex_unlock(&nc_lock);
		if (error)
			return (&nc_error);
	}
	nc_addr = (int *)thr_getspecific(nc_key);
	if (nc_addr == NULL) {
		nc_addr = (int *)mem_zalloc(sizeof(int));
		if (thr_setspecific(nc_key, (void *)nc_addr) != 0) {
			if (nc_addr)
				mem_free(nc_addr, 0);	/* XXX */
			return (&nc_error);
		}
		*nc_addr = 0;
	}
	return (nc_addr);
}

#define nc_error        (*(__nc_error()))
/*
 * A call to setnetconfig() establishes a /etc/netconfig "session".  A session
 * "handle" is returned on a successful call.  At the start of a session (after
 * a call to setnetconfig()) searches through the /etc/netconfig database will
 * proceed from the start of the file.  The session handle must be passed to
 * getnetconfig() to parse the file.  Each call to getnetconfig() using the
 * current handle will process one subsequent entry in /etc/netconfig.
 * setnetconfig() must be called before the first call to getnetconfig().
 * (Handles are used to allow for nested calls to setnetpath()).
 *
 * A new session is established with each call to setnetconfig(), with a new
 * handle being returned on each call.  Previously established sessions remain
 * active until endnetconfig() is called with that session's handle as an
 * argument.
 *
 * setnetconfig() need *not* be called before a call to getnetconfigent().
 * setnetconfig() returns a NULL pointer on failure (for example, if
 * the netconfig database is not present).
 */
void *
setnetconfig(void)
{
	struct netconfig_vars *nc_vars;

	nc_vars = (struct netconfig_vars *)
		mem_zalloc(sizeof(struct netconfig_vars));
	if (nc_vars == NULL)
		return (NULL);

	/*
	 * For multiple calls, i.e. nc_file is not NULL, we just return the
	 * handle without reopening the netconfig db.
	 */
	mutex_lock(&nc_mtx);
	ni.ref++;

	if (!nc_file)
		nc_file = fopen(NETCONFIG, "r");
	if (nc_file) {
		nc_vars->valid = NC_VALID;
		nc_vars->flag = 0;
		nc_vars->nc_configs = ni.head;
		mutex_unlock(&nc_mtx);
		return ((void *)nc_vars);
	}
	ni.ref--;
	mutex_unlock(&nc_mtx);
	nc_error = NC_NONETCONFIG;
	mem_free(nc_vars, 0);	/* XXX */
	return (NULL);
}

/*
 * When first called, getnetconfig() returns a pointer to the first entry in
 * the netconfig database, formatted as a struct netconfig.  On each subsequent
 * call, getnetconfig() returns a pointer to the next entry in the database.
 * getnetconfig() can thus be used to search the entire netconfig file.
 * getnetconfig() returns NULL at end of file.
 */

struct netconfig *
getnetconfig(void *handlep)
{
	struct netconfig_vars *ncp = (struct netconfig_vars *)handlep;
	char *stringp;		/* tmp string pointer */
	struct netconfig_list *list;
	struct netconfig *np;

	/*
	 * Verify that handle is valid
	 */
	if (ncp == NULL || nc_file == NULL) {
		nc_error = NC_NOTINIT;
		return (NULL);
	}

	mutex_lock(&nc_mtx);

	switch (ncp->valid) {
	case NC_VALID:
		/*
		 * If entry has already been read into the list,
		 * we return the entry in the linked list.
		 * If this is the first time call, check if there are any
		 * entries in linked list.  If no entries, we need to read the
		 * netconfig db.  If we have been here and the next entry is
		 * there, we just return it.
		 */
		if (ncp->flag == 0) {	/* first time */
			ncp->flag = 1;
			ncp->nc_configs = ni.head;
			if (ncp->nc_configs != NULL) { /* entry already exist */
				mutex_unlock(&nc_mtx);
				return (ncp->nc_configs->ncp);
			}
		} else if (ncp->nc_configs != NULL
			   && ncp->nc_configs->next != NULL) {
			ncp->nc_configs = ncp->nc_configs->next;
			mutex_unlock(&nc_mtx);
			return (ncp->nc_configs->ncp);
		}

		/*
		 * If we cannot find the entry in the list and is end of file,
		 * we give up.
		 */
		if (ni.eof == 1) {
			mutex_unlock(&nc_mtx);
			return (NULL);
		}
		break;
	default:
		nc_error = NC_NOTINIT;
		mutex_unlock(&nc_mtx);
		return (NULL);
	}

	stringp = (char *)mem_zalloc(MAXNETCONFIGLINE);
	if (stringp == NULL) {
		mutex_unlock(&nc_mtx);
		return (NULL);
	}
#ifdef MEM_CHK
	if (malloc_verify() == 0) {
		fprintf(stderr, "memory heap corrupted in getnetconfig\n");
		exit(1);
	}
#endif

	/*
	 * Read a line from netconfig file.
	 */
	do {
		if (fgets(stringp, MAXNETCONFIGLINE, nc_file) == NULL) {
			mem_free(stringp, 0);
			ni.eof = 1;
			mutex_unlock(&nc_mtx);
			return (NULL);
		}
	} while (*stringp == '#');

	list =
	    (struct netconfig_list *)mem_zalloc(sizeof(struct netconfig_list));
	if (list == NULL) {
		mem_free(stringp, 0);
		mutex_unlock(&nc_mtx);
		return (NULL);
	}
	np = (struct netconfig *)mem_zalloc(sizeof(struct netconfig));
	if (np == NULL) {
		mem_free(stringp, 0);
		mem_free(list, 0);
		mutex_unlock(&nc_mtx);
		return (NULL);
	}
	list->ncp = np;
	list->next = NULL;
	list->ncp->nc_lookups = NULL;
	list->linep = stringp;
	if (parse_ncp(stringp, list->ncp) == -1) {
		mem_free(stringp, 0);
		mem_free(np, 0);
		mem_free(list, 0);
		mutex_unlock(&nc_mtx);
		return (NULL);
	} else {
		/*
		 * If this is the first entry that's been read, it is the head
		 * of the list.  If not, put the entry at the end of the list.
		 * Reposition the current pointer of the handle to the last
		 * entry in the list.
		 */
		if (ni.head == NULL) {	/* first entry */
			ni.head = ni.tail = list;
		} else {
			ni.tail->next = list;
			ni.tail = ni.tail->next;
		}
		ncp->nc_configs = ni.tail;
		mutex_unlock(&nc_mtx);
		return (ni.tail->ncp);
	}
	mutex_unlock(&nc_mtx);
}

/*
 * endnetconfig() may be called to "unbind" or "close" the netconfig database
 * when processing is complete, releasing resources for reuse.  endnetconfig()
 * may not be called before setnetconfig().  endnetconfig() returns 0 on
 * success and -1 on failure (for example, if setnetconfig() was not called
 * previously).
 */
int
endnetconfig(void *handlep)
{
	struct netconfig_vars *nc_handlep = (struct netconfig_vars *)handlep;
	struct netconfig_list *q, *p;

	/*
	 * Verify that handle is valid
	 */
	if (nc_handlep == NULL
	    || (nc_handlep->valid != NC_VALID
		&& nc_handlep->valid != NC_STORAGE)) {
		nc_error = NC_NOTINIT;
		return (-1);
	}

	/*
	 * Return 0 if anyone still needs it.
	 */
	mutex_lock(&nc_mtx);
	nc_handlep->valid = NC_INVALID;
	nc_handlep->flag = 0;
	nc_handlep->nc_configs = NULL;
	if (--ni.ref > 0) {
		mutex_unlock(&nc_mtx);
		mem_free(nc_handlep, 0);
		return (0);
	}

	/*
	 * Noone needs these entries anymore, then frees them.
	 * Make sure all info in netconfig_info structure has been
	 * reinitialized. */
	q = p = ni.head;
	ni.eof = ni.ref = 0;
	ni.head = NULL;
	ni.tail = NULL;
	while (q) {
		p = q->next;
		if (q->ncp->nc_lookups != NULL)
			mem_free(q->ncp->nc_lookups, 0);
		mem_free(q->ncp, 0);
		mem_free(q->linep, 0);
		mem_free(q, 0);
		q = p;
	}
	fclose(nc_file);
	nc_file = NULL;
	mutex_unlock(&nc_mtx);
	mem_free(nc_handlep, 0);
	return (0);
}

/*
 * getnetconfigent(netid) returns a pointer to the struct netconfig structure
 * corresponding to netid.  It returns NULL if netid is invalid (that is, does
 * not name an entry in the netconfig database).  It returns NULL and sets
 * errno in case of failure (for example, if the netconfig database cannot be
 * opened).
 */

struct netconfig *
getnetconfigent(const char *netid)
{
	FILE *file;		/* NETCONFIG db's file pointer */
	char *linep;		/* holds current netconfig line */
	char *stringp;		/* temporary string pointer */
	struct netconfig *ncp = NULL;	/* returned value */
	struct netconfig_list *list;	/* pointer to cache list */

	nc_error = NC_NOTFOUND;	/* default error. */
	if (netid == NULL || strlen(netid) == 0)
		return (NULL);

	if (strcmp(netid, "unix") == 0) {
		fprintf(stderr, "The local transport is called \"unix\" ");
		fprintf(stderr, "in /etc/netconfig.\n");
		fprintf(stderr, "Please change this to \"local\" manually ");
		fprintf(stderr, "or run mergemaster(8).\n");
		fprintf(stderr, "See UPDATING entry 20021216 for details.\n");
		fprintf(stderr, "Continuing in 10 seconds\n\n");
		fprintf(stderr, "This warning will be removed 20030301\n");
		sleep(10);

	}

	/*
	 * Look up table if the entries have already been read and parsed in
	 * getnetconfig(), then copy this entry into a buffer and return it.
	 * If we cannot find the entry in the current list and there are more
	 * entries in the netconfig db that has not been read, we then read the
	 * db and try find the match netid.
	 * If all the netconfig db has been read and placed into the list and
	 * there is no match for the netid, return NULL.
	 */
	mutex_lock(&nc_mtx);

	if (ni.head != NULL) {
		for (list = ni.head; list; list = list->next) {
			if (strcmp(list->ncp->nc_netid, netid) == 0) {
				mutex_unlock(&nc_mtx);
				return (dup_ncp(list->ncp));
			}
		}
		if (ni.eof == 1) {	/* that's all the entries */
			mutex_unlock(&nc_mtx);
			return (NULL);
		}
	}

	file = fopen(NETCONFIG, "r");
	if (!file) {
		nc_error = NC_NONETCONFIG;
		mutex_unlock(&nc_mtx);
		return (NULL);
	}

	linep = mem_zalloc(MAXNETCONFIGLINE);
	if (!linep) {
		fclose(file);
		nc_error = NC_NOMEM;
		mutex_unlock(&nc_mtx);
		return (NULL);
	}
	do {
		ptrdiff_t len;
		char *tmpp;	/* tmp string pointer */

		do {
			stringp =
				fgets(linep, MAXNETCONFIGLINE, file);
			if (!stringp)
				break;
		} while (*stringp == '#');

		if (!stringp) /* eof */
			break;

		tmpp = strpbrk(stringp, "\t ");
		if (!tmpp) {
			/* can't parse file */
			nc_error = NC_BADFILE;
			break;
		}

		len = tmpp - stringp;
		if (strlen(netid) == (size_t) len &&
			/* a match */
		    strncmp(stringp, netid, (size_t) len) == 0) {
			ncp = (struct netconfig *)
				mem_zalloc(sizeof(struct netconfig));
			if (ncp == NULL)
				break;
			ncp->nc_lookups = NULL;
			if (parse_ncp(linep, ncp) == -1) {
				mem_free(ncp, 0);
				ncp = NULL;
			}
			break;
		}

	} while (stringp != NULL);
	if (!ncp)
		mem_free(linep, 0);
	fclose(file);
	mutex_unlock(&nc_mtx);
	return (ncp);
}

/*
 * freenetconfigent(netconfigp) frees the netconfig structure pointed to by
 * netconfigp (previously returned by getnetconfigent()).
 */

void
freenetconfigent(struct netconfig *netconfigp)
{
	if (netconfigp != NULL) {
		mem_free(netconfigp->nc_netid, 0);
			/* holds all netconfigp's strings */
		if (netconfigp->nc_lookups != NULL)
			mem_free(netconfigp->nc_lookups, 0);
		mem_free(netconfigp, 0);
	}
	return;
}

/*
 * Parse line and stuff it in a struct netconfig
 * Typical line might look like:
 * udp tpi_cots vb inet udp /dev/udp /usr/lib/ip.so,/usr/local/ip.so
 *
 * We return -1 if any of the tokens don't parse, or malloc fails.
 *
 * Note that we modify stringp (putting NULLs after tokens) and
 * we set the ncp's string field pointers to point to these tokens within
 * stringp.
 */

static int
parse_ncp(char *stringp,	/* string to parse */
	  struct netconfig *ncp /* where to put results */)
{
	char *tokenp;		/* for processing tokens */
	char *lasts;

	/* nearly anything that breaks is for this reason */
	nc_error = NC_BADFILE;
	stringp[strlen(stringp) - 1] = '\0';	/* get rid of newline */

	/* netid */
	ncp->nc_netid = strtok_r(stringp, "\t ", &lasts);
	if (!ncp->nc_netid)
		return (-1);

	/* semantics */
	tokenp = strtok_r(NULL, "\t ", &lasts);
	if (!tokenp)
		return (-1);

	if (strcmp(tokenp, NC_TPI_COTS_ORD_S) == 0)
		ncp->nc_semantics = NC_TPI_COTS_ORD;
	else if (strcmp(tokenp, NC_TPI_COTS_S) == 0)
		ncp->nc_semantics = NC_TPI_COTS;
	else if (strcmp(tokenp, NC_TPI_CLTS_S) == 0)
		ncp->nc_semantics = NC_TPI_CLTS;
	else if (strcmp(tokenp, NC_TPI_RAW_S) == 0)
		ncp->nc_semantics = NC_TPI_RAW;
	else
		return (-1);

	/* flags */
	tokenp = strtok_r(NULL, "\t ", &lasts);
	if (!tokenp)
		return (-1);

	for (ncp->nc_flag = NC_NOFLAG; *tokenp != '\0'; tokenp++) {
		switch (*tokenp) {
		case NC_NOFLAG_C:
			break;
		case NC_VISIBLE_C:
			ncp->nc_flag |= NC_VISIBLE;
			break;
		case NC_BROADCAST_C:
			ncp->nc_flag |= NC_BROADCAST;
			break;
		default:
			return (-1);
		}
	}
	/* protocol family */
	ncp->nc_protofmly = strtok_r(NULL, "\t ", &lasts);
	if (!ncp->nc_protofmly)
		return (-1);
	/* protocol name */
	ncp->nc_proto = strtok_r(NULL, "\t ", &lasts);
	if (!ncp->nc_proto)
		return (-1);
	/* network device */
	ncp->nc_device = strtok_r(NULL, "\t ", &lasts);
	if (!ncp->nc_device)
		return (-1);
	tokenp = strtok_r(NULL, "\t ", &lasts);
	if (!tokenp)
		return (-1);
	if (strcmp(tokenp, NC_NOLOOKUP) == 0) {
		ncp->nc_nlookups = 0;
		ncp->nc_lookups = NULL;
	} else {
		char *cp;	/* tmp string */

		if (ncp->nc_lookups != NULL)	/* from last visit */
			mem_free(ncp->nc_lookups, 0);	/* XXX */
		/* preallocate one string pointer */
		ncp->nc_lookups = (char **)mem_zalloc(sizeof(char *));
		ncp->nc_nlookups = 0;
		while ((cp = tokenp) != NULL) {
			tokenp = _get_next_token(cp, ',');
			ncp->nc_lookups[(size_t) ncp->nc_nlookups++] = cp;
			/* XXXX ok, this works, but should be fixed */
			ncp->nc_lookups =
				(char **)realloc(
					ncp->nc_lookups,
					(size_t) (ncp->nc_nlookups + 1) *
					sizeof(char *)); /* for next loop */
		}
	}
	return (0);
}

/*
 * Returns a string describing the reason for failure.
 */
char *
nc_sperror(void)
{
	const char *message;

	switch (nc_error) {
	case NC_NONETCONFIG:
		message = _nc_errors[0];
		break;
	case NC_NOMEM:
		message = _nc_errors[1];
		break;
	case NC_NOTINIT:
		message = _nc_errors[2];
		break;
	case NC_BADFILE:
		message = _nc_errors[3];
		break;
	case NC_NOTFOUND:
		message = _nc_errors[4];
		break;
	default:
		message = "Unknown network selection error";
	}
	/* LINTED const castaway */
	return ((char *)message);
}

/*
 * Prints a message onto standard error describing the reason for failure.
 */
void nc_perror(const char *s)
{
	fprintf(stderr, "%s: %s\n", s, nc_sperror());
}

/*
 * Duplicates the matched netconfig buffer.
 */
static struct netconfig *
dup_ncp(struct netconfig *ncp)
{
	struct netconfig *p;
	char *tmp;
	u_int i;

	tmp = mem_zalloc(MAXNETCONFIGLINE);
	if (!tmp)
		return (NULL);
	p = (struct netconfig *)mem_zalloc(sizeof(struct netconfig));
	if (!p) {
		mem_free(tmp, 0);
		return (NULL);
	}
	/*
	 * First we dup all the data from matched netconfig buffer.  Then we
	 * adjust some of the member pointer to a pre-allocated buffer where
	 * contains part of the data.
	 * To follow the convention used in parse_ncp(), we store all the
	 * necessary information in the pre-allocated buffer and let each
	 * of the netconfig char pointer member point to the right address
	 * in the buffer.
	 */
	*p = *ncp;
	p->nc_netid = (char *)strcpy(tmp, ncp->nc_netid);
	tmp = strchr(tmp, 0) + 1;
	p->nc_protofmly = (char *)strcpy(tmp, ncp->nc_protofmly);
	tmp = strchr(tmp, 0) + 1;
	p->nc_proto = (char *)strcpy(tmp, ncp->nc_proto);
	tmp = strchr(tmp, 0) + 1;
	p->nc_device = (char *)strcpy(tmp, ncp->nc_device);
	p->nc_lookups =
	    (char **)mem_zalloc((size_t) (p->nc_nlookups + 1) * sizeof(char *));
	if (p->nc_lookups == NULL) {
		mem_free(p->nc_netid, 0);
		return (NULL);
	}
	for (i = 0; i < p->nc_nlookups; i++) {
		tmp = strchr(tmp, 0) + 1;
		p->nc_lookups[i] = (char *)strcpy(tmp, ncp->nc_lookups[i]);
	}
	return (p);
}
