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 */
}