home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 2 BBS / 02-BBS.zip / lora299s.zip / FTP.CPP < prev    next >
C/C++ Source or Header  |  1996-07-24  |  30KB  |  712 lines

  1.  
  2. // ----------------------------------------------------------------------
  3. // LoraBBS Professional Edition - Version 3.00.6
  4. // Copyright (c) 1996 by Marco Maccaferri. All rights reserved.
  5. //
  6. // History:
  7. //    13/06/96 - Initial coding.
  8. // ----------------------------------------------------------------------
  9.  
  10. #include "_ldefs.h"
  11. #include "lserver.h"
  12.  
  13. TFTP::TFTP (void)
  14. {
  15.    Cfg = NULL;
  16.    Tcp = Data = NULL;
  17.    User = NULL;
  18.    Nodes = NULL;
  19.    Files = NULL;
  20.    Outbound = NULL;
  21.  
  22.    Binary = TRUE;
  23.    Valid = Anonymous = FALSE;
  24.    Known = Protected = FALSE;
  25.    DataPort = 0;
  26.  
  27.    _dos_getdate (&date);
  28.    _dos_gettime (&d_time);
  29.  
  30.    Month[0] = "Jan";
  31.    Month[1] = "Feb";
  32.    Month[2] = "Mar";
  33.    Month[3] = "Apr";
  34.    Month[4] = "May";
  35.    Month[5] = "Jun";
  36.    Month[6] = "Jul";
  37.    Month[7] = "Aug";
  38.    Month[8] = "Sep";
  39.    Month[9] = "Oct";
  40.    Month[10] = "Nov";
  41.    Month[11] = "Dec";
  42. }
  43.  
  44. TFTP::~TFTP (void)
  45. {
  46.    if (Tcp != NULL)
  47.       delete Tcp;
  48.    if (User != NULL)
  49.       delete User;
  50.    if (Files != NULL)
  51.       delete Files;
  52.    if (Nodes != NULL)
  53.       delete Nodes;
  54.    if (Outbound != NULL)
  55.       delete Outbound;
  56.    if (Cfg != NULL)
  57.       delete Cfg;
  58. }
  59.  
  60. VOID TFTP::GetCommand (VOID)
  61. {
  62.    USHORT len = 0, MaxLen = sizeof (Response);
  63.    CHAR c, *pszResp = Response;
  64.  
  65.    do {
  66.       if (Tcp->BytesReady () == TRUE) {
  67.          do {
  68.             if ((c = (CHAR)Tcp->ReadByte ()) != '\r') {
  69.                if (c != '\n') {
  70.                   *pszResp++ = c;
  71.                   if (++len >= MaxLen)
  72.                      c = '\r';
  73.                }
  74.             }
  75.          } while (Tcp->RxBytes > 0 && c != '\r');
  76.       }
  77. #if defined(__OS2__)
  78.       DosSleep (1L);
  79. #elif defined(__NT__)
  80.       Sleep (1L);
  81. #endif
  82.    } while (c != '\r' && Tcp->Carrier () == TRUE);
  83.  
  84.    *pszResp = '\0';
  85. }
  86.  
  87. VOID TFTP::ReadFile (PSZ pszCode, PSZ pszFile)
  88. {
  89.    FILE *fp;
  90.  
  91.    if ((fp = fopen (pszFile, "rt")) != NULL) {
  92.       while (fgets (Temp, sizeof (Temp) - 1, fp) != NULL) {
  93.          Tcp->BufferBytes ((UCHAR *)pszCode, (USHORT)strlen (pszCode));
  94.          Tcp->BufferByte ('-');
  95.          Tcp->BufferBytes ((UCHAR *)Temp, (USHORT)(strlen (Temp) - 1));
  96.          Tcp->BufferBytes ((UCHAR *)"\r\n", 2);
  97.       }
  98.       fclose (fp);
  99.  
  100.       Tcp->BufferBytes ((UCHAR *)pszCode, (USHORT)strlen (pszCode));
  101.       Tcp->BufferByte (' ');
  102.       Tcp->BufferBytes ((UCHAR *)"\r\n", 2);
  103.  
  104.       Tcp->UnbufferBytes ();
  105.    }
  106. }
  107.  
  108. USHORT TFTP::FileExist (PSZ pszFile)
  109. {
  110.    int fd;
  111.  
  112.    if ((fd = open (pszFile, O_RDONLY)) != -1) {
  113.       close (fd);
  114.       return (TRUE);
  115.    }
  116.  
  117.    return (FALSE);
  118. }
  119.  
  120. VOID TFTP::Run (VOID)
  121. {
  122.    int fd;
  123.    USHORT Readed, Ok, GotA;
  124.    CHAR *p, CurPath[32];
  125.  
  126.    strcpy (CurPath, "/");
  127.    EndRun = FALSE;
  128.  
  129.    while (Tcp->Carrier () == TRUE && EndRun == FALSE) {
  130. //   while (EndRun == FALSE) {
  131.       GetCommand ();
  132.       if ((p = strtok (Response, " ")) != NULL) {
  133.          if (!stricmp (p, "QUIT")) {
  134.             if (FileExist ("logoff.ftp")) {
  135.                sprintf (Temp, "221-Goodbye.\r\n");
  136.                Tcp->BufferBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  137.                ReadFile ("221", "logoff.ftp");
  138.             }
  139.             else {
  140.                sprintf (Temp, "221 Goodbye.\r\n");
  141.                Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  142.             }
  143.             EndRun = TRUE;
  144.          }
  145.          else if (!stricmp (p, "TYPE")) {
  146.             if ((p = strtok (NULL, " ")) != NULL) {
  147.                if (!stricmp (p, "A")) {
  148.                   sprintf (Temp, "200 Type set to A\r\n");
  149.                   Binary = FALSE;
  150.                }
  151.                else if (!stricmp (p, "I")) {
  152.                   sprintf (Temp, "200 Type set to I\r\n");
  153.                   Binary = TRUE;
  154.                }
  155.                else
  156.                   sprintf (Temp, "503 Command not implemented.\r\n");
  157.                Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  158.             }
  159.          }
  160.          else if (!stricmp (p, "PORT")) {
  161.             ClientIP[0] = '\0';
  162.             if ((p = strtok (NULL, ",")) != NULL) {
  163.                strcat (ClientIP, p);
  164.                strcat (ClientIP, ".");
  165.             }
  166.             if ((p = strtok (NULL, ",")) != NULL) {
  167.                strcat (ClientIP, p);
  168.                strcat (ClientIP, ".");
  169.             }
  170.             if ((p = strtok (NULL, ",")) != NULL) {
  171.                strcat (ClientIP, p);
  172.                strcat (ClientIP, ".");
  173.             }
  174.             if ((p = strtok (NULL, ",")) != NULL)
  175.                strcat (ClientIP, p);
  176.  
  177.             DataPort = 0;
  178.             if ((p = strtok (NULL, ",")) != NULL)
  179.                DataPort = (USHORT)(atoi (p) << 8);
  180.             if ((p = strtok (NULL, ",")) != NULL)
  181.                DataPort |= (USHORT)atoi (p);
  182.  
  183.             sprintf (Temp, "200 Port command successfull.\r\n");
  184.             Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  185.          }
  186.          else if (!stricmp (p, "LIST")) {
  187.             p = strtok (NULL, " ");
  188.             if ((Data = new TTcpip) != NULL) {
  189.                sprintf (Temp, "150 Opening ASCII mode data connection for /bin/ls.\r\n");
  190.                Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  191.  
  192.                if (Data->ConnectServer (ClientIP, DataPort) == TRUE) {
  193.                   if (Nodes != NULL) {
  194.                      if (Outbound != NULL) {
  195.                         if (Outbound->First () == TRUE)
  196.                            do {
  197.                               sprintf (Temp, "-rw-a--      0 0        0        %8lu %s %2d %02d:%02d %s\r\n", Outbound->Size, Month[date.month - 1], date.day, d_time.hour, d_time.minute, strlwr (Outbound->Name));
  198.                               Data->BufferBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  199.                            } while (Outbound->Next () == TRUE);
  200.                      }
  201.                   }
  202.                   else if (Files == NULL) {
  203.                      if (p != NULL) {
  204.                         if ((Area = new TFileData (Cfg->SystemPath)) != NULL) {
  205.                            if (Area->First () == TRUE)
  206.                               do {
  207.                                  if (!stricmp (p, Area->Key)) {
  208.                                     if ((Files = new TFileBase (Cfg->SystemPath, Area->Key)) != NULL) {
  209.                                        Files->SortByName ();
  210.                                        if (Files->First () == TRUE)
  211.                                           do {
  212.                                              sprintf (Temp, "-rw-a--      0 0        0               0 %s %2d %02d:%02d %s\r\n", Files->Size, Month[Files->UplDate.Month - 1], Files->UplDate.Day, Files->UplDate.Hour, Files->UplDate.Minute, strlwr (Files->Name));
  213.                                              Data->BufferBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  214.                                           } while (Files->Next () == TRUE);
  215.                                        delete Files;
  216.                                        Files = NULL;
  217.                                     }
  218.                                  }
  219.                               } while (Area->Next () == TRUE);
  220.                            delete Area;
  221.                         }
  222.                      }
  223.                      else {
  224.                         if ((Area = new TFileData (Cfg->SystemPath)) != NULL) {
  225.                            if (Area->First () == TRUE)
  226.                               do {
  227.                                  sprintf (Temp, "drw----      0 0        0               0 %s %2d %02d:%02d %s\r\n", Month[date.month - 1], date.day, d_time.hour, d_time.minute, strlwr (Area->Key));
  228.                                  Data->BufferBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  229.                               } while (Area->Next () == TRUE);
  230.                            delete Area;
  231.                         }
  232.                      }
  233.                   }
  234.                   else {
  235.                      if (Files->First () == TRUE)
  236.                         do {
  237.                            sprintf (Temp, "-rw-a--      0 0        0        %8lu %s %2d %02d:%02d %s\r\n", Files->Size, Month[Files->UplDate.Month - 1], Files->UplDate.Day, Files->UplDate.Hour, Files->UplDate.Minute, strlwr (Files->Name));
  238.                            Data->BufferBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  239.                         } while (Files->Next () == TRUE);
  240.                   }
  241.                   Data->UnbufferBytes ();
  242.                }
  243.  
  244.                sprintf (Temp, "226 Transfer complete.\r\n");
  245.                Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  246.                delete Data;
  247.             }
  248.          }
  249.          else if (!stricmp (p, "NLST")) {
  250.             p = strtok (NULL, " ");
  251.             if ((Data = new TTcpip) != NULL) {
  252.                sprintf (Temp, "150 Opening ASCII mode data connection for /bin/ls.\r\n");
  253.                Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  254.  
  255.                if (Data->ConnectServer (ClientIP, DataPort) == TRUE) {
  256.                   if (Nodes != NULL) {
  257.                      if (Outbound != NULL) {
  258.                         if (Outbound->First () == TRUE)
  259.                            do {
  260.                               sprintf (Temp, "%s\r\n", strlwr (Outbound->Name));
  261.                               Data->BufferBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  262.                            } while (Outbound->Next () == TRUE);
  263.                      }
  264.                   }
  265.                   else if (Files == NULL) {
  266.                      if ((Area = new TFileData (Cfg->SystemPath)) != NULL) {
  267.                         if (Area->First () == TRUE)
  268.                            do {
  269.                               if (p != NULL)
  270.                                  sprintf (Temp, "drw----      0 0        0               0 %s %2d %02d:%02d %s\r\n", Month[date.month - 1], date.day, d_time.hour, d_time.minute, strlwr (Area->Key));
  271.                               else
  272.                                  sprintf (Temp, "%s/\r\n", strlwr (Area->Key));
  273.                               Data->BufferBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  274.                            } while (Area->Next () == TRUE);
  275.                         delete Area;
  276.                      }
  277.                   }
  278.                   else {
  279.                      if (Files->First () == TRUE)
  280.                         do {
  281.                            if (p != NULL)
  282.                               sprintf (Temp, "-rw-a--      0 0        0        %lu %s %2d %02d:%02d %s\r\n", Files->Size, Month[Files->UplDate.Month - 1], Files->UplDate.Day, Files->UplDate.Hour, Files->UplDate.Minute, strlwr (Files->Name));
  283.                            else
  284.                               sprintf (Temp, "%s\r\n", strlwr (Files->Name));
  285.                            Data->BufferBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  286.                         } while (Files->Next () == TRUE);
  287.                   }
  288.                   Data->UnbufferBytes ();
  289.                }
  290.  
  291.                sprintf (Temp, "226 Transfer complete.\r\n");
  292.                Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  293.                delete Data;
  294.             }
  295.          }
  296.          else if (!stricmp (p, "NOOP")) {
  297.             sprintf (Temp, "200 NOOP command successfull\r\n", p);
  298.             Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  299.          }
  300.          else if (!stricmp (p, "RETR")) {
  301.             if ((p = strtok (NULL, " ")) != NULL) {
  302.                if (*p == '/')
  303.                   p++;
  304.                if ((User != NULL || Anonymous == TRUE) && strchr (p, '/') != NULL) {
  305.                   if ((Area = new TFileData (Cfg->SystemPath)) != NULL) {
  306.                      if (Area->First () == TRUE)
  307.                         do {
  308.                            if (!strnicmp (p, Area->Key, strlen (Area->Key)) && p[strlen (Area->Key)] == '/') {
  309.                               if ((Files = new TFileBase (Cfg->SystemPath, Area->Key)) != NULL) {
  310.                                  if (Files->Read (&p[strlen (Area->Key) + 1]) == TRUE) {
  311.                                     if ((Data = new TTcpip) != NULL) {
  312.                                        sprintf (Temp, "150 Opening %s mode data connection for %s (%ld bytes).\r\n", (Binary == TRUE) ? "BINARY" : "ASCII", Files->Name, Files->Size);
  313.                                        Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  314.  
  315.                                        if (Data->ConnectServer (ClientIP, DataPort) == TRUE) {
  316.                                           if ((fd = open (Files->Complete, (Binary == TRUE) ? (O_RDONLY|O_BINARY) : (O_RDONLY|O_TEXT))) != -1) {
  317.                                              do {
  318.                                                 Readed = (USHORT)read (fd, Temp, sizeof (Temp));
  319.                                                 Data->BufferBytes ((UCHAR *)Temp, Readed);
  320.                                              } while (Readed == sizeof (Temp));
  321.                                              close (fd);
  322.  
  323.                                              Files->DlTimes++;
  324.                                              Files->ReplaceHeader ();
  325.                                           }
  326.                                           Data->UnbufferBytes ();
  327.                                        }
  328.  
  329.                                        sprintf (Temp, "226 Transfer complete.\r\n");
  330.                                        Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  331.                                        delete Data;
  332.                                     }
  333.                                  }
  334.                                  else {
  335.                                     sprintf (Temp, "550 %s: no such file or directory.\r\n", p);
  336.                                     Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  337.                                  }
  338.                                  delete Files;
  339.                                  Files = NULL;
  340.                               }
  341.                            }
  342.                         } while (Area->Next () == TRUE);
  343.                      delete Area;
  344.                   }
  345.                }
  346.                else if ((User != NULL || Anonymous == TRUE) && Files != NULL) {
  347.                   if (Files->Read (p) == TRUE) {
  348.                      if ((Data = new TTcpip) != NULL) {
  349.                         sprintf (Temp, "150 Opening %s mode data connection for %s (%ld bytes).\r\n", (Binary == TRUE) ? "BINARY" : "ASCII", Files->Name, Files->Size);
  350.                         Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  351.  
  352.                         if (Data->ConnectServer (ClientIP, DataPort) == TRUE) {
  353.                            sprintf (Temp, "%s%s", Area->Download, Files->Name);
  354.                            if ((fd = open (Temp, (Binary == TRUE) ? (O_RDONLY|O_BINARY) : (O_RDONLY|O_TEXT))) != -1) {
  355.                               do {
  356.                                  Readed = (USHORT)read (fd, Temp, sizeof (Temp));
  357.                                  Data->BufferBytes ((UCHAR *)Temp, Readed);
  358.                               } while (Readed == sizeof (Temp));
  359.                               close (fd);
  360.  
  361.                               Files->DlTimes++;
  362.                               Files->ReplaceHeader ();
  363.                            }
  364.                            Data->UnbufferBytes ();
  365.                         }
  366.  
  367.                         sprintf (Temp, "226 Transfer complete.\r\n");
  368.                         Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  369.                         delete Data;
  370.                      }
  371.                   }
  372.                   else {
  373.                      sprintf (Temp, "550 %s: no such file or directory.\r\n", p);
  374.                      Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  375.                   }
  376.                }
  377.                else if (Nodes != NULL && Outbound != NULL) {
  378.                   Ok = FALSE;
  379.                   if (Outbound->First () == TRUE)
  380.                      do {
  381.                         if (!stricmp (Outbound->Name, p)) {
  382.                            if ((Data = new TTcpip) != NULL) {
  383.                               sprintf (Temp, "150 Opening %s mode data connection for %s (%ld bytes).\r\n", (Binary == TRUE) ? "BINARY" : "ASCII", Outbound->Name, Outbound->Size);
  384.                               Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  385.  
  386.                               if (Data->ConnectServer (ClientIP, DataPort) == TRUE) {
  387.                                  if ((fd = open (Outbound->Complete, (Binary == TRUE) ? (O_RDONLY|O_BINARY) : (O_RDONLY|O_TEXT))) != -1) {
  388.                                     do {
  389.                                        Readed = (USHORT)read (fd, Temp, sizeof (Temp));
  390.                                        Data->BufferBytes ((UCHAR *)Temp, Readed);
  391.                                     } while (Readed == sizeof (Temp));
  392.                                     close (fd);
  393.                                  }
  394.                                  Data->UnbufferBytes ();
  395.                               }
  396.  
  397.                               Ok = TRUE;
  398.  
  399.                               sprintf (Temp, "226 Transfer complete.\r\n");
  400.                               Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  401.                               delete Data;
  402.                            }
  403.                         }
  404.                      } while (Outbound->Next () == TRUE);
  405.  
  406.                   if (Ok == FALSE) {
  407.                      sprintf (Temp, "550 %s: no such file or directory.\r\n", p);
  408.                      Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  409.                   }
  410.                }
  411.                else {
  412.                   sprintf (Temp, "550 %s: no such file or directory.\r\n", p);
  413.                   Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  414.                }
  415.             }
  416.          }
  417.          else if (!stricmp (p, "SYST")) {
  418.             sprintf (Temp, "215 UNIX type:OS/2\r\n", p);
  419.             Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  420.          }
  421.          else if (!stricmp (p, "STOR")) {
  422.             if ((p = strtok (NULL, " ")) != NULL) {
  423.                if (Nodes != NULL) {
  424.                   if ((Data = new TTcpip) != NULL) {
  425.                      sprintf (Temp, "150 Opening %s mode data connection for %s.\r\n", (Binary == TRUE) ? "BINARY" : "ASCII", p);
  426.                      Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  427.  
  428.                      if (Data->ConnectServer (ClientIP, DataPort) == TRUE) {
  429.                         if (Protected == TRUE)
  430.                            sprintf (Temp, "%s%s", Cfg->ProtectedInbound, p);
  431.                         else if (Known == TRUE)
  432.                            sprintf (Temp, "%s%s", Cfg->KnownInbound, p);
  433.                         else
  434.                            sprintf (Temp, "%s%s", Cfg->NormalInbound, p);
  435.  
  436.                         if ((fd = open (Temp, O_RDONLY|O_BINARY)) != -1) {
  437.                            close (fd);
  438.                            if ((p = strchr (Temp, '\0')) != NULL) {
  439.                               p--;
  440.                               GotA = FALSE;
  441.                               do {
  442.                                  if (isdigit (*p) || GotA == TRUE) {
  443.                                     if (*p == '9') {
  444.                                        GotA = TRUE;
  445.                                        *p = 'A';
  446.                                     }
  447.                                     else
  448.                                        *p = (char)(*p + 1);
  449.                                  }
  450.                                  else
  451.                                     *p = '0';
  452.                                  if ((fd = open (Temp, O_RDONLY|O_BINARY)) != -1)
  453.                                     close (fd);
  454.                               } while (fd != -1);
  455.                            }
  456.                         }
  457.  
  458.                         if ((fd = open (Temp, (Binary == TRUE) ? (O_WRONLY|O_BINARY|O_CREAT|O_TRUNC) : (O_WRONLY|O_TEXT|O_CREAT|O_TRUNC), S_IREAD|S_IWRITE)) != -1) {
  459.                            do {
  460.                               while (Data->BytesReady ()) {
  461.                                  Readed = Data->ReadBytes ((UCHAR *)Temp, (USHORT)sizeof (Temp));
  462.                                  write (fd, Temp, Readed);
  463.                               }
  464. #if defined(__OS2__)
  465.                               DosSleep (1L);
  466. #elif defined(__NT__)
  467.                               Sleep (1L);
  468. #endif
  469.                            } while (Data->Carrier () == TRUE);
  470.                            close (fd);
  471.                         }
  472.                      }
  473.  
  474.                      sprintf (Temp, "226 Transfer complete.\r\n");
  475.                      Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  476.                      delete Data;
  477.                   }
  478.                }
  479.                else {
  480.                   sprintf (Temp, "503 Command not implemented.\r\n");
  481.                   Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  482.                }
  483.             }
  484.          }
  485.          else if (!stricmp (p, "CWD")) {
  486.             if ((p = strtok (NULL, " ")) != NULL) {
  487.                if (User != NULL || Anonymous == TRUE) {
  488.                   if (Files != NULL) {
  489.                      if (!stricmp (p, "..")) {
  490.                         delete Files;
  491.                         Files = NULL;
  492.                         sprintf (Temp, "250 CWD command successfull.\r\n");
  493.                         strcpy (CurPath, "/");
  494.                      }
  495.                      else
  496.                         sprintf (Temp, "550 %s: no such file or directory.\r\n", p);
  497.                   }
  498.                   else {
  499.                      if ((Area = new TFileData (Cfg->SystemPath)) != NULL) {
  500.                         if (Area->Read (p) == TRUE) {
  501.                            if (Files != NULL)
  502.                               delete Files;
  503.                            if ((Files = new TFileBase (Cfg->SystemPath, Area->Key)) != NULL)
  504.                               Files->SortByName ();
  505.                            sprintf (Temp, "250 CWD command successfull.\r\n");
  506.                            strcpy (CurPath, p);
  507.                         }
  508.                         else
  509.                            sprintf (Temp, "550 %s: no such file or directory.\r\n", p);
  510.                      }
  511.                   }
  512.                   Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  513.                }
  514.                else {
  515.                   sprintf (Temp, "550 %s: no such file or directory.\r\n", p);
  516.                   Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  517.                }
  518.             }
  519.          }
  520.          else if (!stricmp (p, "CDUP")) {
  521.             if (User != NULL || Anonymous == TRUE) {
  522.                if (Files != NULL) {
  523.                   delete Files;
  524.                   Files = NULL;
  525.                   sprintf (Temp, "250 CDUP command successfull.\r\n");
  526.                   strcpy (CurPath, "/");
  527.                }
  528.                else
  529.                   sprintf (Temp, "550 %s: no such file or directory.\r\n", "..");
  530.             }
  531.             else
  532.                sprintf (Temp, "550 %s: no such file or directory.\r\n", "..");
  533.             Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  534.          }
  535.          else if (!stricmp (p, "PWD")) {
  536.             if (User != NULL || Anonymous == TRUE) {
  537.                if (Files == NULL)
  538.                   sprintf (Temp, "257 \"/\" is current directory.\r\n");
  539.                else {
  540.                   Files->First ();
  541.                   sprintf (Temp, "257 \"%s\" is current directory.\r\n", strlwr (CurPath));
  542.                }
  543.             }
  544.             else
  545.                sprintf (Temp, "257 \"/%s\" is current directory.\r\n", "outbound");
  546.             Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  547.          }
  548.          else if (!stricmp (p, "DELE")) {
  549.             if ((p = strtok (NULL, " ")) != NULL) {
  550.                if (Nodes != NULL && Outbound != NULL) {
  551.                   if (Outbound->First () == TRUE)
  552.                      do {
  553.                         if (!stricmp (Outbound->Name, p)) {
  554.                            Outbound->Remove ();
  555.                            sprintf (Temp, "250 DELE command successfull.\r\n");
  556.                            Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  557.                         }
  558.                      } while (Outbound->Next () == TRUE);
  559.                   Outbound->Update ();
  560.                }
  561.             }
  562.          }
  563.          else {
  564.             sprintf (Temp, "503 Command not implemented.\r\n");
  565.             Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  566.          }
  567.       }
  568.  
  569. #if defined(__OS2__)
  570.       DosSleep (1L);
  571. #elif defined(__NT__)
  572.       Sleep (1L);
  573. #endif
  574.    }
  575. }
  576.  
  577. USHORT TFTP::Login (VOID)
  578. {
  579.    CHAR *p, Name[48];
  580.  
  581.    Valid = FALSE;
  582.    EndRun = FALSE;
  583.    Known = Protected = FALSE;
  584.  
  585.    if (FileExist ("logo.ftp")) {
  586. #if defined(__OS2__)
  587.       sprintf (Temp, "220-%s Professional Edition for OS/2 FTP Server - Version %s\r\n", NAME, VERSION);
  588. #elif defined(__NT__)
  589.       sprintf (Temp, "220-%s Professional Edition for Win/NT FTP Server - Version %s\r\n", NAME, VERSION);
  590. #endif
  591.       Tcp->BufferBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  592.       ReadFile ("220", "logo.ftp");
  593.    }
  594.    else {
  595. #if defined(__OS2__)
  596.       sprintf (Temp, "220 %s Professional Edition for OS/2 FTP Server - Version %s\r\n", NAME, VERSION);
  597. #elif defined(__NT__)
  598.       sprintf (Temp, "220 %s Professional Edition for Win/NT FTP Server - Version %s\r\n", NAME, VERSION);
  599. #endif
  600.       Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  601.    }
  602.  
  603.    while (Tcp->Carrier () == TRUE && EndRun == FALSE) {
  604. //   while (EndRun == FALSE) {
  605.       GetCommand ();
  606.       if ((p = strtok (Response, " ")) != NULL) {
  607.          if (!stricmp (p, "USER")) {
  608.             if ((p = strtok (NULL, "")) != NULL) {
  609.                while (*p == ' ')
  610.                   p++;
  611.             }
  612.             else
  613.                p = "anonymous";
  614.  
  615.             strcpy (Name, p);
  616.             if (!stricmp (p, "anonymous")) {
  617.                sprintf (Temp, "331 Enter your e-mail address as password for anonymous\r\n");
  618.                Anonymous = TRUE;
  619.             }
  620.             else {
  621.                if (strchr (p, ':') != NULL && strchr (p, '/') != NULL) {
  622.                   Known = Protected = FALSE;
  623.                   if ((Nodes = new TNodes (Cfg->NodelistPath)) != NULL) {
  624.                      Valid = TRUE;
  625.                      Addr.Parse (p);
  626.                      if (Nodes->Read (Addr) == TRUE) {
  627.                         Known = TRUE;
  628.                         if (Nodes->SessionPwd[0] != '\0') {
  629.                            sprintf (Temp, "331 Password required for %s.\r\n", Name);
  630.                            Valid = FALSE;
  631.                         }
  632.                      }
  633.                      if (Valid == TRUE)
  634.                         EndRun = TRUE;
  635.                   }
  636.                }
  637.                else {
  638.                   if ((User = new TUser (Cfg->UserFile)) != NULL)
  639.                      User->GetData (p);
  640.                   sprintf (Temp, "331 Password required for %s.\r\n", p);
  641.                }
  642.             }
  643.             if (Valid == FALSE)
  644.                Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  645.          }
  646.          else if (!stricmp (p, "PASS")) {
  647.             if ((p = strtok (NULL, " ")) != NULL) {
  648.                if (User != NULL) {
  649.                   if (User->CheckPassword (p) == TRUE)
  650.                      Valid = TRUE;
  651.                }
  652.                else if (Nodes != NULL) {
  653.                   if (!stricmp (p, Nodes->SessionPwd)) {
  654.                      if ((Outbound = new TOutbound (Cfg->Outbound)) != NULL)
  655.                         Outbound->Add (Addr.Zone, Addr.Net, Addr.Node, Addr.Point, Addr.Domain);
  656.                      Valid = TRUE;
  657.                      Protected = TRUE;
  658.                   }
  659.                }
  660.                else if (Anonymous == TRUE)
  661.                   Valid = TRUE;
  662.             }
  663.  
  664.             if (Valid == TRUE)
  665.                EndRun = TRUE;
  666.             else {
  667.                sprintf (Temp, "530 User not logged in.\r\n");
  668.                Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  669.                if (User != NULL)
  670.                   delete User;
  671.                if (Nodes != NULL)
  672.                   delete Nodes;
  673.                Nodes = NULL;
  674.                User = NULL;
  675.             }
  676.          }
  677.          else if (!stricmp (p, "QUIT")) {
  678.             sprintf (Temp, "221 Goodbye.\r\n");
  679.             Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  680.             EndRun = TRUE;
  681.          }
  682.          else {
  683.             sprintf (Temp, "503 Command not implemented.\r\n");
  684.             Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  685.          }
  686.       }
  687.  
  688. #if defined(__OS2__)
  689.       DosSleep (1L);
  690. #elif defined(__NT__)
  691.       Sleep (1L);
  692. #endif
  693.    }
  694.  
  695.    if (Valid == TRUE) {
  696.       if (FileExist ("welcome.ftp")) {
  697.          sprintf (Temp, "230-User %s logged in.\r\n", Name);
  698.          Tcp->BufferBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  699.          ReadFile ("230", "welcome.ftp");
  700.       }
  701.       else {
  702.          sprintf (Temp, "230 User %s logged in.\r\n", Name);
  703.          Tcp->SendBytes ((UCHAR *)Temp, (USHORT)strlen (Temp));
  704.       }
  705.    }
  706.  
  707.    return (Valid);
  708. }
  709.  
  710.  
  711.  
  712.