]> granicus.if.org Git - curl/commitdiff
re-arranged the cwd/mkd stuff a bit
authorDaniel Stenberg <daniel@haxx.se>
Fri, 8 Aug 2003 09:55:16 +0000 (09:55 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 8 Aug 2003 09:55:16 +0000 (09:55 +0000)
lib/ftp.c

index 8d40a8c20e538ba32a3990eae9d08f23922ae4e2..52edd176319fb3d49ba62f54fa61e170128375bd 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -729,36 +729,6 @@ CURLcode ftp_sendquote(struct connectdata *conn, struct curl_slist *quote)
   return CURLE_OK;
 }
 
-/***********************************************************************
- *
- * ftp_cwd()
- *
- * Send 'CWD' to the remote server to Change Working Directory.
- * It is the ftp version of the unix 'cd' command.
- */
-static 
-CURLcode ftp_cwd(struct connectdata *conn, char *path)
-{
-  ssize_t nread;
-  int     ftpcode;
-  CURLcode result;
-  
-  FTPSENDF(conn, "CWD %s", path);
-  result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
-  if (result)
-    return result;
-
-  /* According to RFC959, CWD is supposed to return 250 on success, but
-     there seem to be non-compliant FTP servers out there that return 200,
-     so we accept any '2xy' code here. */
-  if (ftpcode/100 != 2) {
-    failf(conn->data, "Couldn't cd to %s", path);
-    return CURLE_FTP_ACCESS_DENIED;
-  }
-
-  return CURLE_OK;
-}
-
 /***********************************************************************
  *
  * ftp_getfiletime()
@@ -2340,6 +2310,8 @@ CURLcode Curl_ftp_disconnect(struct connectdata *conn)
  * ftp_mkd()
  *
  * Makes a directory on the FTP server.
+ *
+ * Calls failf()
  */
 CURLcode ftp_mkd(struct connectdata *conn, char *path)
 {
@@ -2357,33 +2329,73 @@ CURLcode ftp_mkd(struct connectdata *conn, char *path)
   switch(ftpcode) {
   case 257:
     /* success! */
-    infof( conn->data , "Created Remote Directory %s\n" , path );
+    infof( conn->data , "Created remote directory %s\n" , path );
+    break;
+  case 550:
+    failf(conn->data, "Permission denied to make directory %s", path);
+    result = CURLE_FTP_ACCESS_DENIED;
     break;
   default:
-    infof(conn->data, "unrecognized MKD response %d\n", result );
-    result = ~CURLE_OK;
+    failf(conn->data, "unrecognized MKD response: %d", ftpcode );
+    result = CURLE_FTP_ACCESS_DENIED;
     break;
   }
   return  result;
 }
 
+/***********************************************************************
+ *
+ * ftp_cwd()
+ *
+ * Send 'CWD' to the remote server to Change Working Directory.  It is the ftp
+ * version of the unix 'cd' command. This function is only called from the
+ * cwd_and_mkd() function these days.
+ *
+ * This function does NOT call failf().
+ */
+static 
+CURLcode ftp_cwd(struct connectdata *conn, char *path)
+{
+  ssize_t nread;
+  int     ftpcode;
+  CURLcode result;
+  
+  FTPSENDF(conn, "CWD %s", path);
+  result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
+  if (!result) {
+    /* According to RFC959, CWD is supposed to return 250 on success, but
+       there seem to be non-compliant FTP servers out there that return 200,
+       so we accept any '2xy' code here. */
+    if (ftpcode/100 != 2)
+      result = CURLE_FTP_ACCESS_DENIED;
+  }
+
+  return result;
+}
+
 /***********************************************************************
  *
  * ftp_cwd_and_mkd()
  *
  * Change to the given directory.  If the directory is not present, and we
  * have been told to allow it, then create the directory and cd to it.
+ *
  */
 static CURLcode cwd_and_mkd(struct connectdata *conn, char *path)
 {
   CURLcode result;
   
   result = ftp_cwd(conn, path);
-  if ((CURLE_OK != result) && conn->data->set.ftp_create_missing_dirs) {
-    result = ftp_mkd(conn, path);
-    if ( CURLE_OK != result)
-      return result;
-    result = ftp_cwd(conn, path);
+  if (result) {
+    if(conn->data->set.ftp_create_missing_dirs) {
+      result = ftp_mkd(conn, path);
+      if (result)
+        /* ftp_mkd() calls failf() itself */
+        return result;
+      result = ftp_cwd(conn, path);
+    }
+    if(result)
+      failf(conn->data, "Couldn't cd to %s", path);
   }
   return result;
 }