📄 btmodem.c
字号:
if (argc == 1) { usage(); return 0; } /* Initialize all variables: */ mddev = NULL; bty = NULL; mdfd = 0; btfd = 0; endprog = 0; mdbuf = NULL; btbuf = NULL; verbose = 0; oldmdsig = 0; oldbtsig = 0; logging = 0; logfile = NULL; logfp = 0; logtext = 0; silent = 0; crtscts = 0; hexdumplinewidth = 0; mdtxcount = mdrxcount = btrxcount = bttxcount = 0; /* Read the command line parameters: */ while ((param = getopt(argc, argv, "eb:hl::m:qvx::?")) != -1) { switch (param) { case 'e': emu = 1; break; case 'b': /* Get the string with the bluetooth bty: */ bty = (char *)malloc(strlen(optarg)+1); memset(bty, 0, strlen(optarg)+1); memcpy(bty, optarg, strlen(optarg)); break; case 'h': crtscts = 1; break; case 'l': logging = 1; if (optarg != 0) { logfile = (char *)malloc(strlen(optarg)+1); memset(logfile, 0, strlen(optarg)+1); memcpy(logfile, optarg, strlen(optarg)); } else { logfile = (char *)malloc(19); memset(logfile, 0, 19); memcpy(logfile, "/var/log/btmodem", 18); } break; case 'm': /* Get the string with the modem tty: */ mddev = (char *)malloc(strlen(optarg)+1); memset(mddev, 0, strlen(optarg)+1); memcpy(mddev, optarg, strlen(optarg)); break; case 'q': silent = 1; break; case 'v': verbose++; break; case 'x': hexdumplinewidth = 16; if (optarg != 0) { hexdumplinewidth = atoi(optarg); } break; case '?': default: free_ressources(); usage(); exit(1); } } if (emu) return emulate(); logtext = (char *)malloc(BUFFER_SIZE); memset(logtext, 0, BUFFER_SIZE); /* Open the logfile: */ if (logging) { logfp = fopen(logfile, "a"); if (logfp == NULL) { perror("Unable to open logfile"); handle_interruption(0); } } /* Set the devicenames to default values, if not yet initialized: */ if (bty == NULL) { bty = (char *)malloc(10); memset(bty, 0, 10); memcpy(bty, "/dev/bty0", 9); } if (mddev == NULL) { mddev = (char *)malloc(11); memset(mddev, 0, 11); memcpy(mddev, "/dev/ttyS0", 10); } snprintf(logtext, BUFFER_SIZE, "Connecting bluetooth serial connection on device %s with modem on device %s", bty, mddev); logit(logtext); memset(logtext, 0, BUFFER_SIZE); if (verbose) logit("Installing signal handler for interruption"); signal(SIGINT, &handle_interruption); fflush(stdout); /* Open the devices */ btfd = open(bty, O_RDWR); mdfd = open(mddev, O_RDWR); if (btfd == -1) { perror("Unable to open bluetooth serial device"); handle_interruption(0); } if (mdfd == -1) { perror("Unable to open modem device"); handle_interruption(0); } /* Initialize the serial connection to the modem: */ modem_setup(mdfd); modem_setup(btfd); snprintf(logtext, BUFFER_SIZE, "Opened devices %s and %s successfully", bty, mddev); logit(logtext); memset(logtext, 0, BUFFER_SIZE); /* Make them nonblocking */ val = fcntl(mdfd, F_GETFL, 0); fcntl(mdfd, F_SETFL, val | O_NONBLOCK); val = fcntl(btfd, F_GETFL, 0); fcntl(btfd, F_SETFL, val | O_NONBLOCK); /* Get the maximal file descriptor for select: */ if (mdfd > btfd) maxhandle = mdfd; else maxhandle = btfd; /* Initialize the buffers: */ mdbuf = (char *)malloc(BUFFER_SIZE); btbuf = (char *)malloc(BUFFER_SIZE); memset(mdbuf, 0, BUFFER_SIZE); memset(btbuf, 0, BUFFER_SIZE); btdata = 0; mddata = 0; mdrxsize = 0; btrxsize = 0; if (verbose > 1) logit("Buffers for data created and initialized"); /* Initialize the bluetooth connection with the modem stat */ ioctl(mdfd, TIOCMGET, &oldmdsig); /* Check DSR stat: */ snprintf(logtext, BUFFER_SIZE, "Initializing lines on bluetooth connection: DSR: "); if ((oldmdsig & TIOCM_DSR) == TIOCM_DSR) { snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "1, "); setbtsig |= TIOCM_DTR; } else { snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "0, "); unsetbtsig |= TIOCM_DTR; } /* Check RI stat: */ snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "RI: "); if ((oldmdsig & TIOCM_RI) == TIOCM_RI) { snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "1, "); setbtsig |= TIOCM_RI; } else { snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "0, "); unsetbtsig |= TIOCM_RI; } /* Check CAR stat: */ snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "CAR: "); if ((oldmdsig & TIOCM_CAR) == TIOCM_CAR) { snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "1"); setbtsig |= TIOCM_CAR; } else { snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "0"); unsetbtsig |= TIOCM_CAR; } if (verbose) logit(logtext); memset(logtext, 0, BUFFER_SIZE); ioctl(btfd, TIOCMBIS, &setbtsig); ioctl(btfd, TIOCMBIC, &unsetbtsig); ioctl(btfd, TIOCMGET, &oldbtsig); /* * The main loop of the program. * Runs until interupted */ while (endprog == 0) { /* Read the signals on the devices: */ ioctl(mdfd, TIOCMGET, &mdsig); ioctl(btfd, TIOCMGET, &btsig); /* If the signals differ from the old ones, check if some signals must be set on the other side: */ if (btsig != oldbtsig) { snprintf(logtext, BUFFER_SIZE, "Line change on bluetooth side: "); setmdsig = 0; unsetmdsig = 0; /* Check if stat of DSR has changed: */ if ((btsig & TIOCM_DSR) != (oldbtsig & TIOCM_DSR)) { snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "DTR -> "); if ((btsig & TIOCM_DSR) == TIOCM_DSR) { setmdsig |= TIOCM_DTR; snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "1 "); } else { unsetmdsig |= TIOCM_DTR; snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "0 "); } } if (verbose) logit(logtext); memset(logtext, 0, BUFFER_SIZE); ioctl(mdfd, TIOCMBIS, &setmdsig); ioctl(mdfd, TIOCMBIC, &unsetmdsig); oldbtsig = btsig; } if (mdsig != oldmdsig) { snprintf(logtext, BUFFER_SIZE, "Line change on modemside: "); setbtsig = 0; unsetbtsig = 0; /* Check if DSR has changed: */ if ((mdsig & TIOCM_DSR) != (oldmdsig & TIOCM_DSR)) { snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "DSR -> "); if ((mdsig & TIOCM_DSR) == TIOCM_DSR) { setbtsig |= TIOCM_DTR; snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "1 "); } else { unsetbtsig |= TIOCM_DTR; snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "0 "); } } /* Check if RI has changed: */ if ((mdsig & TIOCM_RI) != (oldmdsig & TIOCM_RI)) { snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "RI -> "); if ((mdsig & TIOCM_RI) == TIOCM_RI) { setbtsig |= TIOCM_RI; snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "1 "); } else { unsetbtsig |= TIOCM_RI; snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "0 "); } } /* Check if CAR has changed: */ if ((mdsig & TIOCM_CAR) != (oldmdsig & TIOCM_CAR)) { snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "CAR -> "); if ((mdsig & TIOCM_CAR) == TIOCM_CAR) { setbtsig |= TIOCM_CAR; snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "1 "); } else { unsetbtsig |= TIOCM_CAR; snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "0 "); } } if (verbose) logit(logtext); memset(logtext, 0, BUFFER_SIZE); ioctl(btfd, TIOCMBIS, &setbtsig); ioctl(btfd, TIOCMBIC, &unsetbtsig); oldmdsig = mdsig; } /* Handle the data on the serial devices: */ FD_ZERO(&readfds); FD_ZERO(&writefds); /* Check only for data if we can read something: */ if (btdata < BUFFER_SIZE) FD_SET(btfd, &readfds); if (mddata < BUFFER_SIZE) FD_SET(mdfd, &readfds); /* Check if we can write data - as long as we have some: */ if (mddata > 0) FD_SET(btfd, &writefds); if (btdata > 0) FD_SET(mdfd, &writefds); /* Now check the file handles: */ tv.tv_sec = 0; tv.tv_usec = 10000; select(maxhandle+1, &readfds, &writefds, NULL, &tv); /* First write data, if possible: */ /* to the modem: */ if (FD_ISSET(mdfd, &writefds)) { /* Try to write, ignore error: */ if ((mdtxsize = write(mdfd, btbuf, btdata)) == -1) { /* NO ERRORHANDLING! */ } else { /* If verbosity is high enough, show the data: */ if (verbose > 1) { snprintf(logtext, BUFFER_SIZE, "Data written to modem"); logit(logtext); memset(logtext, 0, BUFFER_SIZE); memcpy(logtext, btbuf, btdata); logit(logtext); memset(logtext, 0, BUFFER_SIZE); } /* If asked for, print an hexdump of the data: */ print_hexdump(btbuf, btdata, hexdumplinewidth, 1); /* If only partial written, copy the rest to the beginning: */ if (mdtxsize != btdata) { memmove(btbuf, btbuf + mdtxsize, btdata - mdtxsize); } /* Decrease the byte count for the buffer: */ btdata -= mdtxsize; mdtxcount += mdtxsize; } } /* to the bluetooth device: */ if (FD_ISSET(btfd, &writefds)) { /* Try to write, ignore error: */ if ((bttxsize = write(btfd, mdbuf, mddata)) == -1) { /* NO ERRORHANDLING! */ } else { /* If verbosity is high enough, show the data: */ if (verbose > 1) { snprintf(logtext, BUFFER_SIZE, "Data written to bluetooth"); logit(logtext); memset(logtext, 0, BUFFER_SIZE); memcpy(logtext, mdbuf, mddata); logit(logtext); memset(logtext, 0, BUFFER_SIZE); } /* If asked for, print an hexdump of the data: */ print_hexdump(mdbuf, mddata, hexdumplinewidth, 0); /* If only partial written, copy the rest to the beginning: */ if (bttxsize != mddata) { memmove(mdbuf, mdbuf + bttxsize, mddata - bttxsize); } /* Decrease the byte count for the buffer: */ mddata -= bttxsize; bttxcount += bttxsize; } } /* Now read the data - if there is data and there is space in the buffers: */ /* from the modem: */ if (FD_ISSET(mdfd, &readfds)) { /* Try to read the data, ignore error: */ if ((mdrxsize = read(mdfd, mdbuf + mddata, BUFFER_SIZE - mddata)) == -1) { /* NO ERRORHANDLING! */ } else { if (verbose > 1) { snprintf(logtext, BUFFER_SIZE, "Data read from modem"); logit(logtext); memset(logtext, 0, BUFFER_SIZE); } mddata += mdrxsize; mdrxcount += mdrxsize; } } /* from the bluetooth device: */ if (FD_ISSET(btfd, &readfds)) { /* Try to read the data, ignore error: */ if ((btrxsize = read(btfd, btbuf + btdata, BUFFER_SIZE - btdata)) == -1) { /* NO ERRORHANDLING! */ } else { if (verbose > 1) { snprintf(logtext, BUFFER_SIZE, "Data read from bluetooth"); logit(logtext); memset(logtext, 0, BUFFER_SIZE); } else if (btrxsize == 0) { /* Check for null packets to close the socket: */ endprog = 1; } btdata += btrxsize; btrxcount += btrxsize; } } } logit("Connection closed"); snprintf(logtext, BUFFER_SIZE, "Modem stats: %ld bytes received, %ld bytes sent", mdrxcount, mdtxcount); logit(logtext); memset(logtext, 0, BUFFER_SIZE); snprintf(logtext, BUFFER_SIZE, "Bluetooth stats: %ld bytes received, %ld bytes sent", btrxcount, bttxcount); logit(logtext); memset(logtext, 0, BUFFER_SIZE); free_ressources(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -