Mercurial > audlegacy-plugins
view m4/lirc.m4 @ 891:502222ed5dd4 trunk
[svn] justify indentation by gnu indent. current state is a mixture of some styles and very hard to maintain. the code is exactly same to previous revision. this is preparation for upcoming commit so that to make taking diff easier.
author | yaz |
---|---|
date | Thu, 22 Mar 2007 22:17:15 -0700 |
parents | 13389e613d67 |
children |
line wrap: on
line source
## lirc.m4 (Macros for autoconf) ## ## (C) 1999 Christoph Bartelmus (lirc@bartelmus.de) ## ####################################################################### ## ## Check for LIRC ## ####################################################################### dnl AC_PATH_LIRC([MINIMUM-VERSION]) dnl Check for LIRC and define LIRCD dnl AC_DEFUN([AC_PATH_LIRC], [ min_lirc_version=ifelse([$1], ,0.5.5,$1) AC_MSG_CHECKING(for LIRC>=$min_lirc_version) AC_CACHE_VAL(ac_cv_have_lirc,[ no_lirc=no lirc_version=none lirc_cross_compiling=no if test ! -S /dev/lircd; then LIRCD=/dev/null no_lirc=yes else LIRCD=/dev/lircd rm -f conf.lirc ac_save_cflags="${CFLAGS}" CFLAGS="$CFLAGS -DLIRCD=\"$LIRCD\"" AC_TRY_RUN( [ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <getopt.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/un.h> #include <errno.h> #include <signal.h> #include <limits.h> #define PACKET_SIZE 256 /* three seconds */ #define TIMEOUT 3 int timeout=0; void sigalrm(int sig) { timeout=1; } const char *read_string(int fd) { static char buffer[PACKET_SIZE+1]=""; char *end; static int ptr=0; ssize_t ret; if(ptr>0) { memmove(buffer,buffer+ptr,strlen(buffer+ptr)+1); ptr=strlen(buffer); end=strchr(buffer,'\n'); } else { end=NULL; } alarm(TIMEOUT); while(end==NULL) { if(PACKET_SIZE<=ptr) { ptr=0; return(NULL); } ret=read(fd,buffer+ptr,PACKET_SIZE-ptr); if(ret<=0 || timeout) { if(!timeout) { alarm(0); } ptr=0; return(NULL); } buffer[ptr+ret]=0; ptr=strlen(buffer); end=strchr(buffer,'\n'); } alarm(0);timeout=0; end[0]=0; ptr=strlen(buffer)+1; return(buffer); } enum packet_state { P_BEGIN, P_MESSAGE, P_STATUS, P_DATA, P_N, P_DATA_N, P_END }; char *get_version(int fd,const char *packet) { int done,todo; const char *string,*data; char *endptr; enum packet_state state; int status,n; unsigned long data_n; unsigned int major,minor,micro; static char version[100]; todo=strlen(packet); data=packet; while(todo>0) { done=write(fd,(void *) data,todo); if(done<0) { return(NULL); } data+=done; todo-=done; } /* get response */ status=0; state=P_BEGIN; n=0; while(1) { string=read_string(fd); if(string==NULL) return(NULL); switch(state) { case P_BEGIN: if(strcasecmp(string,"BEGIN")!=0) { continue; } state=P_MESSAGE; break; case P_MESSAGE: if(strncasecmp(string,packet,strlen(string))!=0 || strlen(string)+1!=strlen(packet)) { state=P_BEGIN; continue; } state=P_STATUS; break; case P_STATUS: if(strcasecmp(string,"SUCCESS")==0) { status=0; } else if(strcasecmp(string,"END")==0) { status=0; return(NULL); } else if(strcasecmp(string,"ERROR")==0) { status=-1; } else { goto bad_packet; } state=P_DATA; break; case P_DATA: if(strcasecmp(string,"END")==0) { return(NULL); } else if(strcasecmp(string,"DATA")==0) { state=P_N; break; } goto bad_packet; case P_N: errno=0; data_n=strtoul(string,&endptr,0); if(!*string || *endptr) { goto bad_packet; } if(data_n==0) { state=P_END; } else { state=P_DATA_N; } break; case P_DATA_N: if(data_n==1 && status==0) { if(sscanf(string,"%u.%u.%u", &major,&minor,µ)==3) { sprintf(version,"%u.%u.%u", major,minor,micro); } else { goto bad_packet; } } n++; if(n==data_n) state=P_END; break; case P_END: if(strcasecmp(string,"END")==0) { return(version); } goto bad_packet; break; } } bad_packet: return(NULL); } int main(int argc,char **argv) { char *version,*min_version; unsigned int major,minor,micro,min_major,min_minor,min_micro; struct sockaddr_un addr; FILE *result; int fd; struct sigaction act; result=fopen("conf.lirc","w"); if(result==NULL) exit(EXIT_FAILURE); act.sa_handler=sigalrm; sigemptyset(&act.sa_mask); act.sa_flags=0; /* we need EINTR */ sigaction(SIGALRM,&act,NULL); addr.sun_family=AF_UNIX; strcpy(addr.sun_path,LIRCD); fd=socket(AF_UNIX,SOCK_STREAM,0); if(fd==-1) { fprintf(result,"unknown"); fclose(result); close(fd); exit(EXIT_FAILURE); }; if(connect(fd,(struct sockaddr *)&addr,sizeof(addr))==-1) { fprintf(result,"unknown"); fclose(result); close(fd); exit(EXIT_FAILURE); }; version=get_version(fd,"VERSION\n"); if(version==NULL) { fprintf(result,"<0.5.5"); fclose(result); close(fd); exit(EXIT_FAILURE); } fprintf(result,"%s",version); fclose(result); close(fd); /* HP/UX 9 (%@#!) writes to sscanf strings */ min_version=strdup("$min_lirc_version"); if(min_version==NULL) exit(EXIT_FAILURE); if(sscanf(version,"%u.%u.%u",&major,&minor,µ)!=3 || sscanf(min_version,"%u.%u.%u",&min_major,&min_minor,&min_micro)!=3) { exit(EXIT_FAILURE); } if(major<min_major || (major==min_major && minor<min_minor) || (major==min_major && minor==min_minor && micro<min_micro)) { exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } ], if test -f conf.lirc; then lirc_version=`cat conf.lirc` ## lirc_major_version=`cat lirc.conf | \ ## sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` ## lirc_minor_version=`cat lirc.conf | \ ## sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` ## lirc_micro_version=`cat lirc.conf | \ ## sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` else no_lirc=yes fi, no_lirc=yes if test -f conf.lirc; then lirc_version=`cat conf.lirc` else lirc_version=none fi ,lirc_cross_compiling=yes ) ## AC_TRY_RUN() rm -f conf.lirc CFLAGS="$ac_save_CFLAGS" fi ac_cv_have_lirc="no_lirc=${no_lirc} lirc_version=\"${lirc_version}\" \ lirc_cross_compiling=${lirc_cross_compiling} \ LIRCD=${LIRCD}" ]) ## AC_CACHE_VAL eval "$ac_cv_have_lirc" if test x${no_lirc} = xyes; then if test x${lirc_version} = xunknown; then AC_MSG_RESULT([missing (lircd not running ?)]) elif test x${lirc_version} != xnone; then AC_MSG_RESULT([missing (found lirc-${lirc_version})]) else AC_MSG_RESULT(missing) fi else if test x${lirc_cross_compiling} = xyes; then AC_MSG_RESULT(found) else AC_MSG_RESULT([found lirc-${lirc_version}]) fi fi AC_DEFINE_UNQUOTED(LIRCD,"${LIRCD}") ] )