| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391 | /* * $Id: util.c,v 1.10 2010/02/04 10:31:41 aland Exp $ * * Copyright (c) 1998 The NetBSD Foundation, Inc. * * Copyright (C) 1995,1996,1997 Lars Fenneberg * * Copyright 1992 Livingston Enterprises, Inc. * * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan * and Merit Network, Inc. All Rights Reserved * * See the file COPYRIGHT for the respective terms and conditions. * If the file is missing contact me at lf@elemental.net * and I'll send you a copy. * *///#include <sys/time.h>#include <radius_config.h>#include <includes.h>#include <freeradius-client.h>#include "util.h"#define	RC_BUFSIZ	1024static char const * months[] =		{			"Jan", "Feb", "Mar", "Apr", "May", "Jun",			"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"		};/** Turns printable string into correct tm struct entries * * @param valstr the printable date in 'day month year' format. * @param tm the output struct. */void rc_str2tm (char const *valstr, struct tm *tm){	int             i;	/* Get the month */	for (i = 0; i < 12; i++)	{		if (strncmp (months[i], valstr, 3) == 0)		{			tm->tm_mon = i;			i = 13;		}	}	/* Get the Day */	tm->tm_mday = atoi (&valstr[4]);	/* Now the year */	tm->tm_year = atoi (&valstr[7]) - 1900;}/** Get the network interface name associated with this tty * * @param rh a handle to parsed configuration. * @param tty the name of the tty. * @return the network iface name. */char *rc_getifname(rc_handle *rh, char const *tty){#if defined(BSD4_4) || defined(linux)	int		fd;	if ((fd = open(tty, O_RDWR|O_NDELAY)) < 0) {		rc_log(LOG_ERR, "rc_getifname: can't open %s: %s", tty, strerror(errno));		return NULL;	}#endif#ifdef BSD4_4	strcpy(rh->ifname,ttyname(fd));	if (strlen(rh->ifname) < 1) {		rc_log(LOG_ERR, "rc_getifname: can't get attached interface of %s: %s", tty, strerror(errno));		close(fd);		return NULL;	}#elif linux	if (ioctl(fd, SIOCGIFNAME, rh->ifname) < 0) {		rc_log(LOG_ERR, "rc_getifname: can't ioctl %s: %s", tty, strerror(errno));		close(fd);		return NULL;	}#else	return NULL;#endif#if defined(BSD4_4) || defined(linux)	close(fd);	return rh->ifname;#endif}/** Reads in a string from the user (with or witout echo) * * @param rh a handle to parsed configuration. * @param prompt the prompt to print. * @param do_echo whether to echo characters. * @return the data user typed or NULL. */#ifndef _MSC_VERchar *rc_getstr (rc_handle *rh, char const *prompt, int do_echo){#if 0  	int             in, out;	char           *p;	struct termios  term_old, term_new;	int		is_term, flags, old_flags;	char		c;	int		flushed = 0;	sigset_t        newset;	sigset_t        oldset;	in = fileno(stdin);	out = fileno(stdout);	(void) sigemptyset (&newset);	(void) sigaddset (&newset, SIGINT);	(void) sigaddset (&newset, SIGTSTP);	(void) sigaddset (&newset, SIGQUIT);	(void) sigprocmask (SIG_BLOCK, &newset, &oldset);	if ((is_term = isatty(in)))	{		(void) tcgetattr (in, &term_old);		term_new = term_old;		if (do_echo)			term_new.c_lflag |= ECHO;		else			term_new.c_lflag &= ~ECHO;		if (tcsetattr (in, TCSAFLUSH, &term_new) == 0)			flushed = 1;	}	else	{		is_term = 0;		if ((flags = fcntl(in, F_GETFL, 0)) >= 0) {			old_flags = flags;			flags |= O_NONBLOCK;			fcntl(in, F_SETFL, flags);			while (read(in, &c, 1) > 0)				/* nothing */;			fcntl(in, F_SETFL, old_flags);			flushed = 1;		}	}	(void)write(out, prompt, strlen(prompt));	/* well, this looks ugly, but it handles the following end of line	   markers: \r \r\0 \r\n \n \n\r, at least at a second pass */	p = rh->buf;	for (;;)	{		if (read(in, &c, 1) <= 0)			return NULL;		if (!flushed && ((c == '\0') || (c == '\r') || (c == '\n'))) {			flushed = 1;			continue;		}		if ((c == '\r') || (c == '\n'))			break;		flushed = 1;		if (p < rh->buf + GETSTR_LENGTH)		{			if (do_echo && !is_term)				(void)write(out, &c, 1);			*p++ = c;		}	}	*p = '\0';	if (!do_echo || !is_term) (void)write(out, "\r\n", 2);	if (is_term)		tcsetattr (in, TCSAFLUSH, &term_old);	else {		if ((flags = fcntl(in, F_GETFL, 0)) >= 0) {			old_flags = flags;			flags |= O_NONBLOCK;			fcntl(in, F_SETFL, flags);			while (read(in, &c, 1) > 0)				/* nothing */;			fcntl(in, F_SETFL, old_flags);		}	}	(void) sigprocmask (SIG_SETMASK, &oldset, NULL);#endif	return rh->buf;}#endifvoid rc_mdelay(int msecs){#if 0  	struct timeval tv;	tv.tv_sec = (int) msecs / 1000;	tv.tv_usec = (msecs % 1000) * 1000;	select(0, NULL, NULL, NULL, &tv);#endif    }/** Generate a quite unique string * * @note not that unique at all... * * @param rh a handle to parsed configuration. * @return unique string. Memory does not need to be freed. */char *rc_mksid (rc_handle *rh){  //snprintf (rh->buf1, sizeof(rh->buf1), "%08lX%04X", (unsigned long int) time (NULL), (unsigned int) getpid ());  return rh->buf1;}/** Initialises new Radius Client handle * * @return a new rc_handle (free with rc_destroy). */rc_handle *rc_new(void){	rc_handle *rh;	rh = malloc(sizeof(*rh));	if (rh == NULL) {                rc_log(LOG_CRIT, "rc_new: out of memory");                return NULL;        }	memset(rh, 0, sizeof(*rh));	return rh;}/** Destroys Radius Client handle reclaiming all memory * * @param rh The Radius client handle to free. */void rc_destroy(rc_handle *rh){	rc_map2id_free(rh);	rc_dict_free(rh);	rc_config_free(rh);	free(rh);}/** Get next line from the stream. * * @param fp a %FILE pointer. * @param len output length. * @return the next line in an allocated buffer. */char *rc_fgetln(FILE *fp, size_t *len){#if 0	static char *buf = NULL;	static size_t bufsiz = 0;	char *ptr;	if (buf == NULL) {		bufsiz = RC_BUFSIZ;		if ((buf = malloc(bufsiz)) == NULL)			return NULL;	}	if (fgets(buf, (int)bufsiz, fp) == NULL)		return NULL;	*len = 0;	while ((ptr = strchr(&buf[*len], '\n')) == NULL) {		size_t nbufsiz = bufsiz + RC_BUFSIZ;		char *nbuf = realloc(buf, nbufsiz);		if (nbuf == NULL) {			int oerrno = errno;			free(buf);			errno = oerrno;			buf = NULL;			return NULL;		} else			buf = nbuf;		*len = bufsiz;		if (fgets(&buf[bufsiz], RC_BUFSIZ, fp) == NULL)			return buf;		bufsiz = nbufsiz;	}	*len = (ptr - buf) + 1;	return buf;#endif}/** Returns the current time as a double. * * @return current time (seconds since epoch) expressed as * 	double-precision floating point number. */double rc_getctime(void){#if 0      struct timeval timev;    if (gettimeofday(&timev, NULL) == -1)        return -1;    return timev.tv_sec + ((double)timev.tv_usec) / 1000000.0;#endif        return RTC_GetUnixTime();}/* * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Copyright 2006  The FreeRADIUS server project */#ifndef HAVE_STRLCPY/* * Copy src to string dst of size siz.  At most siz-1 characters * will be copied.  Always NUL terminates (unless siz == 0). * Returns strlen(src); if retval >= siz, truncation occurred. */size_trc_strlcpy(char *dst, char const *src, size_t siz){    char *d = dst;    char const *s = src;    size_t n = siz;    /* Copy as many bytes as will fit */    if (n != 0 && --n != 0) {        do {            if ((*d++ = *s++) == 0)                break;        } while (--n != 0);    }    /* Not enough room in dst, add NUL and traverse rest of src */    if (n == 0) {        if (siz != 0)            *d = '\0';      /* NUL-terminate dst */        while (*s++)            ;    }    return(s - src - 1);    /* count does not include NUL */}#endif
 |