📄 minicom.c
字号:
} env_args = argk; /* Add command - line options */ for(c = 1; c < argc && argk < 19; c++) args[argk++] = argv[c]; args[argk] = CNULL; do { /* Process options with getopt */ while((c = getopt_long(argk, args, "v8zhlLsomMbwc:a:t:d:p:C:S:", long_options, NULL)) != EOF) switch(c) { case 'v': printf(_("%s version %s"), PACKAGE, VERSION);#ifdef __DATE__ printf(_(" (compiled %s)"), __DATE__);#endif printf("\n"); printf(_("Copyright (C) Miquel van Smoorenburg.\n\n")); printf("This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either version\n" "2 of the License, or (at your option) any later version.\n\n"); exit(1); break; case 's': /* setup */ if (real_uid != 0 && real_uid != eff_uid) { fprintf(stderr, _("minicom: -s switch needs root privilige\n")); exit(1); } dosetup = 1; break; case 'h': helpthem(); exit(1); break; case 'p': /* Pseudo terminal to use. */ if (strncmp(optarg, "/dev/", 5) == 0) optarg += 5; if (((strncmp(optarg, "tty", 3) != 0) /* /dev/pts support --misiek. */ && (strncmp(optarg, "pts", 3) != 0) /* /dev/pty support --jl. */ && (strncmp(optarg, "pty", 3) != 0)) || !strchr("pqrstuvwxyz/", optarg[3])) { fprintf(stderr, _("minicom: argument to -p must be a pty\n")); exit(1); } snprintf(pseudo, sizeof(pseudo), "/dev/%s", optarg); dial_tty = pseudo; /* Drop priviliges. */ drop_all_privs(); break; case 'm': /* ESC prefix metakey */ alt_override++; alt_code = 27; break; case 'M': /* 8th bit metakey. */ alt_override++; alt_code = 128; break; case 'l': /* Literal ANSI chars */ screen_ibmpc++; break; case 'L': /* Literal ISO8859 chars */ screen_iso++; break; case 't': /* Terminal type */ strncpy(termtype, optarg, sizeof(termtype));#ifdef __linux__ /* Bug in older libc's (< 4.5.26 I think) */ if ((s = getenv("TERMCAP")) != NULL && *s != '/') unsetenv("TERMCAP");#endif break; case 'o': /* DON'T initialize */ doinit = 0; break; case 'c': /* Color on/off */ if (strcmp("on", optarg) == 0) { usecolor = 1; stdattr = XA_BOLD; break; } if (strcmp("off", optarg) == 0) { usecolor = 0; stdattr = XA_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; case 'd': /* Dial from the command line. */ cmd_dial = optarg; break; case 'z': /* Enable status line. */ use_status = 1; break; case 'C': /* Capturing */ capfp = sfopen(optarg, "a"); if (capfp == NULL) { werror(_("Cannot open capture file")); exit(1); } docap = 1; vt_set(addlf, -1, capfp, docap, -1, -1, -1, -1); break; case 'S': /* start Script */ strncpy(scr_name, optarg, 33); break; case '8': /* 8bit clean mode */ vt_set(-1, -1, (FILE*)NULL, -1, -1, -1, -1, 1); screen_ibmpc++; screen_iso++; break; case 'w': /* Linewrap on */ wrapln = 1; 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);#ifdef SVR4_LOCKS if (real_uid == 0 && dosetup == 0) { fprintf(stderr, "%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); }#endif /* Avoid fraude ! */ for(s = use_port; *s; s++) if (*s == '/') *s = '_'; snprintf(parfile, sizeof(parfile), "%s/minirc.%s", LIBDIR, use_port); /* Get password file information of this user. */ if ((pwd = getpwuid(real_uid)) == (struct passwd *)0) { fputs(_("You don't exist. Go away.\n"), stderr); exit(1); } /* Remember home directory and username. */ if ((s = getenv("HOME")) == CNULL) strncpy(homedir, pwd->pw_dir, sizeof(homedir)); else strncpy(homedir, s, sizeof(homedir)); strncpy(username, pwd->pw_name, sizeof(username)); /* Get personal parameter file */ snprintf(pparfile, sizeof(pparfile), "%s/.minirc.%s", homedir, use_port); /* Check this user in the USERFILE */ if (real_uid != 0 && real_uid != eff_uid) { snprintf(userfile, sizeof(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) || strcmp("ALL", s) == 0)) { 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); fprintf(stderr, _("Ask your sysadm to add your name to %s\n"), userfile); exit(1); } } } buf[0] = 0; read_parms(); num_hist_lines = atoi(P_HISTSIZE); strcpy(logfname,P_LOGFNAME); stdwin = NIL_WIN; /* It better be! */ /* Reset colors if we don't use 'em. */ if (!usecolor) { mfcolor = tfcolor = sfcolor = WHITE; mbcolor = tbcolor = sbcolor = BLACK; st_attr = XA_REVERSE; } if (dial_tty == NULL) { if (!dosetup) { while((dial_tty = get_port(P_PORT)) != NULL && open_term(doinit) < 0) ; if(dial_tty == NULL) exit(1); } } else { if (!dosetup && open_term(doinit) < 0) exit(1); } mc_setenv("TERM", termtype); if (win_init(tfcolor, tbcolor, XA_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); } while((dial_tty = get_port(P_PORT)) != NULL && open_term(doinit) < 0) ; if(dial_tty == NULL) exit(1); } /* Signal handling */ signal(SIGTERM, hangsig); signal(SIGHUP, hangsig); signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGPIPE, SIG_IGN);#ifdef SIGTSTP signal(SIGTSTP, shjump); 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, alt_code); else if (strcmp(P_ESCAPE, "^A") != 0) { switch(P_ESCAPE[0]) { case '^': c = P_ESCAPE[1] & 31; break; case 'E': c = 27; break; default: c = 128; break; } keyboard(KSETESC, c); } st = NIL_WIN; us = NIL_WIN; init_emul(VT100, 1); if (doinit) modeminit(); wprintf(us, "\n%s %s\r\n", _("Welcome to minicom"), VERSION); wprintf(us, "\n%s: %s%s%s%s%s\r\n", _("OPTIONS"), CR_OPTION1,CR_OPTION2,CR_OPTION3,CR_OPTION4,CR_OPTION5);#if defined (__DATE__) && defined (__TIME__) wprintf(us, "%s %s, %s.\r\n",_("Compiled on"), __DATE__,__TIME__);#endif wprintf(us, _("\nPress %sZ for help on special keys%c\n\n"),esc_key(),'\r'); /* Now that all initialization is done, drop our priviliges. */ drop_privs(); readdialdir(); if (scr_name[0]) runscript (0, scr_name, "", ""); if (cmd_dial) dialone(cmd_dial); /* The main loop calls do_terminal and gets a function key back. */ while(!quit) { 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, -1); s = addlf ? _("Add linefeed ON") : _("Add linefeed OFF"); werror("%s", s); break;#ifdef HAVE_SELECT case 'e': /* Local echo on/off. */ local_echo = !local_echo; vt_set(-1, -1, NULL, -1, -1, local_echo, -1 ,-1); s = local_echo ? _("Local echo ON") : _("Local echo OFF"); werror("%s", 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 */ if (P_HASDCD[0]=='Y' && online >= 0) { c = ask(_("You are online. Really initialize?"), c1); if (c != 0) break; } modeminit(); break; case 'q': /* Exit without resetting */ c = ask(_("Leave without reset?"), c1); if (c == 0) quit = NORESET;#if _HAVE_MACROS if (!strcmp(P_MACCHG,"CHANGED")) { c = ask (_("Save macros?"),c1); if (c == 0) if (dodflsave() < 0) /* fmg - error */ { c = 'O'; /* hehe */ quit = 0; goto dirty_goto; } }#endif break; case 'x': /* Exit Minicom */ c = ask(_("Leave Minicom?"), c1); if (c == 0) { quit = RESET; if(online >= 0) do_hang(0); modemreset(); }#if _HAVE_MACROS if (!strcmp(P_MACCHG,"CHANGED")) { c = ask (_("Save macros?"),c1); if (c == 0) if (dodflsave() < 0) /* fmg - error */ { c = 'O'; /* hehe */ quit = 0; goto dirty_goto; } }#endif break; case 'l': /* Capture file */ if (capfp == (FILE *)0 && !docap) { s = input(_("Capture to which file? "), capname); if (s == CNULL || *s == 0) break; if ((capfp = sfopen(s, "a")) == (FILE *)NULL) { werror(_("Cannot open capture file")); break; } 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, -1, capfp, docap, -1, -1, -1, -1); break; case 'p': /* Set parameters */ get_bbp(P_BAUDRATE, P_BITS, P_PARITY, P_STOPB, 0); port_init(); 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 = dotermmenu(); if (c > 0) init_emul(c, 1); break; case 'w': /* Line wrap on-off */ c = (!us->wrap); vt_set(addlf, c, capfp, docap, -1, -1, -1, -1); s = c ? _("Linewrap ON") : _("Linewrap OFF"); werror("%s", s); break; case 'o': /* Configure Minicom */ (void) config(0); break; case 's': /* Upload */ updown('U', 0); break; case 'r': /* Download */ updown('D', 0); break; case 'j': /* Jump to a shell */ shjump(0); 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; } }; /* Reset parameters */ if (quit != NORESET) m_restorestate(portfd); else { if (P_LOGCONN[0] == 'Y' && online > 0) do_log("%s", _("Quit without reset while online.")); m_hupcl(portfd, 0); } if (capfp != (FILE *)0) fclose(capfp); wclose(us, 0); wclose(st, 0); wclose(stdwin, 1); set_privs(); keyboard(KUNINSTALL, 0); if (lockfile[0]) unlink(lockfile); close(portfd); /* Please - if your system doesn't have uid_t and/or gid_t, define 'em * conditionally in "port.h". */ chown(dial_tty, (uid_t)portuid, (gid_t)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 + -