--- ./lirc-0.6.5/tools/lirc_client.c Tue Apr 24 15:05:58 2001 +++ ./lirc-0.6.5mp/tools/lirc_client.c Sat Mar 9 10:17:56 2002 @@ -22,6 +22,16 @@ #include #include #include +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif #include #include #include @@ -1114,15 +1122,15 @@ int lirc_code2char(struct lirc_config *config,char *code,char **string) { int rep; - char *backup; + char backup[LIRC_CODE_LEN]; char *remote,*button; struct lirc_config_entry *scan; *string=NULL; if(sscanf(code,"%*llx %x %*s %*s\n",&rep)==1) { - backup=strdup(code); - if(backup==NULL) return(-1); + strncpy(backup, code, LIRC_CODE_LEN); + backup[LIRC_CODE_LEN - 1] = '\0'; strtok(backup," "); strtok(NULL," "); @@ -1131,7 +1139,6 @@ if(button==NULL || remote==NULL) { - free(backup); return(0); } @@ -1145,11 +1152,11 @@ strcasecmp(scan->mode,config->current_mode)==0)) ) { + char *s; s=lirc_execute(config,scan); if(s!=NULL) { - free(backup); *string=s; return(0); } @@ -1163,7 +1170,6 @@ scan=NULL; } } - free(backup); } config->next=config->first; return(0); @@ -1189,14 +1195,53 @@ } -int lirc_nextcode(char **code) +int lirc_poll(long timeout) +{ + int ok = 1; + fd_set rdfds; + struct timeval tv; + + /* First check for leftovers */ + if (lirc_buffer != NULL && strlen(lirc_buffer)) + return LIRC_READY; + + FD_ZERO(&rdfds); + FD_SET(lirc_lircd, &rdfds); + + if (timeout < 0) + { + ok = select(lirc_lircd + 1, &rdfds, NULL, NULL, NULL); + } + else + { + tv.tv_sec=timeout / 1000000; + tv.tv_usec=(timeout % 1000000); + ok = select(lirc_lircd + 1, &rdfds, NULL, NULL, &tv); + } + + if (ok > 0) + { + return LIRC_READY; + } + else if (ok < 0) + { + return LIRC_ERROR; + } + else + { + errno = ETIMEDOUT; + return LIRC_TIMEOUT; + } + +} + +int lirc_read(char *code, size_t n) { static int packet_size=PACKET_SIZE; static int end_len=0; ssize_t len=0; char *end,c; - *code=NULL; if(lirc_buffer==NULL) { lirc_buffer=(char *) malloc(packet_size+1); @@ -1240,9 +1285,24 @@ end_len=strlen(end); c=end[0]; end[0]=0; - *code=strdup(lirc_buffer); + strncpy(code, lirc_buffer, n); end[0]=c; memmove(lirc_buffer,end,end_len+1); - if(*code==NULL) return(-1); + if(code==NULL) return(-1); return(0); +} + +int lirc_nextcode(char **code) +{ + static int warning=1; + + if(warning) + { + fprintf(stderr,"%s: warning: lirc_nextcode() is obsolete\n", + lirc_prog); + warning=0; + } + + *code=calloc(LIRC_CODE_LEN,1); + return lirc_read(*code, LIRC_CODE_LEN); } diff -u -r ./lirc-0.6.5/tools/lirc_client.h ./lirc-0.6.5mp/tools/lirc_client.h --- ./lirc-0.6.5/tools/lirc_client.h Thu Nov 9 12:51:00 2000 +++ ./lirc-0.6.5mp/tools/lirc_client.h Mon Mar 4 22:51:25 2002 @@ -20,6 +20,12 @@ #define LIRC_ALL ((char *) (-1)) +#define LIRC_READY 1 +#define LIRC_TIMEOUT 0 +#define LIRC_ERROR -1 + +#define LIRC_CODE_LEN 128 + enum lirc_flags {none=0x00, once=0x01, quit=0x02, @@ -76,6 +82,8 @@ /* obsolete */ char *lirc_ir2char(struct lirc_config *config,char *code); +int lirc_poll(long timeout); +int lirc_read(char *code, size_t n); int lirc_nextcode(char **code); int lirc_code2char(struct lirc_config *config,char *code,char **string);