⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 updown.c

📁 minicom的源码,linux下常用的串口程序.
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * updown.c	Routines to do up and downloading by calling external *		programs (sz, rz, kermit). * *		This file is part of the minicom communications package, *		Copyright 1991-1995 Miquel van Smoorenburg. * *		This program is free software; you can redistribute it and/or *		modify it under the terms of the GNU General Public License *		as published by the Free Software Foundation; either version *		2 of the License, or (at your option) any later version. * * jl 13.09.97	pass actual terminal lines (LINES - statusline) *		to runscript in environment variable TERMLIN * jl 16.09.97	logging of sz/rz file transfers * jl 29.09.97	fix on the transfer logging * hgk&jl 2.98	filename selection window * acme 25.02.98 i18n * js&jl 04.98	the better filename selection window */#ifdef HAVE_CONFIG_H#include <config.h>#endif#include "rcsid.h"RCSID("$Id: updown.c,v 1.7 2005/08/14 20:39:30 al-guest Exp $")#include "port.h"#include "minicom.h"#include "intl.h"/*#define LOG_XFER	  debugging option to log all output of rz/sz */static int udpid;/* * Change to a directory. */static int mcd(char *dir){  char buf[256];  char err[50];  static char odir[256];  static int init = 0;  if (!init) {    if (*dir == 0)      return 0;    init = 1;#if defined (_COH3) || defined(NeXT)    getwd(odir);#else    getcwd(odir, 255);#endif  }  if (*dir == 0) {    chdir(odir);    return 0;  }    if (*dir != '/') {    snprintf(buf, sizeof(buf), "%s/%s", homedir, dir);    dir = buf;  }  if (chdir(dir) < 0) {    /* This may look safe but you might I8N change the string! so       snprintf it */    snprintf(err, sizeof(err),  _("Cannot chdir to %.30s"), dir);    werror("%s", err);    return -1;  }  return 0;}/* * Catch the CTRL-C signal. */static void udcatch(int dummy){  (void)dummy;  signal(SIGINT, udcatch);  if (udpid)    kill((pid_t)udpid, SIGKILL);}/* * Translate %b to the current bps rate, and *           %l to the current tty port. *           %f to the serial port file descriptor */static char *translate(char *s){  static char buf[128];  char str_portfd[8];     /* kino */  int i;  for (i = 0; *s && i < 127; i++, s++) {    if (*s != '%') {      buf[i] = *s;      continue;    }    switch (*++s) {      case 'l':        strncpy(buf + i, dial_tty, sizeof(buf)-i);        i += strlen(dial_tty) - 1;        break;      case 'b':        strncpy(buf + i, P_BAUDRATE, sizeof(buf)-i);        i += strlen(P_BAUDRATE) - 1;        break;      case 'f':        sprintf(str_portfd, "%d", portfd);        strncpy(buf + i, str_portfd, sizeof(buf)-i);        i += strlen(str_portfd) - 1;        break;      default:        buf[i++] = '%';        buf[i] = *s;        break;    }  }  buf[i] = 0;  return buf;}/* * Trim the leading & trailing whitespaces from the string * jl 15.09.97 */char *trim(char *outstring, char *instring, int n){  char *p;  char *ip;  char *op;  char *np;  ip = instring;  np = ip + n;  while ((*ip <= ' ') && (ip < np))    ip++;  op = outstring;  np = op + n;  while ((*ip >= ' ') && (op <= np)) {    *op = *ip;    ip++;    op++;  }  if (op < np)    *op = 0;  while ((op > outstring) && (*op <= ' ')) {    *op = 0;    op--;  }  p = outstring;  return p;}  /* * Choose from numerous up and download protocols! */void updown(int what, int nr){#ifdef LOG_XFER  #warning LOG_XFER defined!  FILE *xfl;#endif  const char *name[13];  int idx[13];  int r, f, g = 0;  char *t = what == 'U' ? _("Upload") : _("Download");  char buf[160];  char buffirst[20];  char xfrstr[160] = "";  char trimbuf[160] = "";  char title[64];  const char *s  ="";  int pipefd[2];  int n, status;  char cmdline[128];  WIN *win = (WIN *)NULL;  if (mcd(what == 'U' ? P_UPDIR : P_DOWNDIR) < 0)    return;  /* Automatic? */  if (nr == 0) {    for (f = 0; f < 12; f++) {      if (P_PNAME(f)[0] && P_PUD(f) == what) {        name[g] = P_PNAME(f);        idx[g++] = f;      }    }    name[g] = NULL;    if (g == 0)      return;    r = wselect(30, 7, name, NULL, t, stdattr, mfcolor, mbcolor) - 1;    if (r < 0)      return;    g = idx[r];  } else    g = nr;  buf[0] = 0;/* jseymour file selector with choice of dir on zmodem, etc. download */#if 1  {    int multiple; /* 0:only directory, 1:one file, -1:any number */    if (P_MUL(g)=='Y')      /* need file(s), or just a directory? */      multiple = what == 'U'? -1 : 0;    else      multiple = 1;	/* only one allowed */    if (P_FSELW[0] == 'Y' && (what == 'U' || P_ASKDNDIR[0] == 'Y')) {      s = filedir(multiple, what == 'U'? 0 : 1);      if (s == NULL)        return;    }    else if (P_PNN(g) == 'Y') {      s = input(_("Please enter file names"), buf);      if (s == NULL)        return;    }    /* discard directory if "multiple" == 0 */    snprintf(cmdline, sizeof(cmdline), "%s %s", P_PPROG(g), multiple == 0? "" : s);  }#endif  if (P_LOGXFER[0] == 'Y')    do_log("%s", cmdline);   /* jl 22.06.97 */  if (P_PFULL(g) == 'N') {    win = wopen(10, 7, 70, 13, BSINGLE, stdattr, mfcolor, mbcolor, 1, 0, 1);    snprintf(title, sizeof(title), _("%.30s %s - Press CTRL-C to quit"), P_PNAME(g),             what == 'U' ? _("upload") : _("download"));    wtitle(win, TMID, title);    pipe(pipefd);  } else    wleave();  switch (udpid = fork()) {    case -1:      werror(_("Out of memory: could not fork()"));      if (win) {        close(pipefd[0]);        close(pipefd[1]);        wclose(win, 1);      } else        wreturn();      mcd("");      return;    case 0: /* Child */      if (P_PIORED(g) == 'Y') {        dup2(portfd, 0);        dup2(portfd, 1);      }      if (win) {        dup2(pipefd[1], 2);        close(pipefd[0]);        if (pipefd[1] != 2)          close(pipefd[1]);      }      for (n = 1; n < _NSIG; n++)        signal(n, SIG_DFL);      set_privs();      setgid((gid_t)real_gid);      setuid((uid_t)real_uid);      fastexec(translate(cmdline));      exit(1);    default: /* Parent */      break;  }  if (win) {    setcbreak(1);         /* Cbreak, no echo. */    enab_sig(1, 0);       /* But enable SIGINT */  }  signal(SIGINT, udcatch);  if (P_PIORED(g) == 'Y') {    close(pipefd[1]);#ifdef LOG_XFER    xfl=fopen("xfer.log","wb");#endif    while ((n = read(pipefd[0], buf, sizeof(buf))) > 0) {      buf[n] = '\0';      wputs(win, buf);      timer_update();      /* Log the filenames & sizes 	jl 14.09.97 */      if (P_LOGXFER[0] == 'Y') {#ifdef LOG_XFER        if (xfl)          fprintf(xfl,">%s<\n",buf);#endif        if (sscanf(buf, "%19s", buffirst)) { /* if / jl 29.09.97 */          if (!strncmp (buffirst, "Receiving", 9) ||              !strncmp (buffirst, "Sending", 7)) {            if (xfrstr[0]) {              trim (trimbuf, xfrstr, sizeof(trimbuf));              do_log ("%s", trimbuf);              xfrstr[0] = 0;            }            trim (trimbuf, buf, sizeof(trimbuf));            do_log("%s", trimbuf);          } else if (!strncmp (buffirst, "Bytes", 5)) {            strncpy (xfrstr, buf, sizeof(xfrstr));          }          buffirst[0] = 0;          trimbuf[0] = 0;        }      }    }#ifdef LOG_XFER    if (xfl)      fclose(xfl);#endif  }  /* Log the last file size	jl 14.09.97 */  if (P_LOGXFER[0] == 'Y' && xfrstr[0]) {    trim (trimbuf, xfrstr, sizeof(trimbuf));    do_log ("%s", trimbuf);    xfrstr[0] = 0;  }  while (udpid != m_wait(&status));  if (win) {    enab_sig(0, 0);    signal(SIGINT, SIG_IGN);  }  if (win == (WIN *)0)    wreturn();  /* MARK updated 02/17/94 - Flush modem port before displaying READY msg */  /* because a BBS often displays menu text right after a download, and we */  /* don't want the modem buffer to be lost while waiting for key to be hit */  m_flush(portfd);  port_init();  setcbreak(2); /* Raw, no echo. */  if (win)    close(pipefd[0]);  mcd("");  timer_update();  /* If we got interrupted, status != 0 */  if (win && (status & 0xFF00) == 0) {#if VC_MUSIC    if (P_SOUND[0] == 'Y') {      wprintf(win, _("\n READY: press any key to continue..."));      music();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -