int bmc_send_command(char *cmd) { int i, ret = 0; for (i = 1; i <= TTY_RETRY; i++) { if (tty_open() != 0) { printf("ERROR: Cannot open TTY device\n"); continue; } if (tty_login() != 0) { //printf("ERROR: Cannot login TTY device\n"); tty_close(); continue; } snprintf(tty_buf, MAXIMUM_TTY_BUFFER_LENGTH, "%s", cmd); ret = tty_exec_buf(TTY_I2C_TIMEOUT * i, TTY_PROMPT); tty_close(); if (ret != 0) { printf("ERROR: bmc_send_command timed out\n"); continue; } return 0; } AIM_LOG_ERROR("Unable to send command to bmc(%s)\r\n", cmd); return -1; }
/* Initialize tty_fd. Used for saving/resetting tty modes upon * foreground job completion and for setting up tty process group. */ void tty_init(int init_ttystate) { int do_close = 1; int tfd; tty_close(); tty_devtty = 1; tfd = open("/dev/tty", O_RDWR, 0); if (tfd < 0) { tty_devtty = 0; warningf(false, "No controlling tty (open /dev/tty: %s)", strerror(errno)); do_close = 0; if (isatty(0)) tfd = 0; else if (isatty(2)) tfd = 2; else { warningf(false, "Can't find tty file descriptor"); return; } } if ((tty_fd = fcntl(tfd, F_DUPFD_CLOEXEC, FDBASE)) < 0) { warningf(false, "j_ttyinit: dup of tty fd failed: %s", strerror(errno)); } else if (init_ttystate) tcgetattr(tty_fd, &tty_state); if (do_close) close(tfd); }
int tty_send(tty_interface_t *ti, char *buffer, int length) { int i; int byteswritten; char c; if (!TTY_IS_CONNECTED(ti)) return -1; byteswritten = 0; for (i = 0; i < length; i++) { byteswritten += write(ti->fd, &buffer[i], 1); usleep(300); if (buffer[i] == '\n') { c = '\r'; byteswritten += write(ti->fd, &c, 1); usleep(300); } } if (byteswritten < length) { // Send error tty_close(ti); return -1; } return byteswritten; }
int tty_open(struct tty *tty, const char *overrides, char **cause) { char out[64]; int fd; if (debug_level > 3) { xsnprintf(out, sizeof out, "tmux-out-%ld.log", (long) getpid()); fd = open(out, O_WRONLY|O_CREAT|O_TRUNC, 0644); if (fd != -1 && fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) fatal("fcntl failed"); tty->log_fd = fd; } tty->term = tty_term_find(tty->termname, tty->fd, overrides, cause); if (tty->term == NULL) { tty_close(tty); return (-1); } tty->flags |= TTY_OPENED; tty->flags &= ~(TTY_NOCURSOR|TTY_FREEZE|TTY_ESCAPE); tty->event = bufferevent_new( tty->fd, tty_read_callback, NULL, tty_error_callback, tty); tty_start_tty(tty); tty_keys_init(tty); return (0); }
int mdm_dial(char *phone,char *port) { int rc; char s[MAX_STRING],conn[MAX_STRING]; if((rc=tty_openport(port))) { write_log("can't open port: %s",tty_errs[rc]); return MC_BAD; } reset(); xstrcpy(s,cfgs(CFG_DIALPREFIX),MAX_STRING); xstrcat(s,phone,MAX_STRING); xstrcat(s,cfgs(CFG_DIALSUFFIX),MAX_STRING); tty_local(1); sline("Dialing %s",s);vidle(); rc=modem_chat(s,cfgsl(CFG_MODEMCONNECT),cfgsl(CFG_MODEMNODIAL),cfgsl(CFG_MODEMERROR), cfgsl(CFG_MODEMBUSY),cfgs(CFG_MODEMRINGING),cfgi(CFG_MAXRINGS), cfgi(CFG_WAITCARRIER),conn,MAX_STRING); sline("Modem said: %s",conn); xfree(connstr);connstr=xstrdup(conn); if(rc!=MC_OK) { write_log("got %s",conn); if(rc==MC_FAIL)hangup(); tty_close(); if(rc==MC_RING) { sline("RING found.."); sleep(2); execsh("killall -USR1 mgetty vgetty >/dev/null 2>&1"); } else sline("Call failed (%s)",mcs[rc]); return rc; } write_log("*** %s",conn); tty_local(0); return rc; }
void mdm_done() { tty_local(1); hangup(); stat_collect(); tty_close(); }
/* Catch any signals. */ static void sig_catch(int sig) { /* (void) signal(sig, sig_catch); */ tty_close(); exit(0); }
static void wadsp_close(void) { XRES(1); Z(); SCLK(0); tty_close(); }
void tty_free(struct tty *tty, int no_stop) { tty_close(tty, no_stop); if (tty->path != NULL) xfree(tty->path); if (tty->termname != NULL) xfree(tty->termname); }
void tty_free(struct tty *tty) { tty_close(tty); if (tty->path != NULL) xfree(tty->path); if (tty->termname != NULL) xfree(tty->termname); }
int trstty_close(uint8_t minor) { if (ttydata[minor].users == 0) { trs_flow &= ~(1 << minor); if (minor == 2) tr1865_ctrl = 0; /* Drop carrier and rts */ else if (minor == 3) vg_tr1865_ctrd = 0; } return tty_close(minor); }
int nc100_tty_close(uint8_t minor) { tty_close(minor); if (minor == 2) { #ifdef CONFIG_NC200 irqen = 0x18; #else irqen = 0x08; /* mask serial interrupts */ #endif mod_control(0x10, 0); /* turn off the line driver */ } return (0); }
static status_t master_open(const char *name, uint32 flags, void **_cookie) { bool findUnusedTTY = strcmp(name, "ptmx") == 0; int32 index = -1; if (!findUnusedTTY) { index = get_tty_index(name); if (index >= (int32)kNumTTYs) return B_ERROR; } TRACE(("master_open: TTY index = %ld (name = %s)\n", index, name)); MutexLocker globalLocker(gGlobalTTYLock); if (findUnusedTTY) { for (index = 0; index < (int32)kNumTTYs; index++) { if (gMasterTTYs[index].ref_count == 0) break; } if (index >= (int32)kNumTTYs) return ENOENT; } else if (gMasterTTYs[index].ref_count > 0) { // we're already open! return B_BUSY; } status_t status = tty_open(&gMasterTTYs[index], &master_service); if (status < B_OK) { // initializing TTY failed return status; } master_cookie *cookie; status = create_master_cookie(cookie, &gMasterTTYs[index], &gSlaveTTYs[index], flags); if (status != B_OK) { tty_close(&gMasterTTYs[index]); return status; } add_tty_cookie(cookie); *_cookie = cookie; return B_OK; }
RETSIGTYPE sigerr(int sig) { signal(sig,SIG_DFL); aso_done(); write_log("got SIG%s signal",sigs[sig]); if(cfgs(CFG_PIDFILE))if(getpid()==islocked(ccs))lunlink(ccs); IFPerl(perl_done(1)); log_done(); tty_close(); qqreset();sline("");title(""); cls_close(ssock); cls_shutd(lins_sock); cls_shutd(uis_sock); switch(sig) { case SIGSEGV: case SIGFPE: case SIGBUS: case SIGABRT: abort(); default: exit(1); } }
int exchild(struct op *t, int flags, int close_fd) /* used if XPCLOSE or XCCLOSE */ { static Proc *last_proc; /* for pipelines */ int i; sigset_t omask; Proc *p; Job *j; int rv = 0; int forksleep; int ischild; if (flags & XEXEC) /* Clear XFORK|XPCLOSE|XCCLOSE|XCOPROC|XPIPEO|XPIPEI|XXCOM|XBGND * (also done in another execute() below) */ return execute(t, flags & (XEXEC | XERROK)); p = new_proc(); p->next = (Proc *) 0; p->state = PRUNNING; p->status = 0; p->pid = 0; /* link process into jobs list */ if (flags&XPIPEI) { /* continuing with a pipe */ if (!last_job) internal_errorf(1, "exchild: XPIPEI and no last_job - pid %d", (int) procpid); j = last_job; last_proc->next = p; last_proc = p; } else { j = new_job(); /* fills in j->job */ /* we don't consider XXCOM's foreground since they don't get * tty process group and we don't save or restore tty modes. */ j->flags = (flags & XXCOM) ? JF_XXCOM : ((flags & XBGND) ? 0 : (JF_FG|JF_USETTYMODE)); j->usrtime = j->systime = 0; j->state = PRUNNING; j->pgrp = 0; j->ppid = procpid; j->age = ++njobs; j->proc_list = p; j->coproc_id = 0; last_job = j; last_proc = p; put_job(j, PJ_PAST_STOPPED); } snptreef(p->command, sizeof(p->command), "%T", t); /* create child process */ forksleep = 1; while ((i = fork()) < 0 && errno == EAGAIN && forksleep < 32) { if (intrsig) /* allow user to ^C out... */ break; sleep(forksleep); forksleep <<= 1; } if (i < 0) { kill_job(j, SIGKILL); remove_job(j, "fork failed"); sigprocmask(SIG_SETMASK, &omask, (sigset_t *) 0); errorf("cannot fork - try again"); } ischild = i == 0; if (ischild) p->pid = procpid = getpid(); else p->pid = i; /* used to close pipe input fd */ if (close_fd >= 0 && (((flags & XPCLOSE) && !ischild) || ((flags & XCCLOSE) && ischild))) close(close_fd); if (ischild) { /* child */ /* Do this before restoring signal */ if (flags & XCOPROC) coproc_cleanup(false); sigprocmask(SIG_SETMASK, &omask, (sigset_t *) 0); cleanup_parents_env(); if ((flags & XBGND)) { setsig(&sigtraps[SIGINT], SIG_IGN, SS_RESTORE_IGN|SS_FORCE); setsig(&sigtraps[SIGQUIT], SIG_IGN, SS_RESTORE_IGN|SS_FORCE); if (!(flags & (XPIPEI | XCOPROC))) { int fd = open("/dev/null", 0); if (fd != 0) { (void) ksh_dup2(fd, 0, true); close(fd); } } } remove_job(j, "child"); /* in case of `jobs` command */ nzombie = 0; Flag(FTALKING) = 0; tty_close(); cleartraps(); execute(t, (flags & XERROK) | XEXEC); /* no return */ internal_errorf(0, "exchild: execute() returned"); unwind(LLEAVE); /* NOTREACHED */ } /* shell (parent) stuff */ /* Ensure next child gets a (slightly) different $RANDOM sequence */ change_random(); if (!(flags & XPIPEO)) { /* last process in a job */ j_startjob(j); if (flags & XCOPROC) { j->coproc_id = coproc.id; coproc.njobs++; /* n jobs using co-process output */ coproc.job = (void *) j; /* j using co-process input */ } if (flags & XBGND) { j_set_async(j); if (Flag(FTALKING)) { shf_fprintf(shl_out, "[%d]", j->job); for (p = j->proc_list; p; p = p->next) shf_fprintf(shl_out, " %d", p->pid); shf_putchar('\n', shl_out); shf_flush(shl_out); } } else rv = j_waitj(j, JW_NONE, "jw:last proc"); } sigprocmask(SIG_SETMASK, &omask, (sigset_t *) 0); return rv; }
int main(int argc, char *argv[]) { char path_buf[128] = ""; char *path_dev; char buff[128]; const char *speed = NULL; const char *proto = DEF_PROTO; const char *extcmd = NULL; int s; static struct option longopts[] = { { "version", 0, NULL, 'V' }, { NULL, 0, NULL, 0 } }; path_dev = path_buf; /* Scan command line for any arguments. */ opterr = 0; while ((s = getopt_long(argc, argv, "c:ehlLmnp:qs:vdVk:o:", longopts, NULL)) != EOF) switch(s) { case 'c': extcmd = optarg; break; case 'e': opt_e = 1 - opt_e; break; case 'h': opt_h = 1 - opt_h; break; #ifdef SIOCSKEEPALIVE case 'k': opt_k = atoi(optarg); break; #endif case 'L': opt_L = 1 - opt_L; break; case 'l': opt_l = 1 - opt_l; break; case 'm': opt_m = 1 - opt_m; break; case 'n': opt_n = 1 - opt_n; break; #ifdef SIOCSOUTFILL case 'o': opt_o = atoi(optarg); break; #endif case 'p': proto = optarg; break; case 'q': opt_q = 1 - opt_q; break; case 's': speed = optarg; break; case 'd': opt_d = 1 - opt_d; break; case 'v': opt_v = 1 - opt_v; break; case 'V': version(); /*NOTREACHED*/ default: usage(); /*NOTREACHED*/ } if (setvbuf(stdout,0,_IOLBF,0)) { if (opt_q == 0) fprintf(stderr, _("slattach: setvbuf(stdout,0,_IOLBF,0) : %s\n"), strerror(errno)); exit(1); } activate_init(); if (!strcmp(proto, "tty")) opt_m++; /* Is a terminal given? */ if (optind != (argc - 1)) usage(); safe_strncpy(path_buf, argv[optind], sizeof(path_buf)); if (!strcmp(path_buf, "-")) { opt_e = 1; path_dev = NULL; if (tty_open(NULL, speed) < 0) { return(3); } } else { path_dev = path_buf; if (tty_open(path_dev, speed) < 0) { return(3); } } /* Start the correct protocol. */ if (!strcmp(proto, "tty")) { tty_sdisc = N_TTY; tty_close(); return(0); } if (activate_ld(proto, tty_fd)) return(1); if ((opt_v == 1) || (opt_d == 1)) { if (tty_get_name(buff)) { return(3); } printf(_("%s started"), proto); if (path_dev != NULL) printf(_(" on %s"), path_dev); if (path_pts != NULL) printf(_(" ptsname %s"), path_pts); printf(_(" interface %s\n"), buff); } /* Configure keepalive and outfill. */ #ifdef SIOCSKEEPALIVE if (opt_k && (ioctl(tty_fd, SIOCSKEEPALIVE, &opt_k) < 0)) fprintf(stderr, "slattach: ioctl(SIOCSKEEPALIVE): %s\n", strerror(errno)); #endif #ifdef SIOCSOUTFILL if (opt_o && (ioctl(tty_fd, SIOCSOUTFILL, &opt_o) < 0)) fprintf(stderr, "slattach: ioctl(SIOCSOUTFILL): %s\n", strerror(errno)); #endif (void) signal(SIGHUP, sig_catch); (void) signal(SIGINT, sig_catch); (void) signal(SIGQUIT, sig_catch); (void) signal(SIGTERM, sig_catch); /* Wait until we get killed if hanging on a terminal. */ if (opt_e == 0) { while(1) { if(opt_h == 1) { /* hangup on carrier loss */ int n = 0; ioctl(tty_fd, TIOCMGET, &n); if(!(n & TIOCM_CAR)) break; sleep(15); } else sleep(60); }; tty_close(); if(extcmd) /* external command on exit */ exit(system(extcmd)); } exit(0); }
/* execute tree in child subprocess */ int exchild(struct op *t, int flags, volatile int *xerrok, int close_fd) /* used if XPCLOSE or XCCLOSE */ { static Proc *last_proc; /* for pipelines */ int i; sigset_t omask; Proc *p; Job *j; int rv = 0; int forksleep; int ischild; if (flags & XEXEC) /* Clear XFORK|XPCLOSE|XCCLOSE|XCOPROC|XPIPEO|XPIPEI|XXCOM|XBGND * (also done in another execute() below) */ return execute(t, flags & (XEXEC | XERROK), xerrok); /* no SIGCHLD's while messing with job and process lists */ sigprocmask(SIG_BLOCK, &sm_sigchld, &omask); p = new_proc(); p->next = (Proc *) 0; p->state = PRUNNING; p->status = 0; p->pid = 0; /* link process into jobs list */ if (flags&XPIPEI) { /* continuing with a pipe */ if (!last_job) internal_errorf(1, "exchild: XPIPEI and no last_job - pid %d", (int) procpid); j = last_job; last_proc->next = p; last_proc = p; } else { j = new_job(); /* fills in j->job */ /* we don't consider XXCOM's foreground since they don't get * tty process group and we don't save or restore tty modes. */ j->flags = (flags & XXCOM) ? JF_XXCOM : ((flags & XBGND) ? 0 : (JF_FG|JF_USETTYMODE)); timerclear(&j->usrtime); timerclear(&j->systime); j->state = PRUNNING; j->pgrp = 0; j->ppid = procpid; j->age = ++njobs; j->proc_list = p; j->coproc_id = 0; last_job = j; last_proc = p; put_job(j, PJ_PAST_STOPPED); } snptreef(p->command, sizeof(p->command), "%T", t); /* create child process */ forksleep = 1; while ((i = fork()) < 0 && errno == EAGAIN && forksleep < 32) { if (intrsig) /* allow user to ^C out... */ break; sleep(forksleep); forksleep <<= 1; } if (i < 0) { kill_job(j, SIGKILL); remove_job(j, "fork failed"); sigprocmask(SIG_SETMASK, &omask, (sigset_t *) 0); errorf("cannot fork - try again"); } ischild = i == 0; if (ischild) p->pid = procpid = getpid(); else p->pid = i; #ifdef JOBS /* job control set up */ if (Flag(FMONITOR) && !(flags&XXCOM)) { int dotty = 0; if (j->pgrp == 0) { /* First process */ j->pgrp = p->pid; dotty = 1; } /* set pgrp in both parent and child to deal with race * condition */ setpgid(p->pid, j->pgrp); /* YYY: should this be if (ttypgrp_ok && ischild && !(flags&XBGND)) tcsetpgrp(tty_fd, j->pgrp); instead? (see also YYY below) */ if (ttypgrp_ok && dotty && !(flags & XBGND)) tcsetpgrp(tty_fd, j->pgrp); } #endif /* JOBS */ /* used to close pipe input fd */ if (close_fd >= 0 && (((flags & XPCLOSE) && !ischild) || ((flags & XCCLOSE) && ischild))) close(close_fd); if (ischild) { /* child */ /* Do this before restoring signal */ if (flags & XCOPROC) coproc_cleanup(false); sigprocmask(SIG_SETMASK, &omask, (sigset_t *) 0); cleanup_parents_env(); #ifdef JOBS /* If FMONITOR or FTALKING is set, these signals are ignored, * if neither FMONITOR nor FTALKING are set, the signals have * their inherited values. */ if (Flag(FMONITOR) && !(flags & XXCOM)) { for (i = NELEM(tt_sigs); --i >= 0; ) setsig(&sigtraps[tt_sigs[i]], SIG_DFL, SS_RESTORE_DFL|SS_FORCE); } #endif /* JOBS */ if (Flag(FBGNICE) && (flags & XBGND)) nice(4); if ((flags & XBGND) && !Flag(FMONITOR)) { setsig(&sigtraps[SIGINT], SIG_IGN, SS_RESTORE_IGN|SS_FORCE); setsig(&sigtraps[SIGQUIT], SIG_IGN, SS_RESTORE_IGN|SS_FORCE); if (!(flags & (XPIPEI | XCOPROC))) { int fd = open("/dev/null", 0); if (fd != 0) { (void) ksh_dup2(fd, 0, true); close(fd); } } } remove_job(j, "child"); /* in case of `jobs` command */ nzombie = 0; #ifdef JOBS ttypgrp_ok = 0; Flag(FMONITOR) = 0; #endif /* JOBS */ Flag(FTALKING) = 0; tty_close(); cleartraps(); execute(t, (flags & XERROK) | XEXEC, NULL); /* no return */ internal_errorf(0, "exchild: execute() returned"); unwind(LLEAVE); /* NOTREACHED */ } /* shell (parent) stuff */ /* Ensure next child gets a (slightly) different $RANDOM sequence */ change_random(); if (!(flags & XPIPEO)) { /* last process in a job */ #ifdef JOBS /* YYY: Is this needed? (see also YYY above) if (Flag(FMONITOR) && !(flags&(XXCOM|XBGND))) tcsetpgrp(tty_fd, j->pgrp); */ #endif /* JOBS */ j_startjob(j); if (flags & XCOPROC) { j->coproc_id = coproc.id; coproc.njobs++; /* n jobs using co-process output */ coproc.job = (void *) j; /* j using co-process input */ } if (flags & XBGND) { j_set_async(j); if (Flag(FTALKING)) { shf_fprintf(shl_out, "[%d]", j->job); for (p = j->proc_list; p; p = p->next) shf_fprintf(shl_out, " %d", p->pid); shf_putchar('\n', shl_out); shf_flush(shl_out); } } else rv = j_waitj(j, JW_NONE, "jw:last proc"); } sigprocmask(SIG_SETMASK, &omask, (sigset_t *) 0); return rv; }
/* turn job control on or off according to Flag(FMONITOR) */ void j_change(void) { int i; if (Flag(FMONITOR)) { int use_tty; if (Flag(FTALKING)) { /* Don't call tcgetattr() 'til we own the tty process group */ use_tty = 1; tty_init(false); } else use_tty = 0; /* no controlling tty, no SIGT* */ ttypgrp_ok = use_tty && tty_fd >= 0 && tty_devtty; if (ttypgrp_ok && (our_pgrp = getpgrp()) < 0) { warningf(false, "j_init: getpgrp() failed: %s", strerror(errno)); ttypgrp_ok = 0; } if (ttypgrp_ok) { setsig(&sigtraps[SIGTTIN], SIG_DFL, SS_RESTORE_ORIG|SS_FORCE); /* wait to be given tty (POSIX.1, B.2, job control) */ while (1) { pid_t ttypgrp; if ((ttypgrp = tcgetpgrp(tty_fd)) < 0) { warningf(false, "j_init: tcgetpgrp() failed: %s", strerror(errno)); ttypgrp_ok = 0; break; } if (ttypgrp == our_pgrp) break; kill(0, SIGTTIN); } } for (i = NELEM(tt_sigs); --i >= 0; ) setsig(&sigtraps[tt_sigs[i]], SIG_IGN, SS_RESTORE_DFL|SS_FORCE); if (ttypgrp_ok && our_pgrp != kshpid) { if (setpgid(0, kshpid) < 0) { warningf(false, "j_init: setpgid() failed: %s", strerror(errno)); ttypgrp_ok = 0; } else { if (tcsetpgrp(tty_fd, kshpid) < 0) { warningf(false, "j_init: tcsetpgrp() failed: %s", strerror(errno)); ttypgrp_ok = 0; } else restore_ttypgrp = our_pgrp; our_pgrp = kshpid; } } if (use_tty) { if (!ttypgrp_ok) warningf(false, "warning: won't have full job control"); } if (tty_fd >= 0) tcgetattr(tty_fd, &tty_state); } else { ttypgrp_ok = 0; if (Flag(FTALKING)) for (i = NELEM(tt_sigs); --i >= 0; ) setsig(&sigtraps[tt_sigs[i]], SIG_IGN, SS_RESTORE_IGN|SS_FORCE); else for (i = NELEM(tt_sigs); --i >= 0; ) { if (sigtraps[tt_sigs[i]].flags & (TF_ORIG_IGN | TF_ORIG_DFL)) setsig(&sigtraps[tt_sigs[i]], (sigtraps[tt_sigs[i]].flags & TF_ORIG_IGN) ? SIG_IGN : SIG_DFL, SS_RESTORE_ORIG|SS_FORCE); } if (!Flag(FTALKING)) tty_close(); } }
int pty_close(uint8_t minor) { return tty_close(minor + PTY_OFFSET); }
void handle_loopback (struct deviceinfo *unit, struct digi_node *node, struct digi_chan *chan, int port) { char full_line[81]; int i = 0, option = EOF; struct termios sv_tios; char test_data[TBUFSIZ + 1]; char read_data[TBUFSIZ + 1]; char string[200], ttyname[200]; int r = 3; int rwfd; WINDOW *lbwin = GetWin(LBWin); #define TITLE_LINE 1 #define DESC_LINE 2 #define DESC2_LINE 3 #define SEP_LINE 4 #define FIRST_DATA 5 #define SEP2_LINE 15 #define RESULT_LINE 16 show_panel (GetPan(LBWin)); update_panels (); doupdate (); next_result = 0; test_cases = 0; test_passes = 0; if (DPAGetPortName(unit, node, chan, port, ttyname) == NULL) { ttyname[0] ='\0'; } while (option == EOF) { erase_win (LBWin); wattrset (lbwin, make_attr (A_BOLD, WHITE, BLUE)); mvwprintw (lbwin, TITLE_LINE, 1, "%-*.*s", 76, 76, " "); mvwprintw (lbwin, RESULT_LINE, 1, "%-*.*s", 76, 76, " "); mvwprintw (lbwin, TITLE_LINE, 32, " Loop Back Test "); sprintf (full_line, "Tests Executed: %-12d Passed: %-12d Failed: %d", test_cases, test_passes, test_cases - test_passes); mvwprintw (lbwin, RESULT_LINE, center(LBWin, strlen(full_line)), full_line); sprintf (clbuf, "Unit IP Address: %s Port #: %d Name: %s", unit->host, port + 1, ttyname); i = strlen (clbuf); mvwprintw (GetWin(LBWin), DESC_LINE, 1, "%*s", GetWidth(LBWin) - 2, " "); mvwprintw (GetWin(LBWin), DESC2_LINE, 1, "%*s", GetWidth(LBWin) - 2, " "); mvwprintw (lbwin, DESC2_LINE, 2, clbuf); mvwprintw (lbwin, DESC_LINE, 2, "Device Description: %-*.*s", GetWidth(LBWin) - 2 - 2 - 2 - 20, GetWidth(LBWin) - 2 - 2 - 2 - 20, node->nd_ps_desc); if (!vanilla) wattrset (lbwin, make_attr (A_ALTCHARSET, CYAN, BLACK)); else wattrset (lbwin, make_attr (A_NORMAL, CYAN, BLACK)); wmove (lbwin, SEP_LINE, 1); for (i = 0; i < 77; i++) waddch (lbwin, mapchar(ACS_HLINE)); mvwaddch (lbwin, SEP_LINE, 0, mapchar(ACS_LTEE)); mvwaddch (lbwin, SEP_LINE, 77, mapchar(ACS_RTEE)); wmove (lbwin, SEP2_LINE, 1); for (i = 0; i < 77; i++) waddch (lbwin, mapchar(ACS_HLINE)); mvwaddch (lbwin, SEP2_LINE, 0, mapchar(ACS_LTEE)); mvwaddch (lbwin, SEP2_LINE, 77, mapchar(ACS_RTEE)); wattrset (lbwin, make_attr (A_NORMAL, WHITE, BLACK)); wrefresh (lbwin); wattrset (GetWin(MainWin), make_attr (A_NORMAL, WHITE, BLUE)); commandline (clbuf, "Press ANY key to Halt the test", NULL); mvwprintw (GetWin(MainWin), KEY_LINE, 0, clbuf); wattroff (GetWin(MainWin), make_attr (A_NORMAL, WHITE, BLUE)); wrefresh (GetWin(MainWin)); change_term (0, 10); option = EOF; r = 5; if (chan->ch_open) { mvwprintw (lbwin, r++, 2, "***** Port is Busy."); wrefresh(lbwin); test_cases++; sleep(1); goto user_input; } for (i = 0; i < 256; i++) { test_data[i] = (char) i; } test_data[TBUFSIZ]='\0'; /* Get port name. Can't run the test without it. */ if (DPAGetPortName(unit, node, chan, port, ttyname) == NULL) { mvwprintw (lbwin, r++, 2, "***** Loop Back Test Failure. Port has no known tty name"); test_cases++; wrefresh (lbwin); sleep(1); goto user_input; } sprintf(string, "/dev/%s", ttyname); if( (rwfd = tty_open(string, &sv_tios )) < 0 ) { test_cases++; goto user_input; } tcflush(rwfd, TCIOFLUSH); if ((i = test_send (test_data, TBUFSIZ, rwfd)) != 0) { mvwprintw (lbwin, r++, 2, "***** Loop Back Test Failure=%d, Sending %d Bytes", i, TBUFSIZ); wrefresh (lbwin); tty_close (rwfd, &sv_tios); test_cases++; goto user_input; } mvwprintw (lbwin, r++, 2, "Loop Back: %d Bytes Sent.", TBUFSIZ); wrefresh (lbwin); mvwprintw (lbwin, r++, 2, "Loop Back: Receiving %d Bytes.", TBUFSIZ); wrefresh (lbwin); if ((i = test_recv (read_data, TBUFSIZ, 5, rwfd)) != TBUFSIZ) { mvwprintw (lbwin, r++, 2, "***** Loop Back Failure=%d Receiving %d bytes.", i, TBUFSIZ); wrefresh (lbwin); tty_close (rwfd, &sv_tios); test_cases++; goto user_input; } /* Reset termios as before and close channel */ tty_close (rwfd, &sv_tios); mvwprintw (lbwin, r++, 2, "Loop Back: Verifying %d bytes.", TBUFSIZ); wrefresh (lbwin); if (memcmp (test_data, read_data, TBUFSIZ)) { mvwprintw (lbwin, r++, 2, "***** Loop Back Failure Verifying %d Bytes.", TBUFSIZ); mvwprintw (lbwin, r++, 2, "***** Data Incorrectly Transferred."); wrefresh (lbwin); test_cases++; goto user_input; } else { mvwprintw (lbwin, r++, 2, "Loop Back: Test Passed."); wrefresh (lbwin); test_cases++; test_passes++; } user_input: option = getch(); /* * If the user hasn't selected anything, loop. * Otherwise, break. */ switch (option) { case EOF: break; case '': refresh_screen (); option = EOF; break; #ifdef KEY_PRINT case KEY_PRINT: #endif case '': screen_save (LBWin, logfile); touchwin (lbwin); wrefresh (lbwin); update_panels (); doupdate (); option = EOF; break; default: break; } /* End Case */ } /* End While */ hide_panel (GetPan(LBWin)); update_panels (); doupdate (); return; }
int trstty_close(uint8_t minor) { if (minor == 3 && ttydata[3].users == 0) tr1865_ctrl = 0; /* Drop carrier */ return tty_close(minor); }
/* Catch any signals. */ static void sig_catch(int sig) { tty_close(); exit(0); }