Справочник по консольным командам Toybox для Android 12


  Ver.0.8.4     Ver.0.8.9     Pending  

Путь: Toys/Net, команды версии: Ver.4     Ver.9

Комментарии в файле ftpget.c :

Команд: 2


ftpget

usage: ftpget [-cvgslLmMdD] [-P PORT] [-p PASSWORD] [-u USER] HOST [LOCAL] REMOTE

Поговорите с ftp-сервером. По умолчанию получить УДАЛЕННЫЙ файл через пассивный анонимный перенос, при желании сохраняя под ЛОКАЛЬНЫМ именем. Также можно отправить, перечислить и т.д.
  • -c Продолжить частичную передачу
  • -p Используйте ПОРТ вместо «21»
  • -P Используйте ПАРОЛЬ вместо «ftpget@»
  • -u Используйте ПОЛЬЗОВАТЕЛЬ вместо «анонимный»
  • -v Подробно Способы взаимодействия с FTP-сервером:
  • -d Удалить файл
  • -D Удалить каталог
  • -g Получить файл (по умолчанию) Список -l каталогов
  • -L Список (только имена файлов)
  • -m Переместить файл на сервере с ЛОКАЛЬНОГО на УДАЛЕННЫЙ
  • -M mkdir
  • -s Отправить файл

  • usage: ftpget [-cvgslLmMdD] [-P PORT] [-p PASSWORD] [-u USER] HOST [LOCAL] REMOTE

    Talk to ftp server. By default get REMOTE file via passive anonymous transfer, optionally saving under a LOCAL name. Can also send, list, etc.
  • -c Continue partial transfer
  • -p Use PORT instead of "21"
  • -P Use PASSWORD instead of "ftpget@"
  • -u Use USER instead of "anonymous"
  • -v Verbose Ways to interact with FTP server:
  • -d Delete file
  • -D Remove directory
  • -g Get file (default)
  • -l List directory
  • -L List (filenames only)
  • -m Move file on server from LOCAL to REMOTE
  • -M mkdir
  • -s Send file

  • ftpput

    FTPget, который по умолчанию имеет значение -s вместо -g.


    An ftpget that defaults to -s instead of -g


    Исходный текст в файле ftpget.c

    #define FOR_ftpget
    #include "toys.h"
    
    GLOBALS(
      char *u, *p, *P;
    
      int fd;
    )
    
    // we should get one line of data, but it may be in multiple chunks
    static int xread2line(int fd, char *buf, int len)
    {
      int i, total = 0;
    
      len--;
      while (total<len && (i = xread(fd, buf, len-total))) {
        total += i;
        if (buf[total-1] == '\n') break;
      }
      if (total>=len) error_exit("overflow");
      while (total--)
        if (buf[total]=='\r' || buf[total]=='\n') buf[total] = 0;
        else break;
      if (toys.optflags & FLAG_v) fprintf(stderr, "%s\n", toybuf);
    
      return total+1;
    }
    
    static int ftp_line(char *cmd, char *arg, int must)
    {
      int rc = 0;
    
      if (cmd) {
        char *s = "%s %s\r\n"+3*(!arg);
        if (toys.optflags & FLAG_v) fprintf(stderr, s, cmd, arg);
        dprintf(TT.fd, s, cmd, arg);
      }
      if (must>=0) {
        xread2line(TT.fd, toybuf, sizeof(toybuf));
        if (!sscanf(toybuf, "%d", &rc) || (must && rc != must))
          error_exit_raw(toybuf);
      }
    
      return rc;
    }
    
    void ftpget_main(void)
    {
      struct sockaddr_in6 si6;
      int rc, ii = 1, port = 0;
      socklen_t sl = sizeof(si6);
      char *s, *remote = toys.optargs[2];
      unsigned long long lenl = 0, lenr;
    
      if (!(toys.optflags&(FLAG_v-1)))
        toys.optflags |= (toys.which->name[3]=='g') ? FLAG_g : FLAG_s;
    
      if (!TT.u) TT.u = "anonymous";
      if (!TT.P) TT.P = "ftpget@";
      if (!TT.p) TT.p = "21";
      if (!remote) remote = toys.optargs[1];
    
      // connect
      TT.fd = xconnectany(xgetaddrinfo(*toys.optargs, TT.p, 0, SOCK_STREAM, 0,
        AI_ADDRCONFIG));
      if (getpeername(TT.fd, (void *)&si6, &sl)) perror_exit("getpeername");
    
      // Login
      ftp_line(0, 0, 220);
      rc = ftp_line("USER", TT.u, 0);
      if (rc == 331) rc = ftp_line("PASS", TT.P, 0);
      if (rc != 230) error_exit_raw(toybuf);
    
      if (toys.optflags & FLAG_m) {
        if (toys.optc != 3) error_exit("-m FROM TO");
        ftp_line("RNFR", toys.optargs[1], 350);
        ftp_line("RNTO", toys.optargs[2], 250);
      } else if (toys.optflags & FLAG_M) ftp_line("MKD", toys.optargs[1], 257);
      else if (toys.optflags & FLAG_d) ftp_line("DELE", toys.optargs[1], 250);
      else if (toys.optflags & FLAG_D) ftp_line("RMD", toys.optargs[1], 250);
      else {
        int get = !(toys.optflags&FLAG_s), cnt = toys.optflags&FLAG_c;
        char *cmd;
    
        // Only do passive binary transfers
        ftp_line("TYPE", "I", 0);
        rc = ftp_line("PASV", 0, 0);
    
        // PASV means the server opens a port you connect to instead of the server
        // dialing back to the client. (Still insane, but less so.) So need port #
    
        // PASV output is "227 PASV ok (x,x,x,x,p1,p2)" where x,x,x,x is the IP addr
        // (must match the server you're talking to???) and port is (256*p1)+p2
        s = 0;
        if (rc==227) for (s = toybuf; (s = strchr(s, ',')); s++) {
          int p1, got = 0;
    
          sscanf(s, ",%u,%u)%n", &p1, &port, &got);
          if (!got) continue;
          port += 256*p1;
          break;
        }
        if (!s || port<1 || port>65535) error_exit_raw(toybuf);
        si6.sin6_port = SWAP_BE16(port); // same field size/offset for v4 and v6
        port = xsocket(si6.sin6_family, SOCK_STREAM, 0);
        xconnect(port, (void *)&si6, sizeof(si6));
    
        // RETR blocks until file data read from data port, so use SIZE to check
        // if file exists before creating local copy
        lenr = 0;
        if (toys.optflags&(FLAG_s|FLAG_g)) {
          if (ftp_line("SIZE", remote, 0) == 213)
            sscanf(toybuf, "%*u %llu", &lenr);
          else if (get) error_exit("no %s", remote);
        }
    
        // Open file for reading or writing
        if (toys.optflags & (FLAG_g|FLAG_s)) {
          if (strcmp(toys.optargs[1], "-"))
            ii = xcreate(toys.optargs[1],
              get ? (cnt ? O_APPEND : O_TRUNC)|O_CREAT|O_WRONLY : O_RDONLY, 0666);
          lenl = fdlength(ii);
        }
        if (get) {
          cmd = "RETR";
          if (toys.optflags&FLAG_l) cmd = "LIST";
          if (toys.optflags&FLAG_L) cmd = "NLST";
          if (cnt) {
            char buf[32];
    
            if (lenl>=lenr) goto done;
            sprintf(buf, "%llu", lenl);
            ftp_line("REST", buf, 350);
          } else lenl = 0;
    
          ftp_line(cmd, remote, -1);
          lenl += xsendfile(port, ii);
          ftp_line(0, 0, (toys.optflags&FLAG_g) ? 226 : 150);
        } else if (toys.optflags & FLAG_s) {
          cmd = "STOR";
          if (cnt && lenr) {
            cmd = "APPE";
            xlseek(ii, lenl, SEEK_SET);
          } else lenr = 0;
          ftp_line(cmd, remote, 150);
          lenr += xsendfile(ii, port);
          close(port);
        }
        if (toys.optflags&(FLAG_g|FLAG_s))
          if (lenl != lenr) error_exit("short %lld/%lld", lenl, lenr);
      }
      ftp_line("QUIT", 0, 0);
    
    done:
      if (CFG_TOYBOX_FREE) {
        if (ii!=1) xclose(ii);
        xclose(port);
        xclose(TT.fd);
      }
    }