home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / ncftp-2.3.0-base.tgz / ncftp-2.3.0-base.tar / contrib / ncftp / Find.c < prev    next >
C/C++ Source or Header  |  1995-05-22  |  2KB  |  91 lines

  1. /* Find.c */
  2.  
  3. #include "Sys.h"
  4.  
  5. #include "Util.h"
  6. #include "RCmd.h"
  7. #include "Xfer.h"
  8. #include "Cmds.h"
  9. #include "Get.h"
  10. #include "Find.h"
  11.  
  12. extern longstring gPager;
  13. extern int gTransferType;
  14. extern int gStdout;
  15. extern gWinInit;
  16.  
  17. /* This is supposed to implement the Funet FTP Daemon's "FIND" command.
  18.  * Unfortunately it doesn't work for a couple of reasons.
  19.  *
  20.  * First, it wants to use the data connection, which is fine, but it doesn't
  21.  * send us a 100-level preliminary reply like the other data transfer
  22.  * FTP commands do.
  23.  *
  24.  * Second, since the remote server has to do additional processing, data
  25.  * isn't written to the data connection right away.  This is a problem
  26.  * because NcFTP will timeout upon inactivity.
  27.  *
  28.  * I did an experiment, which got around these two problems, but it still
  29.  * doesn't work well at all.  The find command will be listed as a
  30.  * hidden command for now.
  31.  */
  32.  
  33. int AsciiFind(char *pattern, int outfile)
  34. {
  35.     int result;
  36.     XferSpecPtr xp;
  37.  
  38.     /* We do all finds in ascii mode for now. */
  39.     SETASCII;
  40.     
  41.     /* Setup the parameter block to give to RDataCmd. */
  42.     xp = InitXferSpec();
  43.     xp->netMode = kNetReading;
  44.     xp->getBlock = AsciiGetRemoteProc;
  45.     xp->putBlock = AsciiPutLocalProc;
  46.     xp->outStream = outfile;
  47.  
  48.     /* Send the request and do the transfer.  It really is a transfer
  49.      * since we use the data port.
  50.      */
  51.     result = RDataCmd(xp, "FIND %s", pattern);
  52.     DoneWithXferSpec(xp);
  53.  
  54.     return (result);
  55. }    /* AsciiFind */
  56.  
  57.  
  58.  
  59.  
  60. /* Ask server to look for something. */
  61. int FindCmd(int argc, char **argv)
  62. {
  63.     FILE *fp;
  64.     int fd;
  65.     int result;
  66.     int usingPager;
  67.  
  68.     /* We will use the pager automatically if not in visual mode. */
  69.     if ((!gWinInit) || (gPager[0] == '\0')) {
  70.         fd = gStdout;
  71.         usingPager = 0;
  72.     } else {
  73.         fp = POpen(gPager, "w", 1);
  74.         if (fp == NULL) {
  75.             RestoreScreen(0);
  76.             Error(kDoPerror, "Could not run %s.\n", gPager);
  77.             return (kCmdErr);
  78.         }
  79.         fd = fileno(fp);
  80.         usingPager = 1;
  81.     }
  82.  
  83.     result = AsciiFind(argv[1], fd);
  84.  
  85.     if (usingPager) {
  86.         (void) PClose(fp);
  87.         RestoreScreen(1);
  88.     }
  89.     return (result);
  90. }    /* FindCmd */
  91.