Next Previous Contents

22. Appendix B - Serial Infrared Port Sniffers

22.1 Sniffer by Gerd Knorr

This programm is a courtesy by Gerd Knorr. You may use it to sniff the traffic which is going trough your IrDA port for details of the protocol (change the default ttyS1 in the source if necessary):


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <termios.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/ioctl.h>

#define BUFSIZE 1024

int
read_and_print(int fd, int sec, int usec)
{
    int             rc,l,i;
    char            buf[BUFSIZE+1];
    fd_set          set;
    struct timeval  tv;
    
    if (sec || usec) {
        FD_ZERO(&set);
        FD_SET(fd,&set);
        tv.tv_sec  = sec;

        tv.tv_usec = usec;
        if (0 == select(fd+1,&set,NULL,NULL,&tv))
            return -1;
    }
    
    switch (rc = read(fd,buf,BUFSIZE)) {
    case 0:
        printf("EOF");
        exit(0);
        break;
    case -1:
        perror("read");
        exit(1);
    default:
        for (l = 0; l < rc; l+= 16) {
            printf("%04x  ",l);
            for (i = l; i < l+16; i++) {
                if (i < rc)
                    printf("%02x ",buf[i]);
                else
                    printf("-- ");
                if ((i%4) == 3)
                    printf(" ");
            }
            for (i = l; i < l+16; i++) {

                if (i < rc)
                    printf("%c",isalnum(buf[i]) ? buf[i] : '.');
            }
            printf("\n");
        }
        break;
    }
    return rc;
}

void
setlines(int fd, int rts, int dtr)
{
    int lines = 0;

    if (rts) lines |= TIOCM_RTS;
    if (dtr) lines |= TIOCM_DTR;
    
    ioctl(fd,TIOCMSET,&lines);
}

int main(int argc, char *argv[])
{
    int                 ser,i;
    struct termios      saved_attributes,tattr;
    struct winsize      win;
    char                buf[16];
    
    if (-1 == (ser = open("/dev/ttyS1",O_RDWR))) {
        perror("open /dev/ttyS1");
        exit(1);
    }
        
    /* Set the terminal mode */
    tcgetattr (ser, &tattr);
    cfmakeraw (&tattr);
    cfsetospeed (&tattr,B9600);
    cfsetispeed (&tattr,B9600);
    tcsetattr (ser, 0, &tattr);
    
    setlines(ser,0,0);
#if 0
    tcsendbreak(ser,0);
#endif

    /* main loop */
    fprintf(stderr,"setup done\n");
    while (-1 != read_and_print(ser,30,0)) {
        usleep(100000);
    }
    
    return 0;
}

22.2 sersniff

Written by Jonathan McDowell sersniff is a simple program to tunnel/sniff between 2 serial ports. The program was written to aid with the decoding of the protocol used by the Nokia 9000i Communicator to talk to the NServer software Nokia provides, which only runs under Windows.


Next Previous Contents