Browse Source

- additional parameter to find_export
- find_export updated to honor flags parameter
- REPLY_ROUTE defined

Jan Janak 22 years ago
parent
commit
51c3861158
6 changed files with 61 additions and 36 deletions
  1. 2 2
      cfg.lex
  2. 32 17
      cfg.y
  3. 9 9
      db/db.c
  4. 9 4
      sr_module.c
  5. 2 1
      sr_module.h
  6. 7 3
      stats.c

+ 2 - 2
cfg.lex

@@ -76,7 +76,7 @@ SEND_TCP	send_tcp
 LOG		log
 ERROR	error
 ROUTE	route
-REPLY_ROUTE reply_route
+REPL_ROUTE reply_route
 EXEC	exec
 SETFLAG		setflag
 RESETFLAG	resetflag
@@ -196,7 +196,7 @@ EAT_ABLE	[\ \t\b\r]
 <INITIAL>{ISFLAGSET}	{ count(); yylval.strval=yytext; return ISFLAGSET; }
 <INITIAL>{LEN_GT}	{ count(); yylval.strval=yytext; return LEN_GT; }
 <INITIAL>{ROUTE}	{ count(); yylval.strval=yytext; return ROUTE; }
-<INITIAL>{REPLY_ROUTE}	{ count(); yylval.strval=yytext; return REPLY_ROUTE; }
+<INITIAL>{REPL_ROUTE}	{ count(); yylval.strval=yytext; return REPL_ROUTE; }
 <INITIAL>{EXEC}	{ count(); yylval.strval=yytext; return EXEC; }
 <INITIAL>{SET_HOST}	{ count(); yylval.strval=yytext; return SET_HOST; }
 <INITIAL>{SET_HOSTPORT}	{ count(); yylval.strval=yytext; return SET_HOSTPORT; }

+ 32 - 17
cfg.y

@@ -31,6 +31,7 @@
  * 2003-01-29  src_port added (jiri)
  * 2003-01-23  mhomed added (jiri)
  * 2003-03-19  replaced all mallocs/frees with pkg_malloc/pkg_free (andrei)
+ * 2003-03-19  Added support for route type in find_export (janakj)
  */
 
 
@@ -73,7 +74,8 @@ void yyerror(char* s);
 char* tmp;
 void* f_tmp;
 struct id_list* lst_tmp;
-
+int rt;  /* Type of route block for find_export */
+ 
 
 %}
 
@@ -101,7 +103,7 @@ struct id_list* lst_tmp;
 %token LOG_TOK
 %token ERROR
 %token ROUTE
-%token REPLY_ROUTE
+%token REPL_ROUTE
 %token EXEC
 %token SET_HOST
 %token SET_HOSTPORT
@@ -212,8 +214,9 @@ statements:	statements statement {}
 
 statement:	assign_stm 
 		| module_stm
-		| route_stm 
-		| reply_route_stm
+		| {rt=REQUEST_ROUTE;} route_stm 
+		| {rt=REPLY_ROUTE;} reply_route_stm
+
 		| CR	/* null statement*/
 	;
 
@@ -441,9 +444,9 @@ ipv6:	IPV6ADDR {
 	;
 
 
-route_stm:	ROUTE LBRACE actions RBRACE { push($3, &rlist[DEFAULT_RT]); }
+route_stm:  ROUTE LBRACE actions RBRACE { push($3, &rlist[DEFAULT_RT]); }
 
-		| ROUTE LBRACK NUMBER RBRACK LBRACE actions RBRACE { 
+	    | ROUTE LBRACK NUMBER RBRACK LBRACE actions RBRACE { 
 										if (($3<RT_NO) && ($3>=0)){
 											push($6, &rlist[$3]);
 										}else{
@@ -454,7 +457,7 @@ route_stm:	ROUTE LBRACE actions RBRACE { push($3, &rlist[DEFAULT_RT]); }
 		| ROUTE error { yyerror("invalid  route  statement"); }
 	;
 
-reply_route_stm: REPLY_ROUTE LBRACK NUMBER RBRACK LBRACE actions RBRACE {
+reply_route_stm: REPL_ROUTE LBRACK NUMBER RBRACK LBRACE actions RBRACE {
 										if (($3<REPLY_RT_NO)&&($3>=1)){
 											push($6, &reply_rlist[$3]);
 										} else {
@@ -462,7 +465,7 @@ reply_route_stm: REPLY_ROUTE LBRACK NUMBER RBRACK LBRACE actions RBRACE {
 												"table number");
 											YYABORT; }
 										}
-		| REPLY_ROUTE error { yyerror("invalid reply_route statement"); }
+		| REPL_ROUTE error { yyerror("invalid reply_route statement"); }
 	;
 /*
 rules:	rules rule { push($2, &$1); $$=$1; }
@@ -1028,10 +1031,14 @@ cmd:		FORWARD LPAREN host RPAREN	{ $$=mk_action(	FORWARD_T,
 										"string expected"); }
 		| REVERT_URI LPAREN RPAREN { $$=mk_action( REVERT_URI_T, 0,0,0,0); }
 		| REVERT_URI { $$=mk_action( REVERT_URI_T, 0,0,0,0); }
-		| ID LPAREN RPAREN			{ f_tmp=(void*)find_export($1, 0);
+		| ID LPAREN RPAREN			{ f_tmp=(void*)find_export($1, 0, rt);
 									   if (f_tmp==0){
-										yyerror("unknown command, missing"
-										" loadmodule?\n");
+										   if (find_export($1, 0, 0)) {
+											   yyerror("Command cannot be used in the block\n");
+										   } else {
+											   yyerror("unknown command, missing"
+												   " loadmodule?\n");
+										   }
 										$$=0;
 									   }else{
 										$$=mk_action(	MODULE_T,
@@ -1042,10 +1049,14 @@ cmd:		FORWARD LPAREN host RPAREN	{ $$=mk_action(	FORWARD_T,
 													);
 									   }
 									}
-		| ID LPAREN STRING RPAREN { f_tmp=(void*)find_export($1, 1);
+		| ID LPAREN STRING RPAREN { f_tmp=(void*)find_export($1, 1, rt);
 									if (f_tmp==0){
-										yyerror("unknown command, missing"
-										" loadmodule?\n");
+										if (find_export($1, 1, 0)) {
+											yyerror("Command cannot be used in the block\n");
+										} else {
+											yyerror("unknown command, missing"
+												" loadmodule?\n");
+										}
 										$$=0;
 									}else{
 										$$=mk_action(	MODULE_T,
@@ -1057,10 +1068,14 @@ cmd:		FORWARD LPAREN host RPAREN	{ $$=mk_action(	FORWARD_T,
 									}
 								  }
 		| ID LPAREN STRING  COMMA STRING RPAREN 
-								  { f_tmp=(void*)find_export($1, 2);
+								  { f_tmp=(void*)find_export($1, 2, rt);
 									if (f_tmp==0){
-										yyerror("unknown command, missing"
-										" loadmodule?\n");
+										if (find_export($1, 2, 0)) {
+											yyerror("Command cannot be used in the block\n");
+										} else {
+											yyerror("unknown command, missing"
+												" loadmodule?\n");
+										}
 										$$=0;
 									}else{
 										$$=mk_action3(	MODULE_T,

+ 9 - 9
db/db.c

@@ -34,31 +34,31 @@ db_func_t dbf;
 
 int bind_dbmod(void)
 {
-	db_use_table = (db_use_table_f)find_export("~db_use_table", 2);
+	db_use_table = (db_use_table_f)find_export("~db_use_table", 2, 0);
 	if (db_use_table == 0) return -1;
 
-	db_init = (db_init_f)find_export("~db_init", 1);
+	db_init = (db_init_f)find_export("~db_init", 1, 0);
 	if (db_init == 0) return -1;
 
-	db_close = (db_close_f)find_export("~db_close", 2);
+	db_close = (db_close_f)find_export("~db_close", 2, 0);
 	if (db_close == 0) return -1;
 
-	db_query = (db_query_f)find_export("~db_query", 2);
+	db_query = (db_query_f)find_export("~db_query", 2, 0);
 	if (db_query == 0) return -1;
 
-	db_raw_query = (db_raw_query_f)find_export("~db_raw_query", 2);
+	db_raw_query = (db_raw_query_f)find_export("~db_raw_query", 2, 0);
 	if (db_raw_query == 0) return -1;
 
-	db_free_query = (db_free_query_f)find_export("~db_free_query", 2);
+	db_free_query = (db_free_query_f)find_export("~db_free_query", 2, 0);
 	if (db_free_query == 0) return -1;
 
-	db_insert = (db_insert_f)find_export("~db_insert", 2);
+	db_insert = (db_insert_f)find_export("~db_insert", 2, 0);
 	if (db_insert == 0) return -1;
 
-	db_delete = (db_delete_f)find_export("~db_delete", 2);
+	db_delete = (db_delete_f)find_export("~db_delete", 2, 0);
 	if (db_delete == 0) return -1;
 
-	db_update = (db_update_f)find_export("~db_update", 2);
+	db_update = (db_update_f)find_export("~db_update", 2, 0);
 	if (db_update == 0) return -1;
 
 	return 0;

+ 9 - 4
sr_module.c

@@ -29,6 +29,7 @@
  *  2003-03-10  switched to new module_exports format: updated find_export,
  *               find_export_param, find_module (andrei)
  *  2003-03-19  replaced all mallocs/frees w/ pkg_malloc/pkg_free (andrei)
+ *  2003-03-19  Support for flags in find_export (janakj)
  */
 
 
@@ -195,8 +196,10 @@ skip:
 
 
 /* searches the module list and returns a pointer to the "name" function or
- * 0 if not found */
-cmd_function find_export(char* name, int param_no)
+ * 0 if not found 
+ * flags parameter os OR value of all flags that must match
+ */
+cmd_function find_export(char* name, int param_no, int flags)
 {
 	struct sr_module* t;
 	cmd_export_t* cmd;
@@ -204,9 +207,11 @@ cmd_function find_export(char* name, int param_no)
 	for(t=modules;t;t=t->next){
 		for(cmd=t->exports->cmds; cmd && cmd->name; cmd++){
 			if((strcmp(name, cmd->name)==0)&&
-				(cmd->param_no==param_no) ){
+			   (cmd->param_no==param_no) &&
+			   ((cmd->flags & flags) == flags)
+			  ){
 				DBG("find_export: found <%s> in module %s [%s]\n",
-						name, t->exports->name, t->path);
+				    name, t->exports->name, t->path);
 				return cmd->function;
 			}
 		}

+ 2 - 1
sr_module.h

@@ -57,6 +57,7 @@ typedef enum {
 
 
 #define REQUEST_ROUTE 1         /* Function can be used in request route blocks */
+#define REPLY_ROUTE 2           /* Function can be used in reply route blocks */
 
 struct cmd_export_ {
 	char* name;             /* null terminated command name */
@@ -114,7 +115,7 @@ struct sr_module* modules; /* global module list*/
 int register_builtin_modules();
 int register_module(struct module_exports*, char*,  void*);
 int load_module(char* path);
-cmd_function find_export(char* name, int param_no);
+cmd_function find_export(char* name, int param_no, int flags);
 struct sr_module* find_module(void *f, cmd_export_t** cmd);
 void destroy_modules();
 int init_child(int rank);

+ 7 - 3
stats.c

@@ -26,6 +26,10 @@
  * You should have received a copy of the GNU General Public License 
  * along with this program; if not, write to the Free Software 
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * History:
+ * -------
+ * 2003-03-19: added support for route type in find_export (janakj)
  */
 
 
@@ -325,9 +329,9 @@ int stats_register()
 	const char *func = __FUNCTION__;
 	struct stats_funcs f;
 
-	f.reg_func = (void*) find_export("snmp_register_handler", 2);
-	f.new_func = (void*) find_export("snmp_new_handler", 1);
-	f.free_func = (void*) find_export("snmp_free_handler", 1);
+	f.reg_func = (void*) find_export("snmp_register_handler", 2, 0);
+	f.new_func = (void*) find_export("snmp_new_handler", 1, 0);
+	f.free_func = (void*) find_export("snmp_free_handler", 1, 0);
 	if(!f.reg_func || !f.new_func || !f.free_func) {
 		LOG(L_INFO, "%s: Couldn't find SNMP module\n", func);
 		LOG(L_INFO, "%s: Not reporting stats through SNMP\n", func);