ports/filesystems/curlftpfs/files/patch-ftpfs.c
Robert Clausecker 6e2da9672f filesystems: add new category for file systems and related utilities
The filesystems category houses file systems and file system utilities.
It is added mainly to turn the sysutils/fusefs-* pseudo-category into
a proper one, but is also useful for the sundry of other file systems
related ports found in the tree.

Ports that seem like they belong there are moved to the new category.
Two ports, sysutils/fusefs-funionfs and sysutils/fusefs-fusepak are
not moved as they currently don't fetch and don't have TIMESTAMP set
in their distinfo, but that is required to be able to push a rename
of the port by the pre-receive hook.

Approved by:	portmgr (rene)
Reviewed by:	mat
Pull Request:	https://github.com/freebsd/freebsd-ports/pull/302
PR:		281988
2024-11-06 16:17:35 +01:00

304 lines
12 KiB
C

--- ftpfs.c.orig 2008-04-29 23:05:47 UTC
+++ ftpfs.c
@@ -257,6 +257,7 @@ static int ftpfs_getdir(const char* path, fuse_cache_d
int err = 0;
CURLcode curl_res;
char* dir_path = get_fulldir_path(path);
+ char* dir_path_uri = path_to_uri(dir_path);
DEBUG(1, "ftpfs_getdir: %s\n", dir_path);
struct buffer buf;
@@ -264,7 +265,7 @@ static int ftpfs_getdir(const char* path, fuse_cache_d
pthread_mutex_lock(&ftpfs.lock);
cancel_previous_multi();
- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, dir_path);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, dir_path_uri);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
curl_res = curl_easy_perform(ftpfs.connection);
pthread_mutex_unlock(&ftpfs.lock);
@@ -278,6 +279,7 @@ static int ftpfs_getdir(const char* path, fuse_cache_d
NULL, NULL, NULL, 0, h, filler);
}
+ free_uri(dir_path_uri);
free(dir_path);
buf_free(&buf);
return op_return(err, "ftpfs_getdir");
@@ -287,6 +289,7 @@ static int ftpfs_getattr(const char* path, struct stat
int err;
CURLcode curl_res;
char* dir_path = get_dir_path(path);
+ char* dir_path_uri = path_to_uri(dir_path);
DEBUG(2, "ftpfs_getattr: %s dir_path=%s\n", path, dir_path);
struct buffer buf;
@@ -294,7 +297,7 @@ static int ftpfs_getattr(const char* path, struct stat
pthread_mutex_lock(&ftpfs.lock);
cancel_previous_multi();
- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, dir_path);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, dir_path_uri);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
curl_res = curl_easy_perform(ftpfs.connection);
pthread_mutex_unlock(&ftpfs.lock);
@@ -309,6 +312,7 @@ static int ftpfs_getattr(const char* path, struct stat
err = parse_dir((char*)buf.p, dir_path + strlen(ftpfs.host) - 1,
name, sbuf, NULL, 0, NULL, NULL);
+ free_uri(dir_path_uri);
free(dir_path);
buf_free(&buf);
if (err) return op_return(-ENOENT, "ftpfs_getattr");
@@ -329,6 +333,7 @@ static size_t ftpfs_read_chunk(const char* full_path,
int running_handles = 0;
int err = 0;
struct ftpfs_file* fh = get_ftpfs_file(fi);
+ char* full_path_uri = path_to_uri(full_path); /* TODO: optimize bu pushing up conversion to context */
DEBUG(2, "ftpfs_read_chunk: %s %p %zu %lld %p %p\n",
full_path, rbuf, size, offset, fi, fh);
@@ -355,7 +360,7 @@ static size_t ftpfs_read_chunk(const char* full_path,
cancel_previous_multi();
- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &fh->buf);
if (offset) {
char range[15];
@@ -444,6 +449,7 @@ static size_t ftpfs_read_chunk(const char* full_path,
pthread_mutex_unlock(&ftpfs.lock);
+ free_uri(full_path_uri);
if (err) return CURLFTPFS_BAD_READ;
return size;
}
@@ -497,11 +503,12 @@ int write_thread_ctr = 0;
static void *ftpfs_write_thread(void *data) {
struct ftpfs_file *fh = data;
char range[15];
-
+ char* full_path_uri = path_to_uri(fh->full_path); /* TODO: optimize bu pushing up conversion to context */
+
DEBUG(2, "enter streaming write thread #%d path=%s pos=%lld\n", ++write_thread_ctr, fh->full_path, fh->pos);
- curl_easy_setopt_or_die(fh->write_conn, CURLOPT_URL, fh->full_path);
+ curl_easy_setopt_or_die(fh->write_conn, CURLOPT_URL, full_path_uri);
curl_easy_setopt_or_die(fh->write_conn, CURLOPT_UPLOAD, 1);
curl_easy_setopt_or_die(fh->write_conn, CURLOPT_INFILESIZE, -1);
curl_easy_setopt_or_die(fh->write_conn, CURLOPT_READFUNCTION, write_data_bg);
@@ -541,6 +548,8 @@ static void *ftpfs_write_thread(void *data) {
sem_post(&fh->data_written); /* ftpfs_write may return */
+ free_uri(full_path_uri);
+
return NULL;
}
@@ -619,16 +628,19 @@ static void free_ftpfs_file(struct ftpfs_file *fh) {
}
static int buffer_file(struct ftpfs_file *fh) {
+ char* full_path_uri = path_to_uri(fh->full_path); /* TODO: optimize bu pushing up conversion to context */
// If we want to write to the file, we have to load it all at once,
// modify it in memory and then upload it as a whole as most FTP servers
// don't support resume for uploads.
pthread_mutex_lock(&ftpfs.lock);
cancel_previous_multi();
- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, fh->full_path);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &fh->buf);
CURLcode curl_res = curl_easy_perform(ftpfs.connection);
pthread_mutex_unlock(&ftpfs.lock);
+ free_uri(full_path_uri);
+
if (curl_res != 0) {
return -EACCES;
}
@@ -641,10 +653,11 @@ static int create_empty_file(const char * path)
int err = 0;
char *full_path = get_full_path(path);
+ char* full_path_uri = path_to_uri(full_path);
pthread_mutex_lock(&ftpfs.lock);
cancel_previous_multi();
- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_INFILESIZE, 0);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_UPLOAD, 1);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_READDATA, NULL);
@@ -654,7 +667,9 @@ static int create_empty_file(const char * path)
if (curl_res != 0) {
err = -EPERM;
- }
+ }
+
+ free_uri(full_path_uri);
free(full_path);
return err;
}
@@ -873,6 +888,7 @@ static int ftpfs_chmod(const char* path, mode_t mode)
struct curl_slist* header = NULL;
char* full_path = get_dir_path(path);
+ char* full_path_uri = path_to_uri(full_path);
char* filename = get_file_name(path);
char* cmd = g_strdup_printf("SITE CHMOD %.3o %s", mode_c, filename);
struct buffer buf;
@@ -883,7 +899,7 @@ static int ftpfs_chmod(const char* path, mode_t mode)
pthread_mutex_lock(&ftpfs.lock);
cancel_previous_multi();
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_POSTQUOTE, header);
- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_NOBODY, ftpfs.safe_nobody);
CURLcode curl_res = curl_easy_perform(ftpfs.connection);
@@ -894,12 +910,13 @@ static int ftpfs_chmod(const char* path, mode_t mode)
if (curl_res != 0) {
err = -EPERM;
}
-
+
buf_free(&buf);
curl_slist_free_all(header);
+ free_uri(full_path_uri);
free(full_path);
free(filename);
- free(cmd);
+ free(cmd);
return op_return(err, "ftpfs_chmod");
}
@@ -910,6 +927,7 @@ static int ftpfs_chown(const char* path, uid_t uid, gi
struct curl_slist* header = NULL;
char* full_path = get_dir_path(path);
+ char* full_path_uri = path_to_uri(full_path);
char* filename = get_file_name(path);
char* cmd = g_strdup_printf("SITE CHUID %i %s", uid, filename);
char* cmd2 = g_strdup_printf("SITE CHGID %i %s", gid, filename);
@@ -922,7 +940,7 @@ static int ftpfs_chown(const char* path, uid_t uid, gi
pthread_mutex_lock(&ftpfs.lock);
cancel_previous_multi();
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_POSTQUOTE, header);
- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_NOBODY, ftpfs.safe_nobody);
CURLcode curl_res = curl_easy_perform(ftpfs.connection);
@@ -936,6 +954,7 @@ static int ftpfs_chown(const char* path, uid_t uid, gi
buf_free(&buf);
curl_slist_free_all(header);
+ free_uri(full_path_uri);
free(full_path);
free(filename);
free(cmd);
@@ -999,6 +1018,7 @@ static int ftpfs_rmdir(const char* path) {
int err = 0;
struct curl_slist* header = NULL;
char* full_path = get_dir_path(path);
+ char* full_path_uri = path_to_uri(full_path);
char* filename = get_file_name(path);
char* cmd = g_strdup_printf("RMD %s", filename);
struct buffer buf;
@@ -1012,7 +1032,7 @@ static int ftpfs_rmdir(const char* path) {
pthread_mutex_lock(&ftpfs.lock);
cancel_previous_multi();
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_POSTQUOTE, header);
- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_NOBODY, ftpfs.safe_nobody);
CURLcode curl_res = curl_easy_perform(ftpfs.connection);
@@ -1026,6 +1046,7 @@ static int ftpfs_rmdir(const char* path) {
buf_free(&buf);
curl_slist_free_all(header);
+ free_uri(full_path_uri);
free(full_path);
free(filename);
free(cmd);
@@ -1036,6 +1057,7 @@ static int ftpfs_mkdir(const char* path, mode_t mode)
int err = 0;
struct curl_slist* header = NULL;
char* full_path = get_dir_path(path);
+ char* full_path_uri = path_to_uri(full_path);
char* filename = get_file_name(path);
char* cmd = g_strdup_printf("MKD %s", filename);
struct buffer buf;
@@ -1046,7 +1068,7 @@ static int ftpfs_mkdir(const char* path, mode_t mode)
pthread_mutex_lock(&ftpfs.lock);
cancel_previous_multi();
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_POSTQUOTE, header);
- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_NOBODY, ftpfs.safe_nobody);
CURLcode curl_res = curl_easy_perform(ftpfs.connection);
@@ -1060,6 +1082,7 @@ static int ftpfs_mkdir(const char* path, mode_t mode)
buf_free(&buf);
curl_slist_free_all(header);
+ free_uri(full_path_uri);
free(full_path);
free(filename);
free(cmd);
@@ -1074,6 +1097,7 @@ static int ftpfs_unlink(const char* path) {
int err = 0;
struct curl_slist* header = NULL;
char* full_path = get_dir_path(path);
+ char* full_path_uri = path_to_uri(full_path);
char* filename = get_file_name(path);
char* cmd = g_strdup_printf("DELE %s", filename);
struct buffer buf;
@@ -1084,7 +1108,7 @@ static int ftpfs_unlink(const char* path) {
pthread_mutex_lock(&ftpfs.lock);
cancel_previous_multi();
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_POSTQUOTE, header);
- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_NOBODY, ftpfs.safe_nobody);
CURLcode curl_res = curl_easy_perform(ftpfs.connection);
@@ -1098,6 +1122,7 @@ static int ftpfs_unlink(const char* path) {
buf_free(&buf);
curl_slist_free_all(header);
+ free_uri(full_path_uri);
free(full_path);
free(filename);
free(cmd);
@@ -1299,6 +1324,7 @@ static int ftpfs_readlink(const char *path, char *link
int err;
CURLcode curl_res;
char* dir_path = get_dir_path(path);
+ char* dir_path_uri = path_to_uri(dir_path);
DEBUG(2, "dir_path: %s %s\n", path, dir_path);
struct buffer buf;
@@ -1306,7 +1332,7 @@ static int ftpfs_readlink(const char *path, char *link
pthread_mutex_lock(&ftpfs.lock);
cancel_previous_multi();
- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, dir_path);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, dir_path_uri);
curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
curl_res = curl_easy_perform(ftpfs.connection);
pthread_mutex_unlock(&ftpfs.lock);
@@ -1321,6 +1347,7 @@ static int ftpfs_readlink(const char *path, char *link
err = parse_dir((char*)buf.p, dir_path + strlen(ftpfs.host) - 1,
name, NULL, linkbuf, size, NULL, NULL);
+ free_uri(dir_path_uri);
free(dir_path);
buf_free(&buf);
if (err) return op_return(-ENOENT, "ftpfs_readlink");