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

📄 ascii-xfr.c

📁 在MAC OS下的一个可以直接调试modem的工具minicom,类似于是在windows下的超级终端.
💻 C
字号:
/* * ascii-xfr	Ascii file transfer. * * Usage:	ascii-xfr -s|-r [-ednv] [-c character delay] [-l line delay] * * 08.03.98 added a patch from Bo Branten <bosse@ing.umu.se> * *  You should have received a copy of the GNU General Public License along *  with this program; if not, write to the Free Software Foundation, Inc., *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * */#ifdef HAVE_CONFIG_H#include <config.h>#endif#include "rcsid.h"RCSID("$Id: ascii-xfr.c,v 1.7 2007-10-10 20:18:20 al-guest Exp $")#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <strings.h>#include <time.h>#include <unistd.h>#include <sys/time.h>#include <sys/types.h>#ifdef HAVE_TERMIOS_H#include <termios.h>#endif/* *	Externals. */extern int optind;extern char *optarg;/* *	Global variables. */int cdelay = 0;int ldelay = 0;int dotrans = 1;int eofchar = 26;int useeof = 0;int verbose = 0;time_t start, last;unsigned long bdone = 0;/* *	Millisecond delay. */void ms_delay(int ms){#ifdef HAVE_USLEEP  usleep(1000 * ms);#endif}/* *	Output a line and delay if needed. */void lineout(char const *line){  int ret;  if (!cdelay) {    int len = strlen(line);    do {      ret = write(STDOUT_FILENO, line, len);      if (ret < 0) {	fprintf(stderr, "Error while writing (errno = %d)\n", errno);	return;      }      len -= ret;      line += ret;    } while (len);  } else {    while (*line) {      ret = write(STDOUT_FILENO, line, 1);      if (ret < 0) {	fprintf(stderr, "Error while writing (errno = %d)\n", errno);	return;      }      if (ret == 1)	line++;      ms_delay(cdelay);    }  }}/* *	Show the up/download statistics. */void stats(int force){  time_t now;  time_t dif;  if (!verbose)    return;  time(&now);  dif = now - start;  if (!force && dif < 2)    return;  if (dif < 1)    dif = 1;  last = now;  fprintf(stderr, "\r%.1f Kbytes transferred at %d CPS",          (float)bdone / 1024, (int)(bdone / dif));  fflush(stderr);}void check_answer(void){ /* a patch from Bo Branten <bosse@ing.umu.se> */  char line[1024];  int  n;  fd_set rfds;  struct timeval tv;  FD_ZERO (&rfds);  FD_SET (STDIN_FILENO, &rfds);  tv.tv_sec = 0;  tv.tv_usec = 0;  while (select (STDIN_FILENO + 1, &rfds, NULL, NULL, &tv) > 0) {    n = read (STDIN_FILENO, line, sizeof(line));    write(STDERR_FILENO, line, n);    FD_ZERO (&rfds);    FD_SET (STDIN_FILENO, &rfds);    tv.tv_sec = 0;    tv.tv_usec = 0;  }}/* *	Send a file in ASCII mode. */int asend(char *file){  FILE *fp;  char line[1024];  char *s;  int first = 1;  if ((fp = fopen(file, "r")) == NULL) {    perror(file);    return -1;  }  while (fgets(line, sizeof(line) - 1, fp) != NULL) {    if (dotrans && (s = strrchr(line, '\n')) != NULL) {      /* s now points to \n */      /* if there's a \r before, go there */      if (s > line && *(s - 1) == '\r')        s--;      /* end of line */      *s++ = '\r';      *s++ = '\n';      /* terminate string */      *s = 0;    }    lineout(line);    bdone += strlen(line);    if (ldelay)      ms_delay(ldelay);    stats(first);    first = 0;    check_answer();  }  if (useeof)     putchar(eofchar);  fflush(stdout);  if (isatty (STDOUT_FILENO))    tcdrain (STDOUT_FILENO);  fclose(fp);  return 0;}/* *	Receive a file in ASCII mode. */int arecv(char *file){  FILE *fp;  char line[1024];  char *s;  int n;  int first = 1;  if ((fp = fopen(file, "w")) == NULL) {    perror(file);    return -1;  }  while ((n = read(STDIN_FILENO, line, sizeof(line))) > 0) {    for (s = line; n-- >0; s++) {      if (*s == eofchar)        break;      if (dotrans && *s == '\r')        continue;      bdone++;      fputc(*s, fp);    }    stats(first);    first = 0;    if (*s == eofchar)      break;  }  fclose(fp);  return 0;}void usage(void){  fprintf(stderr, "\Usage: ascii-xfr -s|-r [-dvn] [-l linedelay] [-c character delay] filename\n\       -s:  send\n\       -r:  receive\n\       -e:  send the End Of File character (default is not to)\n\       -d:  set End Of File character to Control-D (instead of Control-Z)\n\       -v:  verbose (statistics on stderr output)\n\       -n:  do not translate CRLF <--> LF\n\       Delays are in milliseconds.\n");  exit(1);}int main(int argc, char **argv){  int c;  int what = 0;  char *file;  int ret;  while ((c = getopt(argc, argv, "srdevnl:c:")) != EOF) {    switch (c) {      case 's':      case 'r':        what = c;        break;      case 'd':        eofchar = 4; /* Unix, CTRL-D */        break;      case 'e':        useeof = 1;        break;      case 'v':        verbose++;        break;      case 'n':        dotrans = 0;        break;      case 'l':        ldelay = atoi(optarg);        break;      case 'c':        cdelay = atoi(optarg);        break;      default:        usage();        break;    }  }  if (optind != argc - 1 || what == 0)    usage();  file = argv[optind];  time(&start);  last = start;  if (what == 's') {    fprintf(stderr, "ASCII upload of \"%s\"\n", file);    if (cdelay || ldelay)      fprintf(stderr, "Line delay: %d ms, character delay %d ms\n",              ldelay, cdelay);    fprintf(stderr, "\n");    fflush(stderr);    ret = asend(file);  } else {    fprintf(stderr, "ASCII download of \"%s\"\n\n", file);    fflush(stderr);    ret = arecv(file);  }  if (verbose) {    stats(1);    fprintf(stderr, "... Done.\n");    fflush(stdout);  }  return ret < 0 ? 1 : 0;}

⌨️ 快捷键说明

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