Example #1
0
int
gftpui_common_run_ls (gftpui_callback_data * cdata)
{
    int got, matched_filespec, have_dotdot, ret;
    char *sortcol_var, *sortasds_var;
    intptr_t sortcol, sortasds;
    gftp_file * fle;

    ret = gftp_list_files (cdata->request);
    if (ret < 0)
        return (ret);

    have_dotdot = 0;
    cdata->request->gotbytes = 0;
    cdata->files = NULL;
    fle = g_malloc0 (sizeof (*fle));
    while ((got = gftp_get_next_file (cdata->request, NULL, fle)) > 0 ||
            got == GFTP_ERETRYABLE)
    {
        if (cdata->source_string == NULL)
            matched_filespec = 1;
        else
            matched_filespec = gftp_match_filespec (cdata->request, fle->file,
                                                    cdata->source_string);

        if (got < 0 || strcmp (fle->file, ".") == 0 || !matched_filespec)
        {
            gftp_file_destroy (fle, 0);
            continue;
        }
        else if (strcmp (fle->file, "..") == 0)
            have_dotdot = 1;

        cdata->request->gotbytes += got;
        cdata->files = g_list_prepend (cdata->files, fle);
        fle = g_malloc0 (sizeof (*fle));
    }
    g_free (fle);

    gftp_end_transfer (cdata->request);
    cdata->request->gotbytes = -1;

    if (!have_dotdot)
    {
        fle = g_malloc0 (sizeof (*fle));
        fle->file = g_strdup ("..");
        fle->user = g_malloc0 (1);
        fle->group = g_malloc0 (1);
        fle->st_mode = S_IFDIR | S_IRUSR | S_IWUSR | S_IXUSR;
        cdata->files = g_list_prepend (cdata->files, fle);
    }

    if (cdata->files != NULL)
    {
        if (cdata->request->protonum == GFTP_LOCAL_NUM)
        {
            sortasds_var = "local_sortasds";
            sortcol_var = "local_sortcol";
        }
        else
        {
            sortasds_var = "remote_sortasds";
            sortcol_var = "remote_sortcol";
        }

        gftp_lookup_global_option (sortcol_var, &sortcol);
        gftp_lookup_global_option (sortasds_var, &sortasds);

        cdata->files = gftp_sort_filelist (cdata->files, sortcol, sortasds);
    }

    return (1);
}
Example #2
0
int
gftp_get_next_file (gftp_request * request, const char *filespec,
                    gftp_file * fle)
{
  char *slashpos, *tmpfile, *utf8;
  size_t destlen;
  int fd, ret;

  g_return_val_if_fail (request != NULL, GFTP_EFATAL);

  if (request->get_next_file == NULL)
    return (GFTP_EFATAL);

  if (request->cached && request->cachefd > 0)
    fd = request->cachefd;
  else
    fd = request->datafd;

  memset (fle, 0, sizeof (*fle));
  do
    {
      gftp_file_destroy (fle, 0);
      ret = request->get_next_file (request, fle, fd);
      if (fle->file != NULL && (slashpos = strrchr (fle->file, '/')) != NULL)
        {
          if (*(slashpos + 1) == '\0')
            {
              gftp_file_destroy (fle, 0);
              continue;
            }

          *slashpos = '\0';
          tmpfile = g_strdup (slashpos + 1);

          if (strcmp (fle->file, request->directory) != 0)
            request->logging_function (gftp_logging_error, request,
                                       _("Warning: Stripping path off of file '%s'. The stripped path (%s) doesn't match the current directory (%s)\n"),
                                       tmpfile, fle->file, request->directory,
                                       g_strerror (errno));
          
          g_free (fle->file);
          fle->file = tmpfile;
        }

      if (ret >= 0 && fle->file != NULL)
        {
          if (g_utf8_validate (fle->file, -1, NULL))
            fle->filename_utf8_encoded = 1;
          else
            {
              utf8 = gftp_filename_to_utf8 (request, fle->file, &destlen);
              if (utf8 != NULL)
                {
                  g_free (fle->file);
                  fle->file = utf8;
                  fle->filename_utf8_encoded = 1;
                }
            }
        }

      if (ret >= 0 && !request->cached && request->cachefd > 0 && 
          request->last_dir_entry != NULL)
        {
          if (gftp_fd_write (request, request->last_dir_entry,
                          request->last_dir_entry_len, request->cachefd) < 0)
            {
              request->logging_function (gftp_logging_error, request,
                                        _("Error: Cannot write to cache: %s\n"),
                                        g_strerror (errno));
              close (request->cachefd);
              request->cachefd = -1;
            }
        }
    } while (ret > 0 && !gftp_match_filespec (request, fle->file, filespec));

  return (ret);
}