static int local_getcwd (gftp_request * request) { char tempstr[PATH_MAX], *utf8; size_t destlen; if (request->directory != NULL) g_free (request->directory); if (getcwd (tempstr, sizeof (tempstr)) == NULL) { request->logging_function (gftp_logging_error, request, _("Could not get current working directory: %s\n"), g_strerror (errno)); request->directory = NULL; return (GFTP_ERETRYABLE); } utf8 = gftp_filename_to_utf8 (request, tempstr, &destlen); if (utf8 != NULL) request->directory = utf8; else request->directory = g_strdup (tempstr); return (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); }