📄 minicom.c
字号:
while(*bufp) { for(s = bufp; !isspace(*bufp) && *bufp; bufp++) ; args[argk++] = s; while(isspace(*bufp)) *bufp++ = 0; } } env_args = argk; /* Add command - line options */ for(c = 1; c < argc; c++) args[argk++] = argv[c]; args[argk] = CNULL; do { /* Process options with getopt */ while((c = getopt(argk, args, "hlsomc:a:t:")) != EOF) switch(c) { case 's': /* setup */ if (real_uid != 0) { fprintf(stderr, "minicom: -s switch needs root privilige\n"); exit(1); } dosetup = 1; break; case 'h': helpthem(); exit(1); break; case 'm': /* metakey */ alt_override++; break; case 'l': /* Literal ANSI chars */ literal++; break; case 't': /* Terminal type */ strcpy(termtype, optarg); break; case 'o': /* DON'T initialize */ doinit = 0; break; case 'c': /* Color on/off */ if (strcmp("on", optarg) == 0) { usecolor = 1; stdattr = A_BOLD; break; } if (strcmp("off", optarg) == 0) { usecolor = 0; stdattr = A_NORMAL; break; } usage(env_args, optind - 1, mc); break; case 'a': /* Attributes on/off */ if (strcmp("on", optarg) == 0) { useattr = 1; break; } if (strcmp("off", optarg) == 0) { useattr = 0; break; } usage(env_args, optind - 1, mc); break; default: usage(env_args, optind, mc); break; } /* Now, get portname if mentioned. Stop at end or '-'. */ while(optind < argk && args[optind][0] != '-') use_port = args[optind++]; /* Loop again if more options */ } while(optind < argk); if (real_uid == 0 && dosetup == 0) { fprintf(stderr, "%s%s%s", "minicom: WARNING: please don't run minicom as root when not maintaining\n", " it (with the -s switch) since all changes to the\n", " configuration will be GLOBAL !.\n"); sleep(5); } /* Avoid fraude ! */ for(s = use_port; *s; s++) if (*s == '/') *s = '_'; sprintf(parfile, "%s/minirc.%s", LIBDIR, use_port); /* Get password file information of this user. */ if ((pwd = getpwuid(real_uid)) == (struct passwd *)0) { fprintf(stderr, "You don't exist. Go away.\n"); exit(1); } /* Remember home directory and username. */ if ((s = getenv("HOME")) == CNULL) strcpy(homedir, pwd->pw_dir); else strcpy(homedir, s); strcpy(username, pwd->pw_name); /* Get personal parameter file */ sprintf(pparfile, "%s/.minirc.%s", homedir, use_port); /* Check this user in the USERFILE */ if (real_uid != 0) { sprintf(userfile, "%s/minicom.users", LIBDIR); if ((fp = fopen(userfile, "r")) != (FILE *)0) { while(fgets(buf, 70, fp) != CNULL && !userok) { /* Read first word */ bufp = buf; s = getword(&bufp); /* See if the "use_port" matches */ if (s && !strcmp(pwd->pw_name, s)) { if ((s = getword(&bufp)) == CNULL) userok = 1; else do { if (!strcmp(s, use_port)) { userok = 1; break; } } while((s = getword(&bufp)) != CNULL); } } fclose(fp); if (!userok) { fprintf(stderr, "Sorry %s. You are not allowed to use configuration %s.\n", pwd->pw_name, use_port); exit(1); } } } buf[0] = 0; read_parms(); stdwin = NIL_WIN; /* It better be! */ if (!dosetup && open_term(doinit) < 0) exit(1);#ifdef _SECURE /* After open /dev/tty..., we can run setgid uucp instead of setuid root. * We have to run setgid uucp to be able to create lockfiles, and * to execute the callin and callout programs. * To do this, minicom should be installed setuid root/setgid uucp. */ if (real_uid != 0 && geteuid() == 0 && getegid() != real_gid) setuid(real_uid);#endif mc_setenv("TERM", termtype); if (win_init(SFG, SBG, A_NORMAL) < 0) leave(""); if (COLS < 40 || LINES < 10) { leave("Sorry. Your screen is too small.\n"); } if (dosetup) { if (config(1)) { wclose(stdwin, 1); exit(0); } if (open_term(doinit) < 0) exit(1); } /* Signal handling */ for(c = 1; c <= _NSIG; c++) {#ifdef SIGCLD /* Better not mess with those */ if (c == SIGCLD) continue;#endif#ifdef SIGCHLD if (c == SIGCHLD) continue;#endif signal(c, hangsig); } signal(SIGHUP, SIG_IGN); signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGPIPE, SIG_IGN);#ifdef SIGTSTP signal(SIGTSTP, SIG_IGN); signal(SIGTTIN, SIG_IGN); signal(SIGTTOU, SIG_IGN);#endif#ifdef SIGTINT signal(SIGTINT, SIG_IGN);#endif#ifdef SIGWINCH signal(SIGWINCH, change_size);#endif#if DEBUG for(c = 1; c < _NSIG; c++) { if (c == SIGTERM) continue; /* Saviour when hung */ signal(c, signore); }#endif keyboard(KINSTALL, 0); if (strcmp(P_BACKSPACE, "BS") != 0) keyboard(KSETBS, P_BACKSPACE[0] == 'B' ? 8 : 127); if (alt_override) keyboard(KSETESC, 128); else if (strcmp(P_ESCAPE, "^A") != 0) keyboard(KSETESC, P_ESCAPE[0] == '^' ? P_ESCAPE[1] & 31 : 128); st = NIL_WIN; us = NIL_WIN; init_emul(VT100); if (doinit) modeminit(); wputs(us, "\nMinicom 1.5 Beta Copyright (c) 1993 Miquel van Smoorenburg\r\n"); wprintf(us, "\nPress %sZ for help on special keys\r\n\n", esc_key()); readdialdir(); /* The main loop calls do_terminal and gets a function key back. */ do { c = do_terminal();dirty_goto: switch(c + 32 *(c >= 'A' && c <= 'Z')) { case 'a': /* Add line feed */ addlf = !addlf; vt_set(addlf, -1, NULL, -1, -1, -1, -1); s = addlf ? "Add linefeed ON" : "Add linefeed OFF"; werror(s); break;#if _SELECT case 'e': /* Local echo on/off. */ local_echo = !local_echo; vt_set(-1, -1, NULL, -1, -1, local_echo, -1); s = local_echo ? "Local echo ON" : "Local echo OFF"; werror(s); break;#endif case 'z': /* Help */ c = help(); if (c != 'z') goto dirty_goto; break; case 'c': /* Clear screen */ winclr(us); break; case 'f': /* Send break */ sendbreak(); break;#if HISTORY case 'b': /* Scroll back */ scrollback(); break;#endif case 'm': /* Initialize modem */ modeminit(); break; case 'q': /* Exit without resetting */ c = ask("Leave without reset?", c1); if (c == 0) quit = NORESET; break; case 'x': /* Exit Minicom */ c = ask("Leave Minicom?", c1); if (c == 0) { quit = RESET; if(online >= 0) do_hang(0); modemreset(); } break; case 'l': /* Capture file */ if (capfp == (FILE *)0 && !docap) { s = input("Capture to which file? ", capname); if (s == CNULL || *s == 0) break; if ((c = waccess(s)) < 0 || (capfp = fopen(s, "a")) == (FILE *)NULL) { werror("Cannot open capture file"); break; } else if (c == A_OK_NOTEXIST)#ifndef DEBUG#ifndef HAS_FCHOWN /* FIXME: should use fchown */ chown(s, real_uid, real_gid);#else fchown(fileno(capfp), real_uid, real_gid);#endif#endif docap = 1; } else if (capfp != (FILE *)0 && !docap) { c = ask("Capture file", c3); if (c == 0) { fclose(capfp); capfp = (FILE *)NULL; docap = 0; } if (c == 1) docap = 1; } else if (capfp != (FILE *)0 && docap) { c = ask("Capture file", c2); if (c == 0) { fclose(capfp); capfp = (FILE *)NULL; docap = 0; } if (c == 1) docap = 0; } vt_set(addlf, linewrap, capfp, docap, -1, -1, -1); break; case 'p': /* Set parameters */ get_bbp(P_BAUDRATE, P_BITS, P_PARITY); m_setparms(portfd, P_BAUDRATE, P_PARITY, P_BITS); if (st != NIL_WIN) mode_status(); quit = 0; break; case 'k': /* Run kermit */ kermit(); break; case 'h': /* Hang up */ do_hang(1); break; case 'd': /* Dial */ dialdir(); break; case 't': /* Terminal emulation */ c = wselect(13, 3, c8, NIL_FUNLIST, "Emulation", stdattr, MFG, MBG); if (c > 0) init_emul(c); break; case 'w': /* Line wrap on-off */ if (linewrap < 0) linewrap = 0; linewrap = !linewrap; vt_set(addlf, linewrap, capfp, docap, -1, -1, -1); s = linewrap ? "Linewrap ON" : "Linewrap OFF"; werror(s); break; case 'o': /* Configure Minicom */ (void) config(0); break; case 's': /* Upload */ updown('U'); break; case 'r': /* Download */ updown('D'); break; case 'j': /* Jump to a shell */ shjump(); break; case 'g': /* Run script */ runscript(1, "", "", ""); break; case 'i': /* Re-init, re-open portfd. */ cursormode = (cursormode == NORMAL) ? APPL : NORMAL; keyboard(cursormode == NORMAL ? KCURST : KCURAPP, 0); if (st) curs_status(); break; default: break; } } while(!quit); /* Reset parameters */ if (quit != NORESET) m_restorestate(portfd); else m_hupcl(portfd, 0); if (capfp != (FILE *)0) fclose(capfp); wclose(us, 0); wclose(st, 0); wclose(stdwin, 1); keyboard(KUNINSTALL, 0); if (lockfile[0]) unlink(lockfile); close(portfd); chown(P_PORT, portuid, portgid); if (quit != NORESET && P_CALLIN[0]) (void) fastsystem(P_CALLIN, CNULL, CNULL, CNULL); return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -