亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? users.c

?? 國際標準協議的
?? C
字號:
/*
 *
 *	RADIUS
 *	Remote Authentication Dial In User Service
 *
 *
 *	Livingston Enterprises, Inc.
 *	6920 Koll Center Parkway
 *	Pleasanton, CA   94566
 *
 *	Copyright 1992 Livingston Enterprises, Inc.
 *
 *	Permission to use, copy, modify, and distribute this software for any
 *	purpose and without fee is hereby granted, provided that this
 *	copyright and permission notice appear on all copies and supporting
 *	documentation, the name of Livingston Enterprises, Inc. not be used
 *	in advertising or publicity pertaining to distribution of the
 *	program without specific prior permission, and notice be given
 *	in supporting documentation that copying and distribution is by
 *	permission of Livingston Enterprises, Inc.   
 *
 *	Livingston Enterprises, Inc. makes no representations about
 *	the suitability of this software for any purpose.  It is
 *	provided "as is" without express or implied warranty.
 *
 */

static char sccsid[] =
"@(#)users.c	1.12 Copyright 2005 Livingston Enterprises Inc";

#include	<sys/types.h>
#include	<sys/socket.h>
#include	<sys/time.h>
#include	<netinet/in.h>

#include	<stdio.h>
#include	<netdb.h>
#include	<pwd.h>
#include	<time.h>
#include	<ctype.h>

#ifdef DBM

#include	<dbm.h>

#endif /* DBM */

#include	"radius.h"

extern char		*progname;
extern int		debug_flag;
extern char		*radius_dir;

static	void fieldcpy();
static	int  userparse();

#define FIND_MODE_NAME	0
#define FIND_MODE_REPLY	1
#define FIND_MODE_SKIP	2
#define FIND_MODE_FLUSH	3

/*************************************************************************
 *
 *	Function: user_find
 *
 *	Purpose: Find the named user in the database.  Create the
 *		 set of attribute-value pairs to check and reply with
 *		 for this user from the database.
 *
 *************************************************************************/

user_find(name, check_pairs, reply_pairs)
char	*name;
VALUE_PAIR	**check_pairs;
VALUE_PAIR	**reply_pairs;
{
	FILE		*userfd;
	char		buffer[256];
	char		msg[128];
	char		*ptr;
	int		namelen;
	int		mode;
	VALUE_PAIR	*check_first;
	VALUE_PAIR	*reply_first;
#ifdef DBM
	datum		named;
	datum		contentd;
#endif /* DBM */

	/* 
	 * Check for valid input, zero length names not permitted 
	 */

	mode = FIND_MODE_NAME;

	ptr=name;

/* 認證時有將用戶名中的空格及制表符去除,計帳時卻沒有,將導致用戶可以撥入卻無法計帳 */
/*	while (*ptr != '\0') {
		if (*ptr == ' ' || *ptr == '\t') {
			*ptr = '\0';
		} else {
			ptr++;
		}
	}
*/

	namelen=strlen(name);

	if (namelen < 1) {
		fprintf(stderr, "\n%s: zero length username not permitted",progname);
		return(-1);
	}


	/*
	 * Open the user table
	 */
	sprintf(buffer, "%s/%s", radius_dir, RADIUS_USERS);
#ifdef DBM
	if(dbminit(buffer) != 0) {
#else /* DBM */
	if((userfd = fopen(buffer, "r")) == (FILE *)NULL) {
#endif /* DBM */
		fprintf(stderr, "%s:Couldn't open %s for reading\n",
				progname, buffer);
		return(-1);
	}

	check_first = (VALUE_PAIR *)NULL;
	reply_first = (VALUE_PAIR *)NULL;


#ifdef DBM
	named.dptr = name;
	named.dsize = strlen(name);
	contentd = fetch(named);

	if(contentd.dsize == 0) {
		named.dptr = "DEFAULT";
		named.dsize = strlen("DEFAULT");
		contentd = fetch(named);
		if(contentd.dsize == 0) {
			dbmclose();
			return(-1);
		}
	}

	/*
	 * Parse the check values
	 */
	ptr = contentd.dptr;
	contentd.dptr[contentd.dsize] = '\0';

	if(userparse(ptr, &check_first) != 0) {
		sprintf(msg, "%s: Parse error for user %s\n",
				progname, name);
		fprintf(stderr, msg);
		log_err(msg);
		pairfree(check_first);
		dbmclose();
		return(-1);
	}
	while(*ptr != '\n' && *ptr != '\0') {
		ptr++;
	}
	if(*ptr != '\n') {
		pairfree(check_first);
		dbmclose();
		return(-1);
	}
	ptr++;
	/*
	 * Parse the reply values
	 */
	if(userparse(ptr, &reply_first) != 0) {
		fprintf(stderr, "%s: Parse error for user %s\n",
			progname, name);
		pairfree(check_first);
		pairfree(reply_first);
		dbmclose();
		return(-1);
	}
	dbmclose();

#else /* DBM */

	while(fgets(buffer, sizeof(buffer), userfd) != (char *)NULL) {
		if(mode == FIND_MODE_NAME) {
			/*
			 * Find the entry starting with the users name
			 */
			if((strncmp(buffer, name, namelen) == 0 &&
		 	 (buffer[namelen] == ' ' || buffer[namelen] == '\t')) ||
					 strncmp(buffer, "DEFAULT", 7) == 0) {
				if(strncmp(buffer, "DEFAULT", 7) == 0) {
					ptr = &buffer[7];
				}
				else {
					ptr = &buffer[namelen];
				}
				/*
				 * Parse the check values
				 */
				if(userparse(ptr, &check_first) != 0) {
					sprintf(msg,"%s: Parse error for user %s\n",
						progname, name);
					fprintf(stderr,msg);
					log_err(msg);
					pairfree(check_first);
					fclose(userfd);
					return(-1);
				}
				mode = FIND_MODE_REPLY;
			}
		}
		else {
			if(*buffer == ' ' || *buffer == '\t') {
				/*
				 * Parse the reply values
				 */
				if(userparse(buffer, &reply_first) != 0) {
					fprintf(stderr,
						"%s: Parse error for user %s\n",
						progname, name);
					pairfree(check_first);
					pairfree(reply_first);
					fclose(userfd);
					return(-1);
				}
			}
			else {
				/* We are done */
				fclose(userfd);
				*check_pairs = check_first;
				*reply_pairs = reply_first;
				return(0);
			}
		}
	}
	fclose(userfd);
#endif /* DBM */

	/* Update the callers pointers */
	if(reply_first != (VALUE_PAIR *)NULL) {
		*check_pairs = check_first;
		*reply_pairs = reply_first;
		return(0);
	}
	return(-1);
}

#define PARSE_MODE_NAME		0
#define PARSE_MODE_EQUAL	1
#define PARSE_MODE_VALUE	2
#define PARSE_MODE_INVALID	3

/*************************************************************************
 *
 *	Function: userparse
 *
 *	Purpose: Parses the buffer to extract the attribute-value pairs.
 *
 *************************************************************************/

static int
userparse(buffer, first_pair)
char		*buffer;
VALUE_PAIR	**first_pair;
{
	int		mode;
	char		attrstr[64];
	char		valstr[64];
	DICT_ATTR	*attr;
	DICT_ATTR	*dict_attrfind();
	DICT_VALUE	*dval;
	DICT_VALUE	*dict_valfind();
	VALUE_PAIR	*pair;
	VALUE_PAIR	*link;
	UINT4		ipstr2long();
	UINT4		get_ipaddr();
	struct tm	*tm;
	time_t		timeval;

	mode = PARSE_MODE_NAME;
	while(*buffer != '\n' && *buffer != '\0') {

		if(*buffer == ' ' || *buffer == '\t' || *buffer == ',') {
			buffer++;
			continue;
		}

		switch(mode) {

		case PARSE_MODE_NAME:
			/* Attribute Name */
			fieldcpy(attrstr, &buffer);
			if((attr = dict_attrfind(attrstr)) ==
						(DICT_ATTR *)NULL) {
				return(-1);
			}
			mode = PARSE_MODE_EQUAL;
			break;

		case PARSE_MODE_EQUAL:
			/* Equal sign */
			if(*buffer == '=') {
				mode = PARSE_MODE_VALUE;
				buffer++;
			}
			else {
				return(-1);
			}
			break;

		case PARSE_MODE_VALUE:
			/* Value */
			fieldcpy(valstr, &buffer);

			if((pair = (VALUE_PAIR *)malloc(sizeof(VALUE_PAIR))) ==
						(VALUE_PAIR *)NULL) {
				fprintf(stderr, "%s: no memory\n",
						progname);
				exit(-1);
			}
			strcpy(pair->name, attr->name);
			pair->attribute = attr->value;
			pair->type = attr->type;

			switch(pair->type) {

			case PW_TYPE_STRING:
				strcpy(pair->strvalue, valstr);
				break;

			case PW_TYPE_INTEGER:
				if(isdigit(*valstr)) {
					pair->lvalue = atoi(valstr);
				}
				else if((dval = dict_valfind(valstr)) ==
							(DICT_VALUE *)NULL) {
					free(pair);
					return(-1);
				}
				else {
					pair->lvalue = dval->value;
				}
				break;

			case PW_TYPE_IPADDR:
				pair->lvalue = get_ipaddr(valstr);
				break;

			case PW_TYPE_DATE:
				timeval = time(0);
				tm = localtime(&timeval);
				user_gettime(valstr, tm);
#ifdef TIMELOCAL
				pair->lvalue = (UINT4)timelocal(tm);
#else /* TIMELOCAL */
				pair->lvalue = (UINT4)mktime(tm);
#endif /* TIMELOCAL */
				break;

			default:
				free(pair);
				return(-1);
			}
			pair->next = (VALUE_PAIR *)NULL;
			if(*first_pair == (VALUE_PAIR *)NULL) {
				*first_pair = pair;
			}
			else {
				link = *first_pair;
				while(link->next != (VALUE_PAIR *)NULL) {
					link = link->next;
				}
				link->next = pair;
			}
			mode = PARSE_MODE_NAME;
			break;

		default:
			mode = PARSE_MODE_NAME;
			break;
		}
	}
	return(0);
}

/*************************************************************************
 *
 *	Function: fieldcpy
 *
 *	Purpose: Copy a data field from the buffer.  Advance the buffer
 *		 past the data field.
 *
 *************************************************************************/

static	void
fieldcpy(string, uptr)
char	*string;
char	**uptr;
{
	char	*ptr;

	ptr = *uptr;
	if(*ptr == '"') {
		ptr++;
		while(*ptr != '"' && *ptr != '\0' && *ptr != '\n') {
			*string++ = *ptr++;
		}
		*string = '\0';
		if(*ptr == '"') {
			ptr++;
		}
		*uptr = ptr;
		return;
	}

	while(*ptr != ' ' && *ptr != '\t' && *ptr != '\0' && *ptr != '\n' &&
						*ptr != '=' && *ptr != ',') {
			*string++ = *ptr++;
	}
	*string = '\0';
	*uptr = ptr;
	return;
}

/*************************************************************************
 *
 *	Function: user_update
 *
 *	Purpose: Updates a user in the database.  Replaces the original
 *		 entry with the name, the list of check items, and the
 *		 list of reply items which are supplied.
 *
 *************************************************************************/

user_update(name, user_check, user_reply)
char		*name;
VALUE_PAIR	*user_check;
VALUE_PAIR	*user_reply;
{
	FILE		*oldfd;
	FILE		*userfd;
	char		buffer[256];
	char		buffer1[256];
	int		namelen;
	int		mode;

	sprintf(buffer, "%s/%s", radius_dir, RADIUS_USERS);
	sprintf(buffer1, "%s/%s", radius_dir, RADIUS_HOLD);

	/* Move the user table to a temporary location */
	if(rename(buffer, buffer1) != 0) {
		fprintf(stderr, "%s: Couldn't rename %s\n",
				progname, buffer);
		return(-1);
	}

	/* Open the old user file (using the temporary name */
	if((oldfd = fopen(buffer1, "r")) == (FILE *)NULL) {
		fprintf(stderr, "%s: Couldn't open %s for reading\n",
				progname, buffer1);
		exit(-1);
	}

	/* Open the new user file */
	if((userfd = fopen(buffer, "w")) == (FILE *)NULL) {
		fprintf(stderr, "%s: Couldn't open %s for writing\n",
				progname, buffer);
		exit(-1);
	}

	mode = FIND_MODE_NAME;
	namelen = strlen(name);

	/* Copy the old to the new, only recreating the changed user */
	while(fgets(buffer, sizeof(buffer), oldfd) != (char *)NULL) {
		if(mode == FIND_MODE_NAME) {
			if((strncmp(buffer, name, namelen) == 0 &&
		 	 (buffer[namelen] == ' ' || buffer[namelen] == '\t'))) {

				/* Write our new information */
				fprintf(userfd, "%s\t", name);
				while(user_check != (VALUE_PAIR *)NULL) {
					fprint_attr_val(userfd, user_check);
					if(user_check->next !=
							(VALUE_PAIR *)NULL) {
						fprintf(userfd, ", ");
					}
					user_check = user_check->next;
				}
				fprintf(userfd, "\n\t");
				while(user_reply != (VALUE_PAIR *)NULL) {
					fprint_attr_val(userfd, user_reply);
					if(user_reply->next !=
							(VALUE_PAIR *)NULL) {
						fprintf(userfd, ",\n\t");
					}
					user_reply = user_reply->next;
				}
				fprintf(userfd, "\n");
				mode = FIND_MODE_SKIP;
			}
			else {
				fputs(buffer, userfd);
			}
		}
		else if(mode == FIND_MODE_SKIP) {
			if(*buffer != ' ' && *buffer != '\t') {
				fputs(buffer, userfd);
				mode = FIND_MODE_FLUSH;
			}
		}
		else {
			fputs(buffer, userfd);
		}
	}
	fclose(oldfd);
	fclose(userfd);
	return(0);
}

/*************************************************************************
 *
 *	Function: user_prtime
 *
 *	Purpose: Turns printable string into correct tm struct entries
 *
 *************************************************************************/

static char *months[] = {
	"Jan", "Feb", "Mar", "Apr", "May", "Jun",
	"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };

user_gettime(valstr, tm)
char		*valstr;
struct tm	*tm;
{
	char	buffer[48];
	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;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色美美综合视频| 久久久美女毛片| 日韩欧美一区在线观看| 亚洲免费视频成人| 久久久久久久电影| 亚洲二区在线视频| 亚洲一区二区三区四区在线免费观看| 国产精品系列在线| 日韩电影在线一区二区三区| 精品夜夜嗨av一区二区三区| 国内精品国产成人国产三级粉色| 国产精品小仙女| 国产一区二区主播在线| 成人精品免费看| 国产成人午夜精品5599| 国产精品一区二区果冻传媒| 日韩精品一区二区三区四区视频| 久久精品一区四区| 午夜激情一区二区三区| 在线视频你懂得一区二区三区| 欧美精品乱码久久久久久| 亚洲午夜国产一区99re久久| 奇米888四色在线精品| 欧美亚洲日本国产| 中文字幕欧美国产| 久久精品国产99国产| 91社区在线播放| 91麻豆精品国产自产在线| 成人欧美一区二区三区小说| 久久精品国产亚洲a| 色伊人久久综合中文字幕| 亚洲日本在线看| 国产成人在线免费观看| 欧美极品美女视频| 成人国产亚洲欧美成人综合网| 精品剧情在线观看| 精品一区二区三区av| 久久免费视频色| 蜜桃免费网站一区二区三区| 久久久久久久网| 韩国毛片一区二区三区| 日韩一级成人av| 天堂影院一区二区| 欧美三级一区二区| 肉色丝袜一区二区| 久久欧美中文字幕| 精品中文字幕一区二区小辣椒| 337p亚洲精品色噜噜| 蜜桃视频一区二区三区在线观看| 欧美一区二区在线播放| 国产一区二区福利| 视频一区欧美精品| 久久蜜桃香蕉精品一区二区三区| 成人h动漫精品一区二| 久久精品无码一区二区三区| 91香蕉视频黄| 久久精品国产秦先生| 国产精品三级久久久久三级| 欧美日韩国产中文| 久久99久久精品| 激情综合色综合久久| 亚洲欧洲国产日本综合| 欧美日韩中字一区| 麻豆成人久久精品二区三区小说| 18欧美亚洲精品| 日韩欧美你懂的| 国产乱人伦偷精品视频不卡| 亚洲黄色在线视频| 久久久综合精品| 日韩一区二区三区视频在线| 成人a区在线观看| 麻豆精品国产传媒mv男同| 一区二区三区在线免费播放| 曰韩精品一区二区| 日韩欧美综合在线| 在线看国产一区| 成人美女视频在线观看18| 一区二区三区.www| 国产日韩欧美高清| 日韩一区二区在线免费观看| 91蜜桃在线免费视频| 色综合久久中文综合久久97| 日本黄色一区二区| 久久精品夜夜夜夜久久| 欧美日韩一区二区不卡| 91片黄在线观看| 国产不卡视频在线播放| 理论片日本一区| 亚洲欧美日韩一区二区| 日韩午夜电影在线观看| 欧美日韩一区二区三区免费看| 色婷婷av一区二区三区大白胸| 成人av在线资源| 国产v综合v亚洲欧| 国产精品影视在线观看| 日韩不卡在线观看日韩不卡视频| 日韩av一二三| 老司机免费视频一区二区三区| 亚洲卡通动漫在线| 日韩国产精品久久久久久亚洲| 免费在线成人网| 亚洲综合男人的天堂| 免费久久精品视频| 国产在线国偷精品产拍免费yy| 国产一区日韩二区欧美三区| 国产99久久久国产精品免费看| 成人少妇影院yyyy| 97国产精品videossex| 成人精品免费视频| 日韩亚洲电影在线| 久久精品欧美日韩精品| 国产精品视频麻豆| 毛片av一区二区| 色猫猫国产区一区二在线视频| 欧美日韩视频一区二区| 91精品视频网| 欧美精品一区二区三区四区 | 色综合久久久网| 欧美午夜电影网| 日韩一级在线观看| 国产精品人成在线观看免费| 亚洲欧美二区三区| 久久国产精品区| 5858s免费视频成人| 亚洲视频1区2区| 亚洲bdsm女犯bdsm网站| gogo大胆日本视频一区| 91麻豆精品国产91久久久久久| 中文字幕久久午夜不卡| 日本v片在线高清不卡在线观看| 91小视频免费观看| 亚洲一二三四在线观看| 91在线观看视频| 久久久久亚洲综合| 午夜视频一区在线观看| 在线亚洲+欧美+日本专区| 在线综合+亚洲+欧美中文字幕| 中文字幕不卡在线| 日本aⅴ亚洲精品中文乱码| 99视频在线精品| 一区二区视频在线| 色国产综合视频| 18欧美亚洲精品| 成人午夜在线视频| 夜夜揉揉日日人人青青一国产精品| 91香蕉视频mp4| 欧美aaa在线| 在线视频欧美精品| 国产最新精品免费| 久久久99精品久久| 国产精品国产三级国产aⅴ入口| 成人美女视频在线观看| 国产乱对白刺激视频不卡| 激情小说欧美图片| 精品一区二区在线免费观看| 精品一区二区在线播放| 久久99久久99| 国内精品在线播放| 国产主播一区二区| 国产精品综合视频| 国产成人综合在线观看| 国产成人综合亚洲网站| 成人午夜又粗又硬又大| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 日本道免费精品一区二区三区| 99国产精品视频免费观看| 成人国产精品免费观看视频| 国产福利一区二区三区视频在线| 国产一区在线看| 国产成人av福利| 成人午夜激情片| 91视频免费播放| 欧美三级蜜桃2在线观看| 欧美电影影音先锋| 日韩欧美中文字幕精品| 欧美成人a视频| 国产亚洲欧洲一区高清在线观看| 中文字幕免费一区| 亚洲乱码中文字幕| 午夜精品久久久久久久蜜桃app| 日本不卡一二三区黄网| 精品无人码麻豆乱码1区2区| 国产成人在线色| 91在线免费播放| 欧美日本一区二区三区四区| 日韩久久久久久| 国产蜜臀97一区二区三区| 综合电影一区二区三区| 亚洲地区一二三色| 精品一区二区在线免费观看| 成人国产亚洲欧美成人综合网| 91黄视频在线| 日韩美一区二区三区| 国产精品视频免费看| 亚洲国产综合色| 久久av中文字幕片| 不卡的av中国片| 欧美浪妇xxxx高跟鞋交| 久久久高清一区二区三区| 亚洲乱码国产乱码精品精98午夜|