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

📄 main.c

📁 linux下tftp客气端的源码实现
💻 C
📖 第 1 页 / 共 2 页
字号:
    {      putusage (argv[0]);      return;    }  targ = argv[argc - 1];  if (strchr (argv[argc - 1], ':'))    {      char *cp;      for (n = 1; n < argc - 1; n++)	if (strchr (argv[n], ':'))	  {	    putusage (argv[0]);	    return;	  }      cp = argv[argc - 1];      targ = strchr (cp, ':');      *targ++ = 0;      if (resolve_name (cp, 0) != RESOLVE_OK)	return;    }  if (!connected)    {      printf ("No target machine specified.\n");      return;    }  if (argc < 4)    {      cp = argc == 2 ? tail (targ) : argv[1];      fd = open (cp, O_RDONLY);      if (fd < 0)	{	  fprintf (stderr, "tftp: ");	  perror (cp);	  return;	}      if (verbose)	printf ("putting %s to %s:%s [%s]\n", cp, hostname, targ, mode);      peeraddr.sin_port = port ? port : sp->s_port;      send_file (fd, targ, mode);      return;    }  /* this assumes the target is a directory */  /* on a remote unix system.  hmmmm.  */  cp = strchr (targ, '\0');  *cp++ = '/';  for (n = 1; n < argc - 1; n++)    {      strcpy (cp, tail (argv[n]));      fd = open (argv[n], O_RDONLY);      if (fd < 0)	{	  fprintf (stderr, "tftp: ");	  perror (argv[n]);	  continue;	}      if (verbose)	printf ("putting %s to %s:%s [%s]\n", argv[n], hostname, targ, mode);      peeraddr.sin_port = port ? port : sp->s_port;      send_file (fd, targ, mode);    }}static voidputusage (char *s){  printf ("usage: %s file ... host:target, or\n", s);  printf ("       %s file ... target (when already connected)\n", s);}/* * Receive file(s). */voidget (int argc, char *argv[]){  int             fd;  register int    n;  register char  *cp;  char           *src;  if (argc < 2)    get_args ("get", "(files) ", &argc, &argv);  if (argc < 2)    {      getusage (argv[0]);      return;    }  if (!connected)    {      for (n = 1; n < argc; n++)	if (strchr (argv[n], ':') == 0)	  {	    getusage (argv[0]);	    return;	  }    }  for (n = 1; n < argc; n++)    {      src = strchr (argv[n], ':');      if (src == NULL)	src = argv[n];      else	{	  *src++ = 0;	  if (resolve_name (argv[n], 0) != RESOLVE_OK)	    continue;	}            if (argc < 4)	{	  cp = argc == 3 ? argv[2] : tail (src);	  fd = creat (cp, 0644);	  if (fd < 0)	    {	      fprintf (stderr, "tftp: ");	      perror (cp);	      return;	    }	  if (verbose)	    printf ("getting from %s:%s to %s [%s]\n",		    hostname, src, cp, mode);	  peeraddr.sin_port = port ? port : sp->s_port;	  recvfile (fd, src, mode);	  break;	}      cp = tail (src);		/* new .. jdg */      fd = creat (cp, 0644);      if (fd < 0)	{	  fprintf (stderr, "tftp: ");	  perror (cp);	  continue;	}      if (verbose)	printf ("getting from %s:%s to %s [%s]\n", hostname, src, cp, mode);      peeraddr.sin_port = port ? port : sp->s_port;      recvfile (fd, src, mode);    }}static voidgetusage (char *s){  printf ("usage: %s host:file host:file ... file, or\n", s);  printf ("       %s file file ... file if connected\n", s);}int rexmtval = TIMEOUT;voidsetrexmt (int argc, char *argv[]){  int t;  if (argc < 2)    get_args ("Rexmt-timeout", "(value) ", &argc, &argv);  if (argc != 2)    {      printf ("usage: %s value\n", argv[0]);      return;    }  t = atoi (argv[1]);  if (t < 0)    printf ("%s: bad value\n", argv[1]);  else    rexmtval = t;}int maxtimeout = 5 * TIMEOUT;voidsettimeout (int argc, char *argv[]){  int t;  if (argc < 2)    get_args ("Maximum-timeout", "(value) ", &argc, &argv);  if (argc != 2)    {      printf ("usage: %s value\n", argv[0]);      return;    }  t = atoi (argv[1]);  if (t < 0)    printf ("%s: bad value\n", argv[1]);  else    maxtimeout = t;}voidstatus (int argc, char *argv[]){  if (connected)    printf ("Connected to %s.\n", hostname);  else    printf ("Not connected.\n");  printf ("Mode: %s Verbose: %s Tracing: %s\n", mode,	  verbose ? "on" : "off", trace ? "on" : "off");  printf ("Rexmt-interval: %d seconds, Max-timeout: %d seconds\n",	  rexmtval, maxtimeout);}voidintr (){  signal (SIGALRM, SIG_IGN);  alarm (0);  longjmp (toplevel, -1);}char *tail (char *filename){  register char  *s;  while (*filename)    {      s = strrchr (filename, '/');      if (s == NULL)	break;      if (s[1])	return (s + 1);      *s = '\0';    }  return filename;}/* * Command parser. */static voidcommand (){  register struct cmd *c;  for (;;)    {      printf ("%s> ", prompt);      if (fgets (line, sizeof line, stdin) == 0)	{	  if (feof (stdin))	    exit (0);	  else	    continue;	}      if (line[0] == 0)	continue;      makeargv ();      if (margc == 0)	continue;      c = getcmd (margv[0]);      if (c == (struct cmd *) -1)	{	  printf ("?Ambiguous command\n");	  continue;	}      if (c == 0)	{	  printf ("?Invalid command\n");	  continue;	}      (*c->handler) (margc, margv);    }}struct cmd *getcmd (register char *name){  register char  *p, *q;  register struct cmd *c, *found;  register int nmatches, longest;  longest = 0;  nmatches = 0;  found = 0;  for (c = cmdtab; (p = c->name) != NULL; c++)    {      for (q = name; *q == *p++; q++)	if (*q == 0)		/* exact match? */	  return (c);            if (!*q)	{			/* the name was a prefix */	  if (q - name > longest)	    {	      longest = q - name;	      nmatches = 1;	      found = c;	    }	  else if (q - name == longest)	    nmatches++;	}    }  if (nmatches > 1)    return (struct cmd *) -1;  return found;}/* * Slice a string up into argc/argv. */static voidmakeargv (){  register char  *cp;  register char **argp = margv;  margc = 0;  for (cp = line; *cp;)    {      while (isspace (*cp))	cp++;      if (*cp == '\0')	break;      *argp++ = cp;      margc += 1;      while (*cp != '\0' && !isspace (*cp))	cp++;      if (*cp == '\0')	break;      *cp++ = '\0';    }  *argp++ = 0;}voidquit (int argc, char *argv[]){  exit (0);}/* * Help command. */voidhelp (int argc, char *argv[]){  register struct cmd *c;  if (argc == 1)    {      printf ("Commands may be abbreviated.  Commands are:\n\n");      for (c = cmdtab; c->name; c++)	printf ("%-*s\t%s\n", (int) HELPINDENT, c->name, c->help);      return;    }    while (--argc > 0)    {      register char  *arg;      arg = *++argv;      c = getcmd (arg);      if (c == (struct cmd *) -1)	printf ("?Ambiguous help command %s\n", arg);      else if (c == (struct cmd *) 0)	printf ("?Invalid help command %s\n", arg);      else	printf ("%s\n", c->help);    }}voidsettrace (int argc, char **argv){  trace = !trace;  printf ("Packet tracing %s.\n", trace ? "on" : "off");}voidsetverbose (int argc, char **argv){  verbose = !verbose;  printf ("Verbose mode %s.\n", verbose ? "on" : "off");}

⌨️ 快捷键说明

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