home *** CD-ROM | disk | FTP | other *** search
/ ftp.ncftp.com / ftp.ncftp.com.zip / ftp.ncftp.com / ncftp / older_versions / ncftp-3.2.2-src.tar.bz2 / ncftp-3.2.2-src.tar / ncftp-3.2.2 / libncftp / c_mlist1.c < prev    next >
C/C++ Source or Header  |  2005-01-01  |  3KB  |  140 lines

  1. /* c_mlist1.c
  2.  *
  3.  * Copyright (c) 1996-2005 Mike Gleason, NcFTP Software.
  4.  * All rights reserved.
  5.  *
  6.  */
  7.  
  8. #include "syshdrs.h"
  9. #ifdef PRAGMA_HDRSTOP
  10. #    pragma hdrstop
  11. #endif
  12.  
  13. void
  14. FTPRequestMlsOptions(const FTPCIPtr cip)
  15. {
  16.     int f;
  17.     char optstr[128];
  18.     size_t optstrlen;
  19.  
  20.     if (cip->usedMLS == 0) {
  21.         /* First MLSD/MLST ? */
  22.         cip->usedMLS = 1;
  23.  
  24.         f = cip->mlsFeatures & kPreferredMlsOpts;
  25.         optstr[0] = '\0';
  26.  
  27.         /* TYPE */
  28.         if ((f & kMlsOptType) != 0) {
  29.             STRNCAT(optstr, "type;");
  30.         }
  31.  
  32.         /* SIZE */
  33.         if ((f & kMlsOptSize) != 0) {
  34.             STRNCAT(optstr, "size;");
  35.         }
  36.  
  37.         /* MODTIME */
  38.         if ((f & kMlsOptModify) != 0) {
  39.             STRNCAT(optstr, "modify;");
  40.         }
  41.  
  42.         /* MODE */
  43.         if ((f & kMlsOptUNIXmode) != 0) {
  44.             STRNCAT(optstr, "UNIX.mode;");
  45.         }
  46.  
  47.         /* PERM */
  48.         if ((f & kMlsOptPerm) != 0) {
  49.             STRNCAT(optstr, "perm;");
  50.         }
  51.  
  52.         /* OWNER */
  53.         if ((f & kMlsOptUNIXowner) != 0) {
  54.             STRNCAT(optstr, "UNIX.owner;");
  55.         }
  56.  
  57.         /* UID */
  58.         if ((f & kMlsOptUNIXuid) != 0) {
  59.             STRNCAT(optstr, "UNIX.uid;");
  60.         }
  61.  
  62.         /* GROUP */
  63.         if ((f & kMlsOptUNIXgroup) != 0) {
  64.             STRNCAT(optstr, "UNIX.group;");
  65.         }
  66.  
  67.         /* GID */
  68.         if ((f & kMlsOptUNIXgid) != 0) {
  69.             STRNCAT(optstr, "UNIX.gid;");
  70.         }
  71.  
  72.         /* UNIQUE */
  73.         if ((f & kMlsOptUnique) != 0) {
  74.             STRNCAT(optstr, "unique;");
  75.         }
  76.  
  77.         /* Tell the server what we prefer. */
  78.         optstrlen = strlen(optstr);
  79.         if (optstrlen != 0)
  80.             (void) FTPCmd(cip, "OPTS MLST %s", optstr);
  81.     }
  82. }    /* FTPRequestMlsOptions */
  83.  
  84.  
  85.  
  86.  
  87. int
  88. FTPMListOneFile(const FTPCIPtr cip, const char *const file, const MLstItemPtr mlip)
  89. {
  90.     int result;
  91.     ResponsePtr rp;
  92.  
  93.     /* We do a special check for older versions of NcFTPd which
  94.      * are based off of an incompatible previous version of IETF
  95.      * extensions.
  96.      *
  97.      * Roxen also seems to be way outdated, where MLST was on the
  98.      * data connection among other things.
  99.      *
  100.      */
  101.     if (
  102.         (cip->hasMLST == kCommandNotAvailable) ||
  103.         ((cip->serverType == kServerTypeNcFTPd) && (cip->ietfCompatLevel < 19981201)) ||
  104.         (cip->serverType == kServerTypeRoxen)
  105.     ) {
  106.         cip->errNo = kErrMLSTNotAvailable;
  107.         return (cip->errNo);
  108.     }
  109.  
  110.     rp = InitResponse();
  111.     if (rp == NULL) {
  112.         result = cip->errNo = kErrMallocFailed;
  113.         FTPLogError(cip, kDontPerror, "Malloc failed.\n");
  114.     } else {
  115.         FTPRequestMlsOptions(cip);
  116.         result = RCmd(cip, rp, "MLST %s", file);
  117.         if (
  118.             (result == 2) &&
  119.             (rp->msg.first->line != NULL) &&
  120.             (rp->msg.first->next != NULL) &&
  121.             (rp->msg.first->next->line != NULL)
  122.         ) {
  123.             result = UnMlsT(cip, rp->msg.first->next->line, mlip);
  124.             if (result < 0) {
  125.                 cip->errNo = result = kErrInvalidMLSTResponse;
  126.             }
  127.         } else if (FTP_UNIMPLEMENTED_CMD(rp->code)) {
  128.             cip->hasMLST = kCommandNotAvailable;
  129.             cip->errNo = kErrMLSTNotAvailable;
  130.             result = kErrMLSTNotAvailable;
  131.         } else {
  132.             cip->errNo = kErrMLSTFailed;
  133.             result = kErrMLSTFailed;
  134.         }
  135.         DoneWithResponse(cip, rp);
  136.     }
  137.  
  138.     return (result);
  139. }    /* FTPMListOneFile */
  140.