And here's the patch. :)

-- 
Ronny H Arild - <[EMAIL PROTECTED]>
diff -c irattach/irattach.c irattach.fix/irattach.c
*** irattach/irattach.c Thu Apr  4 01:06:56 2002
--- irattach.fix/irattach.c     Mon Apr  8 11:30:28 2002
***************
*** 6,13 ****
   * Status:        Experimental.
   * Author:        Dag Brattli <[EMAIL PROTECTED]>
   * Created at:    Sun Dec  7 23:21:05 1997
!  * Modified at:   Tue Jan 25 11:33:48 2000
!  * Modified by:   Dag Brattli <[EMAIL PROTECTED]>
   * Sources:       
   *
   *     Copyright (c) 1997, 1999-2000 Dag Brattli <[EMAIL PROTECTED]>, 
--- 6,13 ----
   * Status:        Experimental.
   * Author:        Dag Brattli <[EMAIL PROTECTED]>
   * Created at:    Sun Dec  7 23:21:05 1997
!  * Modified at:   Mon Apr  8 11:30:28 2002
!  * Modified by:   Ronny Arild <[EMAIL PROTECTED]>
   * Sources:       
   *
   *     Copyright (c) 1997, 1999-2000 Dag Brattli <[EMAIL PROTECTED]>, 
***************
*** 25,30 ****
--- 25,31 ----
   ********************************************************************/
  
  #include <stdio.h>
+ #include <stdlib.h>
  #include <string.h>
  #include <errno.h>
  #include <fcntl.h>
***************
*** 51,62 ****
--- 52,71 ----
  extern int set_sysctl_param(char *name, char *value);
  extern int execute(char *msg, char *cmd);
  
+ extern char *optarg;
+ extern int optind;
+ 
  #define VERSION "1.1 Tue Nov  9 15:30:55 1999 Dag Brattli"
  
+ void clean_exit(int status);
+ 
  static int initfdflags = -1;  /* Initial file descriptor flags */
  static int initdisc = -1;
  static int fd = -1;
  
+ static struct termios termsave;
+ static int initfdsave = -1;
+ 
  /* Default path for pid file */
  char *pidfile = "/var/run/irattach.pid";
  
***************
*** 73,78 ****
--- 82,104 ----
  struct irtty_info info;
  char device[20];
  
+ struct dongle_list_s {
+   int   id;
+   char *dongle;
+ } dongle_list[] = {
+   { IRDA_ESI_DONGLE,          "esi" },
+   { IRDA_TEKRAM_DONGLE,               "tekram" },
+   { IRDA_ACTISYS_DONGLE,      "actisys" },
+   { IRDA_ACTISYS_PLUS_DONGLE, "actisys+" },
+   { IRDA_GIRBIL_DONGLE,               "girbil" },
+   { IRDA_LITELINK_DONGLE,     "litelink" },
+   { IRDA_AIRPORT_DONGLE,      "airport" },
+   { IRDA_OLD_BELKIN_DONGLE,   "old_belkin" },
+   { IRDA_EP7211_IR,           "ep7211" },
+   { IRDA_MCP2120_DONGLE,      "mcp2120" },
+   { -1,                               NULL }
+ };
+ 
  /*
   * Function load_module (name)
   *
***************
*** 107,113 ****
        
        if (ioctl(fd, TIOCGETD, &initdisc) < 0) {
                syslog(LOG_ERR, "ioctl(TIOCGETD): %m");
!               exit (1);
        }
        
        if (ioctl(fd, TIOCSETD, &irdadisc) < 0){
--- 133,139 ----
        
        if (ioctl(fd, TIOCGETD, &initdisc) < 0) {
                syslog(LOG_ERR, "ioctl(TIOCGETD): %m");
!               clean_exit(-1);
        }
        
        if (ioctl(fd, TIOCSETD, &irdadisc) < 0){
***************
*** 115,121 ****
                         "Maybe you don't have IrDA support in your kernel?\n");
                syslog(LOG_ERR, "irattach: tty: set_disc(%d): %s\n", 
                        irdadisc, strerror(errno));
!               exit (1);
        }
  }
  
--- 141,147 ----
                         "Maybe you don't have IrDA support in your kernel?\n");
                syslog(LOG_ERR, "irattach: tty: set_disc(%d): %s\n", 
                        irdadisc, strerror(errno));
!               clean_exit(-1);
        }
  }
  
***************
*** 148,160 ****
  void init_irda_ldisc(int fd) 
  {
        struct termios tios;
!       
        tty_configure(&tios);
        
        /* tcflush(fd, TCIFLUSH); */
        if (tcsetattr(fd, TCSAFLUSH, &tios) < 0) {
                syslog(LOG_ERR, "tcsetattr: %m");
!               exit(1);
        }
  }
  
--- 174,193 ----
  void init_irda_ldisc(int fd) 
  {
        struct termios tios;
! 
!       if (tcgetattr(fd, &tios) != 0) {
!               syslog (LOG_ERR, "tcgetattr: %m");
!               clean_exit(-1);
!       }
!       /* Save the original values */
!       memcpy(&termsave, &tios, sizeof(struct termios));
! 
        tty_configure(&tios);
        
        /* tcflush(fd, TCIFLUSH); */
        if (tcsetattr(fd, TCSAFLUSH, &tios) < 0) {
                syslog(LOG_ERR, "tcsetattr: %m");
!               clean_exit(-1);
        }
  }
  
***************
*** 167,193 ****
  int modify_flags(char *dev, int set, int clear)
  {
        struct ifreq ifr;
!       int fd;
  
        /* Create socket */
!         fd = socket(AF_IRDA, SOCK_STREAM, 0);
!         if (fd < 0) {
                  perror("socket");
!                 exit(-1);
          }
  
          strncpy(ifr.ifr_name, dev, IFNAMSIZ);
  
!       if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0)
                return -1;
  
          ifr.ifr_flags |= set;
        ifr.ifr_flags &= ~clear;
        strncpy(ifr.ifr_name, dev, IFNAMSIZ);
  
!         if (ioctl(fd, SIOCSIFFLAGS, &ifr) < 0) {
                  return -1;
          }
          return 0;     
  }
  
--- 200,232 ----
  int modify_flags(char *dev, int set, int clear)
  {
        struct ifreq ifr;
!       int sockfd;
  
        /* Create socket */
!         sockfd = socket(AF_IRDA, SOCK_STREAM, 0);
!         if (sockfd < 0) {
                  perror("socket");
!                 clean_exit(-1);
          }
  
          strncpy(ifr.ifr_name, dev, IFNAMSIZ);
  
!       if (ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0) {
!               syslog (LOG_WARNING, "ioctl(SIOCGIFFLAGS): %m");
!               close (sockfd);
                return -1;
+       }
  
          ifr.ifr_flags |= set;
        ifr.ifr_flags &= ~clear;
        strncpy(ifr.ifr_name, dev, IFNAMSIZ);
  
!         if (ioctl(sockfd, SIOCSIFFLAGS, &ifr) < 0) {
!               syslog (LOG_WARNING, "ioctl(SIOCSIFFLAGS): %m");
!               close (sockfd);
                  return -1;
          }
+       close(sockfd);
          return 0;     
  }
  
***************
*** 211,216 ****
--- 250,256 ----
   */
  void ifdown(char *dev)
  {
+       syslog(LOG_INFO, "Stopping device %s", dev);
        modify_flags(dev, 0, IFF_UP);
  }
  
***************
*** 229,238 ****
        }
        ifdown(device);
  
        unlink(pidfile);
  
        syslog(LOG_INFO, "exiting ...\n");
!       exit(0);
  }
  
  void start_tty(char *dev) 
--- 269,307 ----
        }
        ifdown(device);
  
+       /* Reset the fd termios struct ++ */
+       if (fd != -1) {
+               initfdflags &= ~O_NONBLOCK;
+               if (fcntl (fd, F_SETFL, initfdflags) != 0) {
+                       syslog (LOG_ERR, "fcntl: initfdflags: %m");
+               }
+               if (ioctl(fd, TIOCSETD, &initdisc) < 0){
+                       fprintf(stderr,  
+                               "Maybe you don't have IrDA support in your kernel?\n");
+                       syslog(LOG_ERR, "ioctl: set_inidisc: %m");
+               }
+               if (tcsetattr(fd, TCSANOW, &termsave) != 0) {
+                       syslog (LOG_ERR, "tcsetattr: %m");
+               }
+               if (fcntl (fd, F_SETFL, initfdsave) != 0) {
+                       syslog (LOG_ERR, "fcntl: initfdsave: %m");
+               }
+               close(fd);
+       }
        unlink(pidfile);
  
        syslog(LOG_INFO, "exiting ...\n");
! 
!       if (signo == -1)
!               exit(1);
!       else
!               exit(0);
! }
! 
! void clean_exit(int status)
! {
!       cleanup(status);
!       exit(-1); /* should not get here */
  }
  
  void start_tty(char *dev) 
***************
*** 242,256 ****
         */
        if ((fd = open(dev, O_NONBLOCK | O_RDWR, 0)) < 0) {
                syslog(LOG_ERR, "Failed to open %s: %m", dev);
!               exit(1);
        }
        if ((initfdflags = fcntl(fd, F_GETFL)) == -1) {
                syslog(LOG_ERR, "Couldn't get device fd flags: %m");
!               exit(1);
        }
        
        initfdflags &= ~O_NONBLOCK;
!       fcntl(fd, F_SETFL, initfdflags);
                
        /* Set up the serial device as a irda interface */      
        init_irda_ldisc(fd);
--- 311,330 ----
         */
        if ((fd = open(dev, O_NONBLOCK | O_RDWR, 0)) < 0) {
                syslog(LOG_ERR, "Failed to open %s: %m", dev);
!               clean_exit(-1);
        }
        if ((initfdflags = fcntl(fd, F_GETFL)) == -1) {
                syslog(LOG_ERR, "Couldn't get device fd flags: %m");
!               clean_exit(-1);
        }
+ 
+       /* Save flags */
+       initfdsave = initfdflags;
        
        initfdflags &= ~O_NONBLOCK;
!       if (fcntl(fd, F_SETFL, initfdflags) == -1) {
!               syslog(LOG_WARNING, "Couldn't set device fd flags: %m");
!       }
                
        /* Set up the serial device as a irda interface */      
        init_irda_ldisc(fd);
***************
*** 264,273 ****
        if (fcntl(fd, F_SETFL, initfdflags | O_NONBLOCK) == -1) {
                syslog(LOG_ERR, 
                       "Couldn't set device to non-blocking mode: %m");
!               exit(1);
        }
  }
  
  /*
   * Function main (argc, )
   *
--- 338,368 ----
        if (fcntl(fd, F_SETFL, initfdflags | O_NONBLOCK) == -1) {
                syslog(LOG_ERR, 
                       "Couldn't set device to non-blocking mode: %m");
!               clean_exit(1);
        }
  }
  
+ int get_dongle(char *dongle)
+ {
+       int i;
+       for (i = 0; dongle_list[i].dongle != NULL; i++) {
+               if (strcmp(dongle_list[i].dongle, dongle) == 0)
+                       return dongle_list[i].id;
+       }
+       return -1;
+ }
+ 
+ void print_usage(void)
+ {
+       int i;
+       fprintf(stderr, "Usage: irattach [-d dongle] [-s] [-v] [-h] <dev>\n");
+       fprintf(stderr, "Dongles supported:\n");
+       for (i = 0; dongle_list[i].dongle != NULL; i++)
+               fprintf(stderr, "\t%s\n", dongle_list[i].dongle);
+       fprintf(stderr, "\n");
+ }
+ 
+ 
  /*
   * Function main (argc, )
   *
***************
*** 280,290 ****
        int dongle = -1;
        int c, fir;
  
!       printf("%s\n", VERSION);
!       if (argc < 2) {
!               fputs("Usage: irattach <dev> [-d dongle] [-s]\n\n", stderr);
        }
        
        fork_now();
  
        if (signal(SIGHUP, cleanup) == SIG_ERR)
--- 375,419 ----
        int dongle = -1;
        int c, fir;
  
!       if (argc < 2 || argc > 5) {
!               print_usage();
!               exit(-1);
        }
        
+       while ((c = getopt(argc, argv, "d:hsv")) != -1) {
+               switch (c) {
+               case 's':
+                       /* User wants to start discovery */
+                       set_sysctl_param("discovery", "1");
+                       break;
+               case 'd':
+                       dongle = get_dongle(optarg);
+                       if (dongle == -1) {
+                               fprintf(stderr,
+                                      "Sorry, dongle not supported yet!\n");
+                               print_usage();
+                               exit(-1);
+                       }       
+                       break;
+               case 'v':
+                       printf("Version: %s\n", VERSION);
+                       exit(0);
+               case 'h':
+                       print_usage();
+                       exit(0);
+               default:
+                       print_usage();
+                       exit(-1);
+               }
+       }
+ 
+       if (optind != (argc-1)) {
+               fprintf(stderr, "Missing device!\n");
+               print_usage();
+               exit(-1);
+       }
+ 
+       printf("%s\n", VERSION);
        fork_now();
  
        if (signal(SIGHUP, cleanup) == SIG_ERR)
***************
*** 294,300 ****
        if (signal(SIGINT, cleanup) == SIG_ERR)
                syslog(LOG_INFO, "signal(SIGINT): %m");
  
!       strncpy(device, argv[1], 20);
        if (strncmp("/dev", device, 4) == 0) {
                start_tty(device);
                fir = 0;
--- 423,429 ----
        if (signal(SIGINT, cleanup) == SIG_ERR)
                syslog(LOG_INFO, "signal(SIGINT): %m");
  
!       strncpy(device, argv[optind], 20);
        if (strncmp("/dev", device, 4) == 0) {
                start_tty(device);
                fir = 0;
***************
*** 303,346 ****
                fir = 1;
        }
  
!       while ((c = getopt(argc, argv, "sd:v")) != -1) {
!               switch (c) {
!               case 's':
!                       /* User wants to start discovery */
!                       set_sysctl_param("discovery", "1");
!                       break;
!               case 'd':
!                       if (strcmp(optarg, "esi") == 0)
!                               dongle = IRDA_ESI_DONGLE;
!                       else if (strcmp(optarg, "tekram") == 0)
!                               dongle = IRDA_TEKRAM_DONGLE;
!                       else if (strcmp(optarg, "actisys") == 0)
!                               dongle = IRDA_ACTISYS_DONGLE;
!                       else if (strcmp(optarg, "actisys+") == 0)
!                               dongle = IRDA_ACTISYS_PLUS_DONGLE;
!                       else if (strcmp(optarg, "girbil") == 0)
!                               dongle = IRDA_GIRBIL_DONGLE;
!                       else if (strcmp(optarg, "litelink") == 0)
!                               dongle = IRDA_LITELINK_DONGLE;
!                       else if (strcmp(optarg, "airport") == 0)
!                               dongle = IRDA_AIRPORT_DONGLE;
!                       else if (strcmp(optarg, "old_belkin") == 0)
!                               dongle = IRDA_OLD_BELKIN_DONGLE;
!                       else if (strcmp(optarg, "ep7211") == 0)
!                               dongle = IRDA_EP7211_IR;
!                       else if (strcmp(optarg, "mcp2120") == 0)
!                               dongle = IRDA_MCP2120_DONGLE;
!                       if (dongle == -1) {
!                               syslog(LOG_ERR, 
!                                      "Sorry, dongle not supported yet!");
!                               exit(-1);
!                       }       
!                       ioctl(fd, IRTTY_IOCTDONGLE, dongle);
!                       break;
!               case 'v':
!                       printf("Version: %s\n", VERSION);
!                       exit(-1);
!               }
        }
  
        /* Start the network interface */
--- 432,440 ----
                fir = 1;
        }
  
!       /* If dongle is chosen -> set appropriate device */
!       if (dongle != -1) {
!               ioctl(fd, IRTTY_IOCTDONGLE, dongle);
        }
  
        /* Start the network interface */
***************
*** 366,372 ****
         *  really what we want :-)
         */
        while (1)
!               sleep(2);
  
!       return 0;
  }
--- 460,467 ----
         *  really what we want :-)
         */
        while (1)
!               pause();
!       clean_exit(-1); /* just in case :-) */
  
!       return 0; /* should never get here */
  }


Reply via email to