static int copyfile (char *source, char *dest) { int srcfd, destfd; char buf[8192]; ssize_t n; if ((srcfd = gftp_fd_open (NULL, source, O_RDONLY, 0)) == -1) { printf (_("Error: Cannot open local file %s: %s\n"), source, g_strerror (errno)); exit (EXIT_FAILURE); } if ((destfd = gftp_fd_open (NULL, dest, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1) { printf (_("Error: Cannot open local file %s: %s\n"), dest, g_strerror (errno)); close (srcfd); exit (EXIT_FAILURE); } while ((n = read (srcfd, buf, sizeof (buf))) > 0) { if (write (destfd, buf, n) == -1) { printf (_("Error: Could not write to socket: %s\n"), g_strerror (errno)); exit (EXIT_FAILURE); } } if (n == -1) { printf (_("Error: Could not read from socket: %s\n"), g_strerror (errno)); exit (EXIT_FAILURE); } if (close (srcfd) == -1) { printf (_("Error closing file descriptor: %s\n"), g_strerror (errno)); exit (EXIT_FAILURE); } if (close (destfd) == -1) { printf (_("Error closing file descriptor: %s\n"), g_strerror (errno)); exit (EXIT_FAILURE); } return (1); }
static int local_put_file (gftp_request * request, const char *filename, off_t startsize, off_t totalsize) { int flags, perms; size_t destlen; char *utf8; g_return_val_if_fail (request != NULL, GFTP_EFATAL); g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL); g_return_val_if_fail (filename != NULL, GFTP_EFATAL); flags = O_WRONLY | O_CREAT; if (startsize > 0) flags |= O_APPEND; #if defined (_LARGEFILE_SOURCE) && defined (O_LARGEFILE) flags |= O_LARGEFILE; #endif perms = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; utf8 = gftp_filename_from_utf8 (request, filename, &destlen); if (utf8 != NULL) { request->datafd = gftp_fd_open (request, utf8, flags, perms); g_free (utf8); } else request->datafd = gftp_fd_open (request, filename, flags, perms); if (request->datafd == -1) return (GFTP_ERETRYABLE); if (ftruncate (request->datafd, startsize) == -1) { request->logging_function (gftp_logging_error, request, _("Error: Cannot truncate local file %s: %s\n"), filename, g_strerror (errno)); gftp_disconnect (request); return (GFTP_ERETRYABLE); } if (lseek (request->datafd, startsize, SEEK_SET) == -1) { request->logging_function (gftp_logging_error, request, _("Error: Cannot seek on file %s: %s\n"), filename, g_strerror (errno)); gftp_disconnect (request); return (GFTP_ERETRYABLE); } return (0); }
static off_t local_get_file (gftp_request * request, const char *filename, off_t startsize) { size_t destlen; char *utf8; off_t size; int flags; g_return_val_if_fail (request != NULL, GFTP_EFATAL); g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL); g_return_val_if_fail (filename != NULL, GFTP_EFATAL); flags = O_RDONLY; #if defined (_LARGEFILE_SOURCE) && defined (O_LARGEFILE) flags |= O_LARGEFILE; #endif utf8 = gftp_filename_from_utf8 (request, filename, &destlen); if (utf8 != NULL) { request->datafd = gftp_fd_open (request, utf8, flags, 0); g_free (utf8); } else request->datafd = gftp_fd_open (request, filename, flags, 0); if (request->datafd == -1) return (GFTP_ERETRYABLE); if ((size = lseek (request->datafd, 0, SEEK_END)) == -1) { request->logging_function (gftp_logging_error, request, _("Error: Cannot seek on file %s: %s\n"), filename, g_strerror (errno)); gftp_disconnect (request); return (GFTP_ERETRYABLE); } if (lseek (request->datafd, startsize, SEEK_SET) == -1) { request->logging_function (gftp_logging_error, request, _("Error: Cannot seek on file %s: %s\n"), filename, g_strerror (errno)); gftp_disconnect (request); return (GFTP_ERETRYABLE); } return (size); }