home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / UUCPBB21 / uucpbb21.lzh / UUCPBB21 / filexfer.c < prev    next >
Text File  |  1994-09-25  |  12KB  |  436 lines

  1. /*  filexfer.c    Routines to send and receive files queued for the remote.
  2.     Copyright (C) 1990, 1993  Rick Adams and Bob Billson
  3.  
  4.     This file is part of the OS-9 UUCP package, UUCPbb.
  5.  
  6.     This program is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 2 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     This program is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with this program; if not, write to the Free Software
  18.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  
  20.     The author of UUCPbb, Bob Billson, can be contacted at:
  21.     bob@kc2wz.bubble.org  or  uunet!kc2wz!bob  or  by snail mail:
  22.     21 Bates Way, Westfield, NJ 07090
  23. */
  24.  
  25. #include "uucp.h"
  26. #include "uucico.h"
  27.  
  28. #define WORDSIZE  20
  29.  
  30. /* global file pointer for incoming/outgoing files, this file only  */
  31. static QQ FILE *io_file;
  32.  
  33. static char data[MAX_SEND_PACKET+1], messg[100], *words[WORDSIZE];
  34. static char Dfilename[256], tmp[50];
  35. static long t_total, filesize;
  36.  
  37. long _gs_size();
  38.  
  39.  
  40. /* msendfile --send file to remote (while in master mode) */
  41.  
  42. int msendfile (line)
  43. char *line;
  44. {
  45.      register int stat;
  46.  
  47.      strcpy (temp, line);
  48.      getargs (words, temp, WORDSIZE);
  49.      strcpy (sender, *(words + 3));
  50.  
  51.      if (debuglvl > 2)
  52.           fputs ("msendfile: Send file to remote as MASTER\n", log);
  53.  
  54.      if (strchr (*(words + 4), 'c') == NULL)
  55.           strcpy (Dfilename, *(words + 5));             /* spool file */
  56.      else
  57.           strcpy (Dfilename, *(words + 1));             /* source file */
  58.  
  59.      /* open the file for send */
  60.      if ((io_file = fopen (Dfilename, "r")) == NULL)
  61.        {
  62.           char tmp[75];
  63.  
  64.           sprintf (tmp, "msendfile: can't open '%s' to send...error #%d",
  65.                         Dfilename, errno);
  66.           logerror (tmp);
  67.           return (FALSE);
  68.        }
  69.      wtmsg (line);                      /* tell remote we're sending a file */
  70.      rdmsg (messg);                     /* what does the remote say? */
  71.  
  72.      if (strcmp (messg, "SY") != 0)            /* remote say no can do */
  73.        {
  74.           fclose (io_file);
  75.           sprintf (tmp, "Request to send '%s' rejected", Dfilename);
  76.           neg_reason (*(messg + 3));
  77.           return (FALSE);
  78.        }
  79.  
  80.      stat = filesend (Dfilename);            /* remote says OK to send file */
  81.  
  82.      /* delete spool file if successful */
  83.      if (stat)
  84.        {
  85.           char tmp[65];
  86.  
  87.           sprintf (tmp, "Sent %-13s -> %ld / %ld secs",
  88.                         Dfilename, filesize, t_total);
  89.           lognorm (tmp);
  90.  
  91.           if (strnucmp (Dfilename, "D.", 2) == 0)
  92.             {
  93.                if (unlink (Dfilename) == ERROR)
  94.                     return (FALSE);
  95.             }
  96.  
  97.           /* don't delete in another directory */
  98.           else if (*Dfilename == '/')
  99.                if (strnucmp (Dfilename, spooldir, strlen (spooldir)) == 0)
  100.                     if (unlink (Dfilename) == ERROR)
  101.                          return (FALSE);
  102.  
  103.           return (TRUE);
  104.        }
  105.      return (stat);          /* if we failed, don't delete the control file */
  106. }
  107.  
  108.  
  109.  
  110. /* mrecvfile  --receive file from remote while master */
  111.  
  112. int mrecvfile (line)
  113. char *line;
  114. {
  115.      register int stat;
  116.  
  117.      strcpy (temp, line);
  118.      getargs (words, temp, WORDSIZE);
  119.      strcpy (sender, *(words + 3));
  120.  
  121.      if (debuglvl >= 3)
  122.           fputs ("mrecvfile: Receive file from remote as MASTER\n", log);
  123.  
  124.      if ((strchr (*(words + 4), 'c') == NULL) && (words[2][0] == '/'))
  125.           strcpy (Dfilename, *(words + 5));             /* spool file */
  126.      else
  127.           strcpy (Dfilename, *(words + 2));             /* destination file */
  128.  
  129.      /* open the file */
  130.      if ((io_file =fopen (Dfilename, "w")) == NULL)
  131.        {
  132.           char tmp[65];
  133.  
  134.           sprintf (tmp, "Can't create '%s' to get file", Dfilename);
  135.           lognorm (tmp);
  136.           return (FALSE);
  137.        }
  138.      wtmsg (line);                            /* tell remote we want a file */
  139.      rdmsg (messg);                           /* remote says... */
  140.  
  141.      if (strncmp (messg, "RY", 2) != 0)       /* no can do...*/
  142.        {
  143.           fclose (io_file);
  144.           sprintf (tmp, "Request to get %s rejected", Dfilename);
  145.           neg_reason (*(messg + 3));
  146.           return (FALSE);
  147.        }
  148.  
  149.      /* remote says OK */
  150.      fprintf (log, "%s %s %s Received %s",
  151.                    sender, sysname, gtime(), Dfilename);
  152.  
  153.      stat = filerecv();                        /* receive file from remote */
  154.  
  155.      if (stat)
  156.           fprintf (log, " <- %ld / %ld secs\n", filesize, t_total);
  157.  
  158.      return (stat);
  159. }
  160.  
  161.  
  162.  
  163. /* ssendfile  --send file to local (slave mode) */
  164.  
  165. int ssendfile (cline)
  166. char *cline;
  167. {
  168.      register int stat;
  169.  
  170.      getargs (words, cline, WORDSIZE);
  171.      strcpy (sender, *(words + 3));
  172.  
  173.      if (debuglvl > 2)
  174.           fputs ("ssendfile: Receive file from remote as SLAVE\n", log);
  175.  
  176.      /* look for UNIX transfer address "~/receive/user/node" -- TK */
  177.      if ((strchr (*(words + 4), 'c') != NULL)   &&   (words[2][0] == '~'))
  178.           sprintf (Dfilename, "%s%s", pubdir, strrchr (*(words + 1), '/'));
  179.      else 
  180.        {
  181.           /* spool file and destination files */
  182.           if ((strchr (*(words + 4), 'c') == NULL) && (words[2][0] == '/'))
  183.                strcpy (Dfilename, *(words + 5));
  184.           else
  185.                strcpy (Dfilename, *(words + 2));
  186.        }
  187.  
  188.      fprintf (log, "%s %s %s Receiving %-13s",
  189.                    sender, sysname, gtime(), Dfilename);
  190.  
  191.      if (debuglvl >= 5)
  192.           putc ('\n', log);
  193.  
  194.      if ((io_file = fopen (Dfilename, "w")) == NULL)      /* open file */
  195.        {
  196.           fputs (" REFUSED - can't create file\n", log);
  197.           wtmsg ("SN4");
  198.           return (FALSE);
  199.        }
  200.  
  201.      wtmsg ("SY");                    /* we'll gladly accept a file from ya */
  202.      stat = filerecv();               /* receive file from remote */
  203.  
  204.      if (stat)
  205.           fprintf (log, " <- %ld / %ld secs\n", filesize, t_total);
  206.  
  207.      return (stat);
  208. }
  209.  
  210.  
  211.  
  212. /* srecvfile  --receive file from local (slave mode) */
  213.  
  214. int srecvfile (cline)
  215. char *cline;
  216. {
  217.      register int stat;
  218.  
  219.      if (debuglvl > 3)
  220.           fprintf (log, "srecvfile: cline=:%s:\n", cline);
  221.  
  222.      if (debuglvl > 2)
  223.           fputs ("srecvfile: Send file to remote as SLAVE\n", log);
  224.  
  225.      /* which file should we send you? */
  226.      getargs (words, cline, WORDSIZE);
  227.      strcpy (sender, *(words + 3));
  228.  
  229.      if (strchr (*(words + 4), 'c') == NULL)
  230.           strcpy (Dfilename, *(words + 5));            /* spool file */
  231.      else
  232.           strcpy (Dfilename, *(words + 1));            /* source file */
  233.  
  234.      fprintf (log, "%s %s %s Request to get '%s' ",
  235.                    sender, sysname, gtime(), Dfilename);
  236.  
  237.      if (debuglvl >= 5)
  238.           putc ('\n', log);
  239.  
  240.      /* if we can't open the file, deny the request */
  241.      if ((io_file = fopen (Dfilename, "r")) == NULL)
  242.        {
  243.           fputs ("DENIED - can't open file\n", log);
  244.           wtmsg ("RN2");
  245.           return (FALSE);
  246.        }
  247.  
  248.      wtmsg ("RY 0666");                 /* we'll gladly send you a file */
  249.      stat = filesend (Dfilename);       /* send file to remote */
  250.  
  251.      if (stat)
  252.           fprintf (log, " -> %ld / %ld secs\n", filesize, t_total);
  253.  
  254.      return (stat);
  255. }
  256.  
  257.  
  258.  
  259. /* filerecv  --Receive file, which we've already opened.  The file pointer to
  260.                to the opened file is in the global variable, io_file.  TRUE is
  261.                returned on success, FALSE on failure. */
  262.  
  263. int filerecv()
  264. {
  265.      char thisseq;
  266.      register int type;
  267.      int length, done = FALSE;
  268.      long t_start, t_end;
  269.  
  270.      /* receive the file */
  271.      time (&t_start);
  272.      while (!done)
  273.        {
  274.           type = getpacket (data, &length);
  275.           thisseq = ((inpacket.C >> 3) & 0x7);
  276.  
  277.           switch (type)
  278.             {
  279.                case LDATA:
  280.                case SDATA:
  281.                     if (((rseq + 1) & 0x07) == thisseq)
  282.                       {
  283.                          rseq = thisseq;
  284.                          wtcontrol (RR | rseq);
  285.  
  286.                          if (length != 0)
  287.                               fwrite (data, length, 1, io_file);
  288.                          else
  289.                               done = TRUE;
  290.                       }
  291.                     else
  292.                          wtcontrol (RR | rseq);
  293.                     break;
  294.  
  295.                default:
  296.                     wtcontrol (RR | rseq);
  297.                     break;
  298.             }
  299.        }
  300.  
  301.      time (&t_end);
  302.      fflush (io_file);
  303.      fixperms (io_file);
  304.      filesize = _gs_size (fileno (io_file));
  305.      fclose (io_file);
  306.      t_total = t_end - t_start;
  307.  
  308.      if (t_total == 0L)
  309.           ++t_total;
  310.  
  311.      /* got execution (X.) file? */
  312.      if (words[2][0] == 'X'  &&  words[2][1] == '.')
  313.           uuxflag = TRUE;
  314.  
  315.      /* can we move the file where it belongs? */
  316.      if ((words[2][0] == '/')  &&  (strchr (*(words + 4), 'c') != NULL))
  317.        {
  318.           FILE *fp;
  319.  
  320.           /* don't copy if it's already there */
  321.           if ((fp = fopen (*(words + 2), "r")) != NULL)
  322.                fclose (fp);
  323.           else
  324.                if (filemove (*(words + 5), *(words + 2)) == FALSE)
  325.                  {
  326.                     wtmsg ("CN5");
  327.                     fputs (" COPY FAILED\n", log);
  328.                     return (FALSE);
  329.                  }
  330.        }
  331.  
  332.      /* yup!  signal success */
  333.      wtmsg ("CY");
  334.  
  335.      if (debuglvl > 2)
  336.           fputs (" RECEIVE OK\n", log);
  337.  
  338.      return (TRUE);
  339. }
  340.  
  341.  
  342.  
  343. /* filesend   --Send the already opened file.  The file pointer to the opened
  344.                 the opened file is in the global variable, io_file.  Read 'C'
  345.                 completion message from remote.  Return TRUE on success, FALSE
  346.                 on failure. */
  347.  
  348. int filesend (filename)
  349. char *filename;
  350. {
  351.      register int count;
  352.      long t_start, t_end;
  353.  
  354.      time (&t_start);
  355.  
  356.      /* initialize sliding window */
  357.      swin_init();
  358.  
  359.      /* send file; swin_send updates sseq */
  360.      while ((count = fread (data, 1, 64, io_file)) != 0)
  361.           if (count == 64)
  362.                swin_send (LDATA, data, count);
  363.           else
  364.                swin_send (SDATA, data, count);
  365.  
  366.      /* signal EOF */
  367.      swin_send (SDATA, data, 0);
  368.  
  369.      /* make sure all packets are sent */
  370.      swin_flush (TRUE);
  371.  
  372.      fflush (io_file);
  373.      filesize = _gs_size (fileno (io_file));
  374.      fclose (io_file);
  375.      time (&t_end);
  376.      t_total = t_end - t_start;
  377.  
  378.      if (t_total == 0L)
  379.           ++t_total;
  380.  
  381.      /* is the remote happy? */
  382.      rdmsg (messg);
  383.  
  384.      /* CY ? */
  385.      if (strcmp (messg, "CY") == 0)                      /* Success */
  386.        {
  387.           if (debuglvl > 2)
  388.                fputs (" SEND OK\n", log);
  389.  
  390.           return (TRUE);
  391.        }
  392.      else
  393.        {
  394.           sprintf (tmp, "SEND '%s' FAILED", filename);   /* Failed */
  395.           neg_reason (*(messg + 3));
  396.           return (FALSE);
  397.        }
  398. }
  399.  
  400.  
  401.  
  402. /* neg_reason    We got a CN, RN, SN, or XN.  Say why, below action taken
  403.                  message is in global 'tmp'. */
  404.  
  405. int neg_reason (reason)
  406. char reason;
  407. {
  408.      fprintf (log, "%s %s %s ", sender, sysname, gtime());
  409.  
  410.      /* Were we given a reason why it was rejected? */
  411.      switch (reason)
  412.        {
  413.           case NULL:
  414.                fprintf (log, "%s --no reason given", tmp);
  415.                break;
  416.  
  417.           case '2':
  418.                fprintf (log, "%s --remote access to file denied", tmp);
  419.                break;
  420.  
  421.           case '4':
  422.                fprintf (log, "%s --remote system cannot create file", tmp);
  423.                break;
  424.  
  425.           case '5':
  426.                fprintf (log,
  427.                         "%s --remote system cannot copy file to requested destination",
  428.                         tmp);
  429.                break;
  430.  
  431.           default:
  432.                fprintf (log, "%s --unknown reason = '%c'", tmp, reason);
  433.        }
  434.      putc ('\n', log);
  435. }
  436.