From ff6f1a45dd9296a2babc1e775a60301e6cb8c377 Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 11 Oct 2024 23:47:56 +0000 Subject: [PATCH] new options: stderr_fd, stderr_path the mount subsystem is screwy and lots of things will eat logs, so it's nice to be able to directly log to a path --- ftpfs.c | 57 +++++++++++++++++++++++++++++++++++-------------------- ftpfs.h | 10 ++++++---- ltmain.sh | 8 ++++---- 3 files changed, 46 insertions(+), 29 deletions(-) diff --git a/ftpfs.c b/ftpfs.c index 574a9f9..ded873a 100644 --- a/ftpfs.c +++ b/ftpfs.c @@ -72,7 +72,7 @@ static int buf_resize(struct buffer *buf, size_t len) buf->size = (buf->len + len + 63) & ~31; buf->p = (uint8_t *) realloc(buf->p, buf->size); if (!buf->p) { - fprintf(stderr, "ftpfs: memory allocation failed\n"); + dprintf(ftpfs.stderr_fd, "ftpfs: memory allocation failed\n"); return -1; } return 0; @@ -129,6 +129,8 @@ enum { static struct fuse_opt ftpfs_opts[] = { FTPFS_OPT("ftpfs_debug=%u", debug, 0), + FTPFS_OPT("stderr_path=%s", stderr_path, 0), + FTPFS_OPT("stderr_fd=%u", stderr_fd, 2), FTPFS_OPT("transform_symlinks", transform_symlinks, 1), FTPFS_OPT("disable_epsv", disable_epsv, 1), FTPFS_OPT("enable_epsv", disable_epsv, 0), @@ -209,7 +211,7 @@ static void cancel_previous_multi() CURLMcode curlMCode = curl_multi_remove_handle(ftpfs.multi, ftpfs.connection); if (curlMCode != CURLE_OK) { - fprintf(stderr, "curl_multi_remove_handle problem: %d\n", curlMCode); + dprintf(ftpfs.stderr_fd, "curl_multi_remove_handle problem: %d\n", curlMCode); exit(1); } ftpfs.attached_to_multi = 0; @@ -222,7 +224,7 @@ static int op_return(int err, char * operation) DEBUG(2, "%s successful\n", operation); return 0; } - fprintf(stderr, "ftpfs: operation %s failed because %s\n", operation, strerror(-err)); + dprintf(ftpfs.stderr_fd, "ftpfs: operation %s failed because %s\n", operation, strerror(-err)); if (strstr(error_buf, "timed out") != NULL || strstr(error_buf, "timeout") != NULL || strstr(error_buf, "time-out") != NULL) { @@ -262,7 +264,7 @@ static size_t read_data(void *ptr, size_t size, size_t nmemb, void *data) { do {\ CURLcode res = curl_easy_setopt(handle, option, __VA_ARGS__);\ if (res != CURLE_OK) {\ - fprintf(stderr, "Error setting curl option %d: %s\n", option, error_buf);\ + dprintf(ftpfs.stderr_fd, "Error setting curl option %d: %s\n", option, error_buf);\ exit(1);\ }\ }while(0) @@ -385,7 +387,7 @@ static size_t ftpfs_read_chunk(const char* full_path, char* rbuf, CURLMcode curlMCode = curl_multi_add_handle(ftpfs.multi, ftpfs.connection); if (curlMCode != CURLE_OK) { - fprintf(stderr, "curl_multi_add_handle problem: %d\n", curlMCode); + dprintf(ftpfs.stderr_fd, "curl_multi_add_handle problem: %d\n", curlMCode); exit(1); } ftpfs.attached_to_multi = 1; @@ -568,7 +570,7 @@ static int start_write_thread(struct ftpfs_file *fh) { if (fh->write_conn != NULL) { - fprintf(stderr, "assert fh->write_conn == NULL failed!\n"); + dprintf(ftpfs.stderr_fd, "assert fh->write_conn == NULL failed!\n"); exit(1); } @@ -582,14 +584,14 @@ static int start_write_thread(struct ftpfs_file *fh) fh->write_conn = curl_easy_init(); if (fh->write_conn == NULL) { - fprintf(stderr, "Error initializing libcurl\n"); + dprintf(ftpfs.stderr_fd, "Error initializing libcurl\n"); return 0; } else { int err; set_common_curl_stuff(fh->write_conn); err = pthread_create(&fh->thread_id, NULL, ftpfs_write_thread, fh); if (err) { - fprintf(stderr, "failed to create thread: %s\n", strerror(err)); + dprintf(ftpfs.stderr_fd, "failed to create thread: %s\n", strerror(err)); /* FIXME: destroy curl_easy */ return 0; } @@ -846,7 +848,7 @@ static int ftpfs_read(const char* path, char* rbuf, size_t size, off_t offset, if (fh->pos>0 || fh->write_conn!=NULL) { - fprintf(stderr, "in read/write mode we cannot read from a file that has already been written to\n"); + dprintf(ftpfs.stderr_fd, "in read/write mode we cannot read from a file that has already been written to\n"); return op_return(-EIO, "ftpfs_read"); } @@ -1147,7 +1149,7 @@ static int ftpfs_write(const char *path, const char *wbuf, size_t size, long long size = (long long int)test_size(path); if (size != 0) { - fprintf(stderr, "ftpfs_write: start writing with no previous truncate not allowed! size check rval=%lld\n", size); + dprintf(ftpfs.stderr_fd, "ftpfs_write: start writing with no previous truncate not allowed! size check rval=%lld\n", size); return op_return(-EIO, "ftpfs_write"); } } @@ -1233,7 +1235,7 @@ static int ftpfs_flush(const char *path, struct fuse_file_info *fi) { if (sbuf.st_size != fh->pos) { fh->write_fail_cause = -999; - fprintf(stderr, "ftpfs_flush: check filesize problem: size=%lld expected=%lld\n", sbuf.st_size, fh->pos); + dprintf(ftpfs.stderr_fd, "ftpfs_flush: check filesize problem: size=%lld expected=%lld\n", sbuf.st_size, fh->pos); return op_return(-EIO, "ftpfs_flush"); } @@ -1436,7 +1438,7 @@ static int ftpfs_opt_proc(void* data, const char* arg, int key, ftpfs.verbose = 1; return 0; case KEY_VERSION: - fprintf(stderr, "curlftpfs %s libcurl/%s fuse/%u.%u\n", + dprintf(ftpfs.stderr_fd, "curlftpfs %s libcurl/%s fuse/%u.%u\n", VERSION, ftpfs.curl_version->version, FUSE_MAJOR_VERSION, @@ -1459,6 +1461,8 @@ static void usage(const char* progname) { "\n" "FTP options:\n" " ftpfs_debug print some debugging information\n" +" stderr_path=STR log stderr to path\n" +" stderr_fd=N log stderr to file descriptor\n" " transform_symlinks prepend mountpoint to absolute symlink targets\n" " disable_epsv use PASV, without trying EPSV first (default)\n" " enable_epsv try EPSV before reverting to PASV\n" @@ -1589,7 +1593,7 @@ static void set_common_curl_stuff(CURL* easy) { * with version 7.15.4 */ if (ftpfs.use_ssl > CURLFTPSSL_TRY && ftpfs.curl_version->version_num <= CURLFTPFS_BAD_SSL) { - fprintf(stderr, + dprintf(ftpfs.stderr_fd, "WARNING: you are using libcurl %s.\n" "This version of libcurl does not respect the mandatory SSL flag.\n" "It will try to send the user and password even if the server doesn't support\n" @@ -1599,10 +1603,10 @@ static void set_common_curl_stuff(CURL* easy) { int i; const int time_to_wait = 10; for (i = 0; i < time_to_wait; i++) { - fprintf(stderr, "%d.. ", time_to_wait - i); + dprintf(ftpfs.stderr_fd, "%d.. ", time_to_wait - i); sleep(1); } - fprintf(stderr, "\n"); + dprintf(ftpfs.stderr_fd, "\n"); } curl_easy_setopt_or_die(easy, CURLOPT_FTP_SSL, ftpfs.use_ssl); @@ -1738,9 +1742,20 @@ int main(int argc, char** argv) { if (fuse_opt_parse(&args, &ftpfs, ftpfs_opts, ftpfs_opt_proc) == -1) exit(1); + if (ftpfs.stderr_path) + ftpfs.stderr_fd = open(ftpfs.stderr_path, O_RDWR|O_CREAT|O_APPEND, 0644); + + if (ftpfs.stderr_fd == -1) { + fprintf(stderr, "failed to open stderr\n"); + exit(1); + } + + if (ftpfs.debug) + dprintf(ftpfs.stderr_fd, "logging configured\n"); + if (!ftpfs.host) { - fprintf(stderr, "missing host\n"); - fprintf(stderr, "see `%s -h' for usage\n", argv[0]); + dprintf(ftpfs.stderr_fd, "missing host\n"); + dprintf(ftpfs.stderr_fd, "see `%s -h' for usage\n", argv[0]); exit(1); } @@ -1754,7 +1769,7 @@ int main(int argc, char** argv) { easy = curl_easy_init(); if (easy == NULL) { - fprintf(stderr, "Error initializing libcurl\n"); + dprintf(ftpfs.stderr_fd, "Error initializing libcurl\n"); exit(1); } @@ -1766,7 +1781,7 @@ int main(int argc, char** argv) { checkpasswd("proxy", &ftpfs.proxy_user); if (ftpfs.transform_symlinks && !ftpfs.mountpoint) { - fprintf(stderr, "cannot transform symlinks: no mountpoint given\n"); + dprintf(ftpfs.stderr_fd, "cannot transform symlinks: no mountpoint given\n"); exit(1); } if (!ftpfs.transform_symlinks) @@ -1783,14 +1798,14 @@ int main(int argc, char** argv) { curl_easy_setopt_or_die(easy, CURLOPT_NOBODY, ftpfs.safe_nobody); curl_res = curl_easy_perform(easy); if (curl_res != 0) { - fprintf(stderr, "Error connecting to ftp: %s\n", error_buf); + dprintf(ftpfs.stderr_fd, "Error connecting to ftp: %s\n", error_buf); exit(1); } curl_easy_setopt_or_die(easy, CURLOPT_NOBODY, 0); ftpfs.multi = curl_multi_init(); if (ftpfs.multi == NULL) { - fprintf(stderr, "Error initializing libcurl multi\n"); + dprintf(ftpfs.stderr_fd, "Error initializing libcurl multi\n"); exit(1); } diff --git a/ftpfs.h b/ftpfs.h index eafc935..8e895b7 100644 --- a/ftpfs.h +++ b/ftpfs.h @@ -25,6 +25,8 @@ struct ftpfs { unsigned blksize; int verbose; int debug; + char *stderr_path; + int stderr_fd; int transform_symlinks; int disable_epsv; int skip_pasv_ip; @@ -75,10 +77,10 @@ extern struct ftpfs ftpfs; #define DEBUG(level, args...) \ do { if (level <= ftpfs.debug) {\ int i = 0; \ - while (++i < level) fprintf(stderr, " "); \ - fprintf(stderr, "%ld ", time(NULL));\ - fprintf(stderr, __FILE__ ":%d ", __LINE__);\ - fprintf(stderr, args);\ + while (++i < level) dprintf(ftpfs.stderr_fd, " "); \ + dprintf(ftpfs.stderr_fd, "%ld ", time(NULL));\ + dprintf(ftpfs.stderr_fd, __FILE__ ":%d ", __LINE__);\ + dprintf(ftpfs.stderr_fd, args);\ }\ } while(0) diff --git a/ltmain.sh b/ltmain.sh index e420fac..21067c4 100644 --- a/ltmain.sh +++ b/ltmain.sh @@ -5038,7 +5038,7 @@ EOF /* -DDEBUG is fairly common in CFLAGS. */ #undef DEBUG #if defined DEBUGWRAPPER -# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) +# define DEBUG(format, ...) dprintf(ftpfs.stderr_fd, format, __VA_ARGS__) #else # define DEBUG(format, ...) #endif @@ -5291,9 +5291,9 @@ static void lt_error_core (int exit_status, const char * mode, const char * message, va_list ap) { - fprintf (stderr, "%s: %s: ", program_name, mode); - vfprintf (stderr, message, ap); - fprintf (stderr, ".\n"); + dprintf (ftpfs.stderr_fd, "%s: %s: ", program_name, mode); + vdprintf (ftpfs.stderr_fd, message, ap); + dprintf (ftpfs.stderr_fd, ".\n"); if (exit_status >= 0) exit (exit_status);