/* this functions opens and configure the serial port */ void cfgport(void) { if ((portfd = open(cfg.port, O_RDWR)) == -1) { printFatal("Unable to open serial port"); } /* these functions, declared on sysdep1.c * configure the serial port * these functions are from minicom source */ m_savestate(portfd); m_setparms(portfd, cfg.baudrate, cfg.parity, cfg.databits, 1, 0); m_nohang(portfd); m_hupcl(portfd, 1); m_flush(portfd); }
/* * Open the terminal. * * \return -1 on error, 0 on success */ int open_term(int doinit, int show_win_on_error, int no_msgs) { struct stat stt; union { char bytes[128]; int kermit; } buf; int fd, n = 0; int pid; #ifdef HAVE_ERRNO_H int s_errno; #endif #ifdef USE_SOCKET #define SOCKET_PREFIX "unix#" portfd_is_socket = portfd_is_connected = 0; if (strncmp(dial_tty, SOCKET_PREFIX, strlen(SOCKET_PREFIX)) == 0) { portfd_is_socket = 1; } #endif if (portfd_is_socket) goto nolock; #if !HAVE_LOCKDEV /* First see if the lock file directory is present. */ if (P_LOCK[0] && stat(P_LOCK, &stt) == 0) { #ifdef SVR4_LOCKS stat(dial_tty, &stt); sprintf(lockfile, "%s/LK.%03d.%03d.%03d", P_LOCK, major(stt.st_dev), major(stt.st_rdev), minor(stt.st_rdev)); #else /* SVR4_LOCKS */ snprintf(lockfile, sizeof(lockfile), "%s/LCK..%s", P_LOCK, mdevlockname(dial_tty, buf.bytes, sizeof(buf.bytes))); #endif /* SVR4_LOCKS */ } else lockfile[0] = 0; if (doinit > 0 && lockfile[0] && (fd = open(lockfile, O_RDONLY)) >= 0) { n = read(fd, buf.bytes, 127); close(fd); if (n > 0) { pid = -1; if (n == 4) /* Kermit-style lockfile. */ pid = buf.kermit; else { /* Ascii lockfile. */ buf.bytes[n] = 0; sscanf(buf.bytes, "%d", &pid); } if (pid > 0 && kill((pid_t)pid, 0) < 0 && errno == ESRCH) { fprintf(stderr, _("Lockfile is stale. Overriding it..\n")); sleep(1); unlink(lockfile); } else n = 0; } if (n == 0) { if (stdwin) mc_wclose(stdwin, 1); fprintf(stderr, _("Device %s is locked.\n"), dial_tty); return -1; } } #endif if (doinit > 0 && lockfile_create(no_msgs) != 0) return -1; nolock: /* Run a special program to disable callin if needed. */ if (doinit > 0 && P_CALLOUT[0]) { if (fastsystem(P_CALLOUT, NULL, NULL, NULL) < 0) { if (stdwin) mc_wclose(stdwin, 1); fprintf(stderr, _("Could not setup for dial out.\n")); lockfile_remove(); return -1; } } /* Now open the tty device. */ if (setjmp(albuf) == 0) { portfd = -1; signal(SIGALRM, get_alrm); alarm(20); #ifdef USE_SOCKET if (portfd_is_socket) { portfd_sock_addr.sun_family = AF_UNIX; strncpy(portfd_sock_addr.sun_path, dial_tty + strlen(SOCKET_PREFIX), sizeof(portfd_sock_addr.sun_path)-1); portfd_sock_addr.sun_path[sizeof(portfd_sock_addr.sun_path)-1] = 0; term_socket_connect(); } #endif /* USE_SOCKET */ if (!portfd_is_socket) { #if defined(O_NDELAY) && defined(F_SETFL) portfd = open(dial_tty, O_RDWR|O_NDELAY|O_NOCTTY); if (portfd >= 0) { /* Cancel the O_NDELAY flag. */ n = fcntl(portfd, F_GETFL, 0); fcntl(portfd, F_SETFL, n & ~O_NDELAY); } #else if (portfd < 0) portfd = open(dial_tty, O_RDWR|O_NOCTTY); #endif } if (portfd >= 0) { if (doinit > 0) m_savestate(portfd); port_init(); } } #ifdef HAVE_ERRNO_H s_errno = errno; #endif alarm(0); signal(SIGALRM, SIG_IGN); if (portfd < 0 && !portfd_is_socket) { if (!no_msgs) { if (doinit > 0) { if (stdwin) mc_wclose(stdwin, 1); #ifdef HAVE_ERRNO_H fprintf(stderr, _("minicom: cannot open %s: %s\n"), dial_tty, strerror(s_errno)); #else fprintf(stderr, _("minicom: cannot open %s. Sorry.\n"), dial_tty); #endif lockfile_remove(); return -1; } if (show_win_on_error) werror(_("Cannot open %s!"), dial_tty); } lockfile_remove(); return -1; } /* Set CLOCAL mode */ m_nohang(portfd); /* Set Hangup on Close if program crashes. (Hehe) */ m_hupcl(portfd, 1); if (doinit > 0) m_flush(portfd); return 0; }