⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avpair.c

📁 ppp点对点协议
💻 C
📖 第 1 页 / 共 2 页
字号:
void rc_avpair_insert (VALUE_PAIR **a, VALUE_PAIR *p, VALUE_PAIR *b){	VALUE_PAIR     *this_node = NULL;	VALUE_PAIR     *vp;	if (*a == (VALUE_PAIR *) NULL)	{		*a = b;		return;	}	if (!b)		return;	vp = *a;	if ( p == (VALUE_PAIR *) NULL) /* run to end of "a" list */	{		while (vp != (VALUE_PAIR *) NULL)		{			this_node = vp;			vp = vp->next;		}	}	else /* look for the "p" entry in the "a" list (or run to end) */	{		this_node = *a;		while (this_node != (VALUE_PAIR *) NULL)		{			if (this_node == p)			{				break;			}			this_node = this_node->next;		}	}	/* add "b" at this_node */	vp = this_node->next;	this_node->next = b;	/* run to end of "b" and connect the rest of "a" */	while (b->next)		b = b->next;	b->next = vp;	return;}/* * Function: rc_avpair_free * * Purpose: frees all value_pairs in the list * */void rc_avpair_free (VALUE_PAIR *pair){	VALUE_PAIR     *next;	while (pair != (VALUE_PAIR *) NULL)	{		next = pair->next;		free (pair);		pair = next;	}}/* * Function: rc_fieldcpy * * Purpose: Copy a data field from the buffer.  Advance the buffer *          past the data field. * */static void rc_fieldcpy (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: rc_avpair_parse * * Purpose: parses the buffer to extract the attribute-value pairs. * * Returns: 0 = successful parse of attribute-value pair, *	   -1 = syntax (or other) error detected. * */#define PARSE_MODE_NAME		0#define PARSE_MODE_EQUAL	1#define PARSE_MODE_VALUE	2#define PARSE_MODE_INVALID	3int rc_avpair_parse (char *buffer, VALUE_PAIR **first_pair){	int             mode;	char            attrstr[AUTH_ID_LEN];	char            valstr[AUTH_ID_LEN];	DICT_ATTR      *attr = NULL;	DICT_VALUE     *dval;	VALUE_PAIR     *pair;	VALUE_PAIR     *link;	struct tm      *tm;	time_t          timeval;	mode = PARSE_MODE_NAME;	while (*buffer != '\n' && *buffer != '\0')	{		if (*buffer == ' ' || *buffer == '\t')		{			buffer++;			continue;		}		switch (mode)		{		    case PARSE_MODE_NAME:		/* Attribute Name */			rc_fieldcpy (attrstr, &buffer);			if ((attr =				rc_dict_findattr (attrstr)) == (DICT_ATTR *) NULL)			{				error("rc_avpair_parse: unknown attribute");				if (*first_pair) {					rc_avpair_free(*first_pair);					*first_pair = (VALUE_PAIR *) NULL;				}				return (-1);			}			mode = PARSE_MODE_EQUAL;			break;		    case PARSE_MODE_EQUAL:		/* Equal sign */			if (*buffer == '=')			{				mode = PARSE_MODE_VALUE;				buffer++;			}			else			{				error("rc_avpair_parse: missing or misplaced equal sign");				if (*first_pair) {					rc_avpair_free(*first_pair);					*first_pair = (VALUE_PAIR *) NULL;				}				return (-1);			}			break;		    case PARSE_MODE_VALUE:		/* Value */			rc_fieldcpy (valstr, &buffer);			if ((pair =				(VALUE_PAIR *) malloc (sizeof (VALUE_PAIR)))							== (VALUE_PAIR *) NULL)			{				novm("rc_avpair_parse");				if (*first_pair) {					rc_avpair_free(*first_pair);					*first_pair = (VALUE_PAIR *) NULL;				}				return (-1);			}			strcpy (pair->name, attr->name);			pair->attribute = attr->value;			pair->type = attr->type;			pair->vendorcode = attr->vendorcode;			switch (pair->type)			{			    case PW_TYPE_STRING:				strcpy (pair->strvalue, valstr);				pair->lvalue = strlen(valstr);				break;			    case PW_TYPE_INTEGER:				if (isdigit (*valstr))				{					pair->lvalue = atoi (valstr);				}				else				{					if ((dval = rc_dict_findval (valstr))							== (DICT_VALUE *) NULL)					{						error("rc_avpair_parse: unknown attribute value: %s", valstr);						if (*first_pair) {							rc_avpair_free(*first_pair);							*first_pair = (VALUE_PAIR *) NULL;						}						free (pair);						return (-1);					}					else					{						pair->lvalue = dval->value;					}				}				break;			    case PW_TYPE_IPADDR:				pair->lvalue = rc_get_ipaddr(valstr);				break;			    case PW_TYPE_DATE:				timeval = time (0);				tm = localtime (&timeval);				tm->tm_hour = 0;				tm->tm_min = 0;				tm->tm_sec = 0;				rc_str2tm (valstr, tm);#ifdef TIMELOCAL				pair->lvalue = (UINT4) timelocal (tm);#else	/* TIMELOCAL */				pair->lvalue = (UINT4) mktime (tm);#endif	/* TIMELOCAL */				break;			    default:				error("rc_avpair_parse: unknown attribute type %d", pair->type);				if (*first_pair) {					rc_avpair_free(*first_pair);					*first_pair = (VALUE_PAIR *) NULL;				}				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: rc_avpair_tostr * * Purpose: Translate an av_pair into two strings * * Returns: 0 on success, -1 on failure * */int rc_avpair_tostr (VALUE_PAIR *pair, char *name, int ln, char *value, int lv){	DICT_VALUE     *dval;	char            buffer[32];	struct in_addr  inad;	unsigned char         *ptr;	*name = *value = '\0';	if (!pair || pair->name[0] == '\0') {		error("rc_avpair_tostr: pair is NULL or empty");		return (-1);	}	strncpy(name, pair->name, (size_t) ln);	switch (pair->type)	{	    case PW_TYPE_STRING:		lv--;		ptr = (unsigned char *) pair->strvalue;		while (*ptr != '\0')		{			if (!(isprint (*ptr)))			{				sprintf (buffer, "\\%03o", *ptr);				strncat(value, buffer, (size_t) lv);				lv -= 4;				if (lv < 0) break;			}			else			{				strncat(value, ptr, 1);				lv--;				if (lv < 0) break;			}			ptr++;		}		break;	    case PW_TYPE_INTEGER:		dval = rc_dict_getval (pair->lvalue, pair->name);		if (dval != (DICT_VALUE *) NULL)		{			strncpy(value, dval->name, (size_t) lv-1);		}		else		{			sprintf (buffer, "%ld", pair->lvalue);			strncpy(value, buffer, (size_t) lv);		}		break;	    case PW_TYPE_IPADDR:		inad.s_addr = htonl(pair->lvalue);		strncpy (value, inet_ntoa (inad), (size_t) lv-1);		break;	    case PW_TYPE_DATE:		strftime (buffer, sizeof (buffer), "%m/%d/%y %H:%M:%S",			  gmtime ((time_t *) & pair->lvalue));		strncpy(value, buffer, lv-1);		break;	    default:		error("rc_avpair_tostr: unknown attribute type %d", pair->type);		return (-1);		break;	}	return 0;}/* * Function: rc_avpair_readin * * Purpose: get a sequence of attribute value pairs from the file input *	    and make them into a list of value_pairs * */VALUE_PAIR *rc_avpair_readin(FILE *input){	VALUE_PAIR *vp = NULL;	char buffer[1024], *q;	while (fgets(buffer, sizeof(buffer), input) != NULL)	{		q = buffer;		while(*q && isspace(*q)) q++;		if ((*q == '\n') || (*q == '#') || (*q == '\0'))			continue;		if (rc_avpair_parse(q, &vp) < 0) {			error("rc_avpair_readin: malformed attribute: %s", buffer);			rc_avpair_free(vp);			return NULL;		}	}	return vp;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -