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

📄 htgroup.c

📁 用于linux和其他unix下面的
💻 C
📖 第 1 页 / 共 2 页
字号:
/* MODULE							HTGroup.c**		GROUP FILE ROUTINES****	Contains group file parser and routines to match IP**	address templates and to find out group membership.****** AUTHORS:**	AL	Ari Luotonen	luotonen@dxcern.cern.ch**** HISTORY:****** BUGS:******** GROUP DEFINITION GRAMMAR:****	string = "sequence of alphanumeric characters"**	user_name ::= string**	group_name ::= string**	group_ref ::= group_name**	user_def ::= user_name | group_ref**	user_def_list ::= user_def { ',' user_def }**	user_part = user_def | '(' user_def_list ')'****	templ = "sequence of alphanumeric characters and '*'s"**	ip_number_mask ::= templ '.' templ '.' templ '.' templ**	domain_name_mask ::= templ { '.' templ }**	address ::= ip_number_mask | domain_name_mask**	address_def ::= address**	address_def_list ::= address_def { ',' address_def }**	address_part = address_def | '(' address_def_list ')'****	item ::= [user_part] ['@' address_part]**	item_list ::= item { ',' item }**	group_def ::= item_list**	group_decl ::= group_name ':' group_def***/#include <HTUtils.h>#include <HTAAUtil.h>#include <HTLex.h>	/* Lexical analysor	*/#include <HTGroup.h>	/* Implemented here	*/#include <LYUtils.h>#include <LYLeaks.h>/*** Group file parser*/typedef HTList UserDefList;typedef HTList AddressDefList;typedef struct {    UserDefList *	user_def_list;    AddressDefList *	address_def_list;} Item;typedef struct {    char *	name;    GroupDef *	translation;} Ref;PRIVATE void syntax_error ARGS3(FILE *,	 fp,				char *,	 msg,				LexItem, lex_item){    char buffer[41];    int cnt = 0;    int ch;    while ((ch = getc(fp)) != EOF  &&  ch != '\n')	if (cnt < 40) buffer[cnt++] = (char) ch;    buffer[cnt] = (char)0;    CTRACE((tfp, "%s %d before: '%s'\nHTGroup.c: %s (got %s)\n",		"HTGroup.c: Syntax error in rule file at line",		HTlex_line, buffer, msg, lex_verbose(lex_item)));    HTlex_line++;}PRIVATE AddressDefList *parse_address_part ARGS1(FILE *, fp){    AddressDefList *address_def_list = NULL;    LexItem lex_item;    BOOL only_one = NO;    lex_item = lex(fp);    if (lex_item == LEX_ALPH_STR || lex_item == LEX_TMPL_STR)	only_one = YES;    else if (lex_item != LEX_OPEN_PAREN  ||	     ((lex_item = lex(fp)) != LEX_ALPH_STR &&	      lex_item != LEX_TMPL_STR)) {	syntax_error(fp, "Expecting a single address or '(' beginning list",		     lex_item);	return NULL;    }    address_def_list = HTList_new();    for(;;) {	Ref *ref = typecalloc(Ref);	if (ref == NULL)	    outofmem(__FILE__, "parse_address_part");	ref->name = NULL;	ref->translation = NULL;	StrAllocCopy(ref->name, HTlex_buffer);	HTList_addObject(address_def_list, (void*)ref);	if (only_one || (lex_item = lex(fp)) != LEX_ITEM_SEP)	    break;	/*	** Here lex_item == LEX_ITEM_SEP; after item separator it	** is ok to have one or more newlines (LEX_REC_SEP) and	** they are ignored (continuation line).	*/	do {	    lex_item = lex(fp);	} while (lex_item == LEX_REC_SEP);	if (lex_item != LEX_ALPH_STR && lex_item != LEX_TMPL_STR) {	    syntax_error(fp, "Expecting an address template", lex_item);	    HTList_delete(address_def_list);	    address_def_list = NULL;	    return NULL;	}    }    if (!only_one && lex_item != LEX_CLOSE_PAREN) {	HTList_delete(address_def_list);	address_def_list = NULL;	syntax_error(fp, "Expecting ')' closing address list", lex_item);	return NULL;    }    return address_def_list;}PRIVATE UserDefList *parse_user_part ARGS1(FILE *, fp){    UserDefList *user_def_list = NULL;    LexItem lex_item;    BOOL only_one = NO;    lex_item = lex(fp);    if (lex_item == LEX_ALPH_STR)	only_one = YES;    else if (lex_item != LEX_OPEN_PAREN  ||	     (lex_item = lex(fp)) != LEX_ALPH_STR) {	syntax_error(fp, "Expecting a single name or '(' beginning list",		     lex_item);	return NULL;    }    user_def_list = HTList_new();    for (;;) {	Ref *ref = typecalloc(Ref);	if (ref == NULL)	    outofmem(__FILE__, "parse_user_part");	ref->name = NULL;	ref->translation = NULL;	StrAllocCopy(ref->name, HTlex_buffer);	HTList_addObject(user_def_list, (void*)ref);	if (only_one || (lex_item = lex(fp)) != LEX_ITEM_SEP)	    break;	/*	** Here lex_item == LEX_ITEM_SEP; after item separator it	** is ok to have one or more newlines (LEX_REC_SEP) and	** they are ignored (continuation line).	*/	do {	    lex_item = lex(fp);	} while (lex_item == LEX_REC_SEP);	if (lex_item != LEX_ALPH_STR) {	    syntax_error(fp, "Expecting user or group name", lex_item);	    HTList_delete(user_def_list);	    user_def_list = NULL;	    return NULL;	}    }    if (!only_one && lex_item != LEX_CLOSE_PAREN) {	HTList_delete(user_def_list);	user_def_list = NULL;	syntax_error(fp, "Expecting ')' closing user/group list", lex_item);	return NULL;    }    return user_def_list;}PRIVATE Item *parse_item ARGS1(FILE *, fp){    Item *item = NULL;    UserDefList *user_def_list = NULL;    AddressDefList *address_def_list = NULL;    LexItem lex_item;    lex_item = lex(fp);    if (lex_item == LEX_ALPH_STR || lex_item == LEX_OPEN_PAREN) {	unlex(lex_item);	user_def_list = parse_user_part(fp);	lex_item = lex(fp);    }    if (lex_item == LEX_AT_SIGN) {	lex_item = lex(fp);	if (lex_item == LEX_ALPH_STR || lex_item == LEX_TMPL_STR ||	    lex_item == LEX_OPEN_PAREN) {	    unlex(lex_item);	    address_def_list = parse_address_part(fp);	}	else {	    if (user_def_list) {		HTList_delete(user_def_list);	/* @@@@ */		user_def_list = NULL;	    }	    syntax_error(fp, "Expected address part (single address or list)",			 lex_item);	    return NULL;	}    }    else unlex(lex_item);    if (!user_def_list && !address_def_list) {	syntax_error(fp, "Empty item not allowed", lex_item);	return NULL;    }    item = typecalloc(Item);    if (item == NULL)	outofmem(__FILE__, "parse_item");    item->user_def_list = user_def_list;    item->address_def_list = address_def_list;    return item;}PRIVATE ItemList *parse_item_list ARGS1(FILE *, fp){    ItemList *item_list = HTList_new();    Item *item;    LexItem lex_item;    for(;;) {	if (!(item = parse_item(fp))) {	    HTList_delete(item_list);	/* @@@@ */	    item_list = NULL;	    return NULL;	}	HTList_addObject(item_list, (void*)item);	lex_item = lex(fp);	if (lex_item != LEX_ITEM_SEP) {	    unlex(lex_item);	    return item_list;	}	/*	** Here lex_item == LEX_ITEM_SEP; after item separator it	** is ok to have one or more newlines (LEX_REC_SEP) and	** they are ignored (continuation line).	*/	do {	    lex_item = lex(fp);	} while (lex_item == LEX_REC_SEP);	unlex(lex_item);    }}PUBLIC GroupDef *HTAA_parseGroupDef ARGS1(FILE *, fp){    ItemList *item_list = NULL;    GroupDef *group_def = NULL;    LexItem lex_item;    if (!(item_list = parse_item_list(fp))) {	return NULL;    }    group_def = typecalloc(GroupDef);    if (group_def == NULL)	outofmem(__FILE__, "HTAA_parseGroupDef");    group_def->group_name = NULL;    group_def->item_list = item_list;    if ((lex_item = lex(fp)) != LEX_REC_SEP) {	syntax_error(fp, "Garbage after group definition", lex_item);    }    return group_def;}PRIVATE GroupDef *parse_group_decl ARGS1(FILE *, fp){    char *group_name = NULL;    GroupDef *group_def = NULL;    LexItem lex_item;    do {	lex_item = lex(fp);    } while (lex_item == LEX_REC_SEP);	/* Ignore empty lines */    if (lex_item != LEX_ALPH_STR) {	if (lex_item != LEX_EOF)	    syntax_error(fp, "Expecting group name", lex_item);	return NULL;    }    StrAllocCopy(group_name, HTlex_buffer);    if (LEX_FIELD_SEP != (lex_item = lex(fp))) {	syntax_error(fp, "Expecting field separator", lex_item);	FREE(group_name);	return NULL;    }    if (!(group_def = HTAA_parseGroupDef(fp))) {	FREE(group_name);	return NULL;    }    group_def->group_name = group_name;    return group_def;}/*** Group manipulation routines*/PRIVATE GroupDef *find_group_def ARGS2(GroupDefList *,	group_list,				       CONST char *,	group_name){    if (group_list && group_name) {	GroupDefList *cur = group_list;	GroupDef *group_def;	while (NULL != (group_def = (GroupDef*)HTList_nextObject(cur))) {	    if (!strcmp(group_name, group_def->group_name)) {		return group_def;	    }	}    }    return NULL;}PUBLIC void HTAA_resolveGroupReferences ARGS2(GroupDef *,	group_def,					      GroupDefList *,	group_def_list){    if (group_def && group_def->item_list && group_def_list) {	ItemList *cur1 = group_def->item_list;	Item *item;	while (NULL != (item = (Item*)HTList_nextObject(cur1))) {	    UserDefList *cur2 = item->user_def_list;	    Ref *ref;	    while (NULL != (ref = (Ref*)HTList_nextObject(cur2)))		ref->translation = find_group_def(group_def_list, ref->name);	    /* Does NOT translate address_def_list */	}    }}PRIVATE void add_group_def ARGS2(GroupDefList *, group_def_list,				 GroupDef *,	 group_def){    HTAA_resolveGroupReferences(group_def, group_def_list);    HTList_addObject(group_def_list, (void*)group_def);}PRIVATE GroupDefList *parse_group_file ARGS1(FILE *, fp){

⌨️ 快捷键说明

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