rpms/lirc/devel lirc-0.8.3-remote-includes-directive.patch, NONE, 1.1 lirc-0.8.3-validate-transmit-buffer.patch, NONE, 1.1

Jarod Wilson (jwilson) fedora-extras-commits at redhat.com
Mon May 12 22:16:17 UTC 2008


Author: jwilson

Update of /cvs/pkgs/rpms/lirc/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv16751

Added Files:
	lirc-0.8.3-remote-includes-directive.patch 
	lirc-0.8.3-validate-transmit-buffer.patch 
Log Message:
Helps to cvs add the patches...

lirc-0.8.3-remote-includes-directive.patch:

--- NEW FILE lirc-0.8.3-remote-includes-directive.patch ---
diff -Naurp lirc-0.8.3.orig/daemons/config_file.c lirc-0.8.3/daemons/config_file.c
--- lirc-0.8.3.orig/daemons/config_file.c	2007-07-29 14:20:06.000000000 -0400
+++ lirc-0.8.3/daemons/config_file.c	2008-05-12 18:02:32.000000000 -0400
@@ -1,4 +1,4 @@
-/*      $Id: config_file.c,v 5.27 2007/07/29 18:20:06 lirc Exp $      */
+/*      $Id: config_file.c,v 5.28 2008/05/09 18:40:59 lirc Exp $      */
 
 /****************************************************************************
  ** config_file.c ***********************************************************
@@ -20,6 +20,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <libgen.h>
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <sys/stat.h>
@@ -32,9 +33,14 @@
 #include "config_file.h"
 
 #define LINE_LEN 1024
+#define MAX_INCLUDES 10
 
-int line;
-int parse_error;
+const char *whitespace = " \t";
+
+static int line;
+static int parse_error;
+
+static struct ir_remote * read_config_recursive(FILE *f, const char *name, int depth);
 
 void **init_void_array(struct void_array *ar,size_t chunk_size, size_t item_size)
 {
@@ -643,7 +649,84 @@ struct ir_remote *sort_by_bit_count(stru
 	return top;
 }
 
-struct ir_remote * read_config(FILE *f)
+static const char *lirc_parse_include(char *s)
+{
+	char *last;
+	size_t len;
+	
+	len=strlen(s);
+	if(len<2)
+	{
+		return NULL;
+	}
+	last = s+len-1;
+	while(last >  s && strchr(whitespace, *last) != NULL)
+	{
+		last--;
+	}
+	if(last <= s)
+	{
+		return NULL;
+	}
+	if(*s!='"' && *s!='<')
+	{
+		return NULL;
+	}
+	if(*s=='"' && *last!='"')
+	{
+		return NULL;
+	}
+	else if(*s=='<' && *last!='>')
+	{
+		return NULL;
+	}
+	*last = 0;
+	memmove(s, s+1, len-2+1); /* terminating 0 is copied, and
+				     maybe more, but we don't care */
+	return s;
+}
+
+static const char *lirc_parse_relative(char *dst, size_t dst_size,
+				 const char *child, const char *current)
+{
+	char *dir;
+	size_t dirlen;
+
+	if (!current)
+		return child;
+
+	/* Not a relative path */
+	if (*child == '/')
+		return child;
+
+	if(strlen(current) >= dst_size)
+	{
+		return NULL;
+	}
+	strcpy(dst, current);
+	dir = dirname(dst);
+	dirlen = strlen(dir);
+	if(dir != dst)
+	{
+		memmove(dst, dir, dirlen + 1);
+	}
+
+	if(dirlen + 1 + strlen(child) + 1 > dst_size)
+	{
+		return NULL;
+	}
+	strcat(dst, "/");
+	strcat(dst, child);
+	
+	return dst;
+}
+
+struct ir_remote * read_config(FILE *f, const char *name)
+{
+	return read_config_recursive(f, name, 0);
+}
+
+static struct ir_remote * read_config_recursive(FILE *f, const char *name, int depth)
 {
 	char buf[LINE_LEN+1], *key, *val, *val2;
         int len,argc;
@@ -656,6 +739,7 @@ struct ir_remote * read_config(FILE *f)
 
 	line=0;
 	parse_error=0;
+	LOGPRINTF(2, "parsing '%s'", name);
 
 	while(fgets(buf,LINE_LEN,f)!=NULL)
 	{
@@ -683,14 +767,74 @@ struct ir_remote * read_config(FILE *f)
                 if(buf[0]=='#'){
 			continue;
                 }
-		key=strtok(buf," \t");
+		key=strtok(buf, whitespace);
 		/* ignore empty lines */
 		if(key==NULL) continue;
-		val=strtok(NULL, " \t");
+		val=strtok(NULL, whitespace);
 		if(val!=NULL){
-			val2=strtok(NULL, " \t");
+			val2=strtok(NULL, whitespace);
 			LOGPRINTF(3,"\"%s\" \"%s\"",key,val);
-                        if (strcasecmp("begin",key)==0){
+			if (strcasecmp("include",key)==0){
+                                FILE* childFile;
+				const char *childName;
+				const char *fullPath;
+				char result[FILENAME_MAX+1];
+
+
+				if (depth > MAX_INCLUDES) {
+					logprintf(LOG_ERR,"error opening child file defined at %s:%d",name,line);
+					logprintf(LOG_ERR,"too many files included");
+					parse_error=-1;
+					break;
+				}
+
+				childName = lirc_parse_include(val);
+				if (!childName){
+					logprintf(LOG_ERR,"error parsing child file value defined at line %d:",line);
+					logprintf(LOG_ERR,"invalid quoting");
+					parse_error=-1;
+					break;
+				}
+
+				fullPath = lirc_parse_relative(result, sizeof(result), childName, name);
+				if (!fullPath) {
+					logprintf(LOG_ERR,"error composing relative file path defined at line %d:",line);
+					logprintf(LOG_ERR,"resulting path too long");
+					parse_error=-1;
+					break;
+				}
+
+				childFile = fopen(fullPath, "r");
+				if (childFile == NULL){
+					logprintf(LOG_ERR,"error opening child file '%s' defined at line %d:",fullPath, line);
+					logprintf(LOG_ERR,"ignoring this child file for now.");
+				}
+				else{
+					int save_line = line;
+					
+					if (!top_rem){
+						/* create first remote */
+						LOGPRINTF(2,"creating first remote");
+						rem = read_config_recursive(childFile, fullPath, depth + 1);
+						if(rem != (void *) -1 && rem != NULL) {
+							top_rem = rem;
+						} else {
+							rem = NULL;
+						}
+					}else{
+						/* create new remote */
+						LOGPRINTF(2,"creating next remote");
+						rem->next=read_config_recursive(childFile, fullPath, depth + 1);
+						if(rem->next != (void *) -1 && rem->next != NULL) {
+							rem=rem->next;
+						} else {
+							rem->next = NULL;
+						}
+					}
+					fclose(childFile);
+					line = save_line;
+				}
+			}else if (strcasecmp("begin",key)==0){
 				if (strcasecmp("codes", val)==0){
                                         /* init codes mode */
 					LOGPRINTF(2,"    begin codes");
@@ -744,7 +888,7 @@ struct ir_remote * read_config(FILE *f)
 						
 						if(val2[0]=='#') break; /* comment */
 						node=defineNode(code, val2);
-						val2=strtok(NULL, " \t");
+						val2=strtok(NULL, whitespace);
 					}
 					code->current=NULL;
 					add_void_array(&codes_list, code);
@@ -822,7 +966,7 @@ struct ir_remote * read_config(FILE *f)
 						
 						if(val2[0]=='#') break; /* comment */
 						node=defineNode(code, val2);
-						val2=strtok(NULL, " \t");
+						val2=strtok(NULL, whitespace);
 					}
 					code->current=NULL;
 					add_void_array(&codes_list, code);
@@ -842,7 +986,7 @@ struct ir_remote * read_config(FILE *f)
 				case ID_remote:
 					argc=defineRemote(key, val, val2, rem);
 					if(!parse_error && ((argc==1 && val2!=NULL) || 
-					   (argc==2 && val2!=NULL && strtok(NULL," \t")!=NULL)))
+					   (argc==2 && val2!=NULL && strtok(NULL, whitespace)!=NULL)))
 					{
 						logprintf(LOG_WARNING,"garbage after '%s'"
 							  " token in line %d ignored",
@@ -857,7 +1001,7 @@ struct ir_remote * read_config(FILE *f)
 						
 						if(val2[0]=='#') break; /* comment */
 						node=defineNode(code, val2);
-						val2=strtok(NULL, " \t");
+						val2=strtok(NULL, whitespace);
 					}
 					code->current=NULL;
 					add_void_array(&codes_list, code);
@@ -905,7 +1049,7 @@ struct ir_remote * read_config(FILE *f)
 								break;
 							}
 						}
-						while ((val=strtok(NULL," \t"))){
+						while ((val=strtok(NULL, whitespace))){
 							if (!addSignal(&signals, val)) break;
 						}
 					}
@@ -950,7 +1094,15 @@ struct ir_remote * read_config(FILE *f)
 		}
 	}
         if (parse_error){
+		static int print_error = 1;
+		
+		if(print_error) {
+			logprintf(LOG_ERR, "reading of file '%s' failed",
+				  name);
+			print_error = 0;
+		}
 		free_config(top_rem);
+		if(depth == 0) print_error = 1;
                 return((void *) -1);
         }
 	/* kick reverse flag */
diff -Naurp lirc-0.8.3.orig/daemons/config_file.h lirc-0.8.3/daemons/config_file.h
--- lirc-0.8.3.orig/daemons/config_file.h	2006-01-28 13:36:44.000000000 -0500
+++ lirc-0.8.3/daemons/config_file.h	2008-05-12 18:02:22.000000000 -0400
@@ -1,4 +1,4 @@
-/*      $Id: config_file.h,v 5.10 2006/01/28 18:36:44 lirc Exp $      */
+/*      $Id: config_file.h,v 5.11 2008/05/09 18:40:59 lirc Exp $      */
 
 /****************************************************************************
  ** config_file.h ***********************************************************
@@ -86,7 +86,7 @@ int addSignal(struct void_array *signals
 struct ir_ncode * defineCode(char *key, char *val, struct ir_ncode *code);
 struct ir_code_node *defineNode(struct ir_ncode *code, const char *val);
 int defineRemote(char * key, char * val, char *val2, struct ir_remote *rem);
-struct ir_remote *read_config(FILE *f);
+struct ir_remote *read_config(FILE *f, const char *name);
 void free_config(struct ir_remote *remotes);
 
 #endif
diff -Naurp lirc-0.8.3.orig/daemons/irrecord.c lirc-0.8.3/daemons/irrecord.c
--- lirc-0.8.3.orig/daemons/irrecord.c	2008-02-14 15:42:56.000000000 -0500
+++ lirc-0.8.3/daemons/irrecord.c	2008-05-12 18:03:51.000000000 -0400
@@ -1,4 +1,4 @@
-/*      $Id: irrecord.c,v 5.69 2008/02/14 20:42:56 lirc Exp $      */
+/*      $Id: irrecord.c,v 5.71 2008/05/09 18:40:59 lirc Exp $      */
 
 /****************************************************************************
  ** irrecord.c **************************************************************
@@ -311,7 +311,7 @@ int main(int argc,char **argv)
 				progname, filename, progname);
 			exit(EXIT_FAILURE);
 		}
-		remotes=read_config(fin);
+		remotes=read_config(fin, filename);
 		fclose(fin);
 		if(remotes==(void *) -1 || remotes==NULL)
 		{
@@ -748,7 +748,7 @@ int main(int argc,char **argv)
 		if(hw.deinit_func) hw.deinit_func();
 		exit(EXIT_FAILURE);
 	}
-	remotes=read_config(fin);
+	remotes=read_config(fin,filename);
 	fclose(fin);
 	if(remotes==NULL)
 	{
diff -Naurp lirc-0.8.3.orig/daemons/lircd.c lirc-0.8.3/daemons/lircd.c
--- lirc-0.8.3.orig/daemons/lircd.c	2008-03-30 10:53:06.000000000 -0400
+++ lirc-0.8.3/daemons/lircd.c	2008-05-12 18:02:12.000000000 -0400
@@ -1,4 +1,4 @@
-/*      $Id: lircd.c,v 5.76 2008/03/30 14:53:06 lirc Exp $      */
+/*      $Id: lircd.c,v 5.77 2008/05/09 18:40:59 lirc Exp $      */
 
 /****************************************************************************
  ** lircd.c *****************************************************************
@@ -406,7 +406,7 @@ void config(void)
 		logperror(LOG_ERR,NULL);
 		return;
 	}
-	config_remotes=read_config(fd);
+	config_remotes=read_config(fd, configfile);
 	fclose(fd);
 	if(config_remotes==(void *) -1)
 	{
diff -Naurp lirc-0.8.3.orig/NEWS lirc-0.8.3/NEWS
--- lirc-0.8.3.orig/NEWS	2008-05-12 17:59:40.000000000 -0400
+++ lirc-0.8.3/NEWS	2008-05-12 18:05:04.000000000 -0400
@@ -1,3 +1,6 @@
+0.8.4-CVS: future
+  * support for include directive in lircd.conf
+
 0.8.3: 05/04/08
   * added support for Samsung USB IR Receiver (Robert Schedel)
   * added support for Soundgraph iMON IR/LCD (Dean Harding)

lirc-0.8.3-validate-transmit-buffer.patch:

--- NEW FILE lirc-0.8.3-validate-transmit-buffer.patch ---
--- transmit.c	2007/07/29 18:20:13	5.27
+++ transmit.c	2008/05/11 13:29:47	5.28
@@ -1,4 +1,4 @@
-/*      $Id: transmit.c,v 5.27 2007/07/29 18:20:13 lirc Exp $      */
+/*      $Id: transmit.c,v 5.28 2008/05/11 13:29:47 lirc Exp $      */
 
 /****************************************************************************
  ** transmit.c **************************************************************
@@ -116,6 +116,34 @@
 	return(0);
 }
 
+static int check_send_buffer(void)
+{
+	int i;
+
+	if (send_buffer.wptr == 0) 
+	{
+		LOGPRINTF(1, "nothing to send");
+		return(0);
+	}
+	for (i = 0; i < send_buffer.wptr; i++)
+	{
+		if(send_buffer.data[i] == 0)
+		{
+			if(i%2)
+			{
+				LOGPRINTF(1, "invalid space: %d", i);
+			}
+			else
+			{
+				LOGPRINTF(1, "invalid pulse: %d", i);
+			}
+			return 0;
+		}
+	}
+	
+	return 1;
+}
+
 static inline void flush_send_buffer(void)
 {
 	if(send_buffer.pendingp>0)
@@ -500,5 +528,13 @@
 		goto init_send_loop;
 	}
 	LOGPRINTF(3, "transmit buffer ready");
-	return(1);
+	if(!check_send_buffer())
+	{
+		logprintf(LOG_ERR, "invalid send buffer");
+		logprintf(LOG_ERR,
+			  "this remote configuration cannot be used "
+			  "to transmit");
+		return 0;
+	}
+	return 1;
 }




More information about the fedora-extras-commits mailing list