+/* Sends the LIST command to the server. If FILE is NULL, send just
+ `LIST' (no space). */
+uerr_t
+ftp_list (int csock, const char *file, enum stype rs)
+{
+ char *request, *respline;
+ int nwritten;
+ uerr_t err;
+ bool ok = false;
+ size_t i = 0;
+ /* Try `LIST -a' first and revert to `LIST' in case of failure. */
+ const char *list_commands[] = { "LIST -a",
+ "LIST" };
+
+ /* 2008-01-29 SMS. For a VMS FTP server, where "LIST -a" may not
+ fail, but will never do what is desired here, skip directly to the
+ simple "LIST" command (assumed to be the last one in the list).
+ */
+ if (rs == ST_VMS)
+ i = countof (list_commands)- 1;
+
+ do {
+ /* Send request. */
+ request = ftp_request (list_commands[i], file);
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ return WRITEFAILED;
+ }
+ xfree (request);
+ /* Get appropriate response. */
+ err = ftp_response (csock, &respline);
+ if (err == FTPOK)
+ {
+ if (*respline == '5')
+ {
+ err = FTPNSFOD;
+ }
+ else if (*respline == '1')
+ {
+ err = FTPOK;
+ ok = true;
+ }
+ else
+ {
+ err = FTPRERR;
+ }
+ xfree (respline);
+ }
+ ++i;
+ } while (i < countof (list_commands) && !ok);
+
+ return err;
+}
+