From c8424d422b9229b7c05b1c061547331ca5cde92a Mon Sep 17 00:00:00 2001 From: Ar7eniyan Date: Wed, 12 Apr 2023 18:29:59 +0300 Subject: [PATCH 1/4] Change update_localdb() logic, now it doesn't use /tmp --- src/local.c | 97 +++++++++++++++++++++++++++++++---------------------- src/tldr.h | 3 +- 2 files changed, 58 insertions(+), 42 deletions(-) diff --git a/src/local.c b/src/local.c index c204931..ee5491d 100644 --- a/src/local.c +++ b/src/local.c @@ -137,87 +137,102 @@ int update_localdb(int verbose) { struct stat s; - char tmp[STRBUFSIZ]; - char outpath[STRBUFSIZ]; - char outfile[STRBUFSIZ]; - char outhome[STRBUFSIZ]; + char tldr_home[STRBUFSIZ]; /* $HOME/TLDR_HOME */ + char tldr_home_db[STRBUFSIZ]; /* $HOME/TLDR_HOME/TLDR_DIR */ + char temp_dir[STRBUFSIZ]; /* $HOME/TLDR_HOME/TMP_DIR */ + char update_zip_file[STRBUFSIZ]; /* $HOME/TLDR_HOME/TMP_DIR/TMP_FILE */ + char update_contents[STRBUFSIZ]; /* $HOME/TLDR_HOME/TMP_DIR/TLDR_ZIP_DIR */ char const *homedir; size_t outlen; - outlen = 0; - if (sstrncat(outfile, &outlen, STRBUFSIZ, TMP_DIR, TMP_DIR_LEN)) - return 1; - if (mkdtemp(outfile) == NULL) { - fprintf(stderr, "Error: Creating Directory: %s\n", outfile); + homedir = gethome(); + if (homedir == NULL) { + fprintf(stderr, "Error: HOME not existent\n"); return 1; } + /* Create TLDR_HOME if non-existent */ outlen = 0; - - /* it's guaranteed, that outfile is only TMP_DIR_LEN long */ - if (sstrncat(outpath, &outlen, STRBUFSIZ, outfile, TMP_DIR_LEN)) + if (sstrncat(tldr_home, &outlen, STRBUFSIZ, homedir, strlen(homedir))) { return 1; - - outlen = TMP_DIR_LEN; - if (sstrncat(outfile, &outlen, STRBUFSIZ, TMP_FILE, TMP_FILE_LEN)) + } + if (sstrncat(tldr_home, &outlen, STRBUFSIZ, TLDR_HOME, TLDR_HOME_LEN)) { return 1; - - if (download_file(ZIP_URL, outfile, verbose)) { - fprintf(stderr, "Error: Downloading File: %s\n", ZIP_URL); + } + if (mkdir(tldr_home, 0755) > 0 && errno != EEXIST) { + fprintf(stderr, "Error: Could Not Create Directory: %s\n", tldr_home); return 1; } - if (unzip(outfile, outpath)) { - rm(outpath, 0); + /* Set up the temp directory */ + outlen = 0; + if (sstrncat(temp_dir, &outlen, STRBUFSIZ, tldr_home, strlen(tldr_home))) { + return 1; + } + if (sstrncat(temp_dir, &outlen, STRBUFSIZ, TMP_DIR, TMP_DIR_LEN)) { + return 1; + } + if (mkdir(temp_dir, 0755) > 0 && errno != EEXIST) { + fprintf(stderr, "Error: Could Not Create Directory: %s\n", temp_dir); return 1; } + /* The update zip file will be downloaded to $HOME/TLDR_HOME/TMP_DIR/TMP_FILE */ outlen = 0; - if (sstrncat(tmp, &outlen, STRBUFSIZ, outpath, strlen(outpath))) + if (sstrncat(update_zip_file, &outlen, STRBUFSIZ, temp_dir, strlen(temp_dir))) { return 1; - if (sstrncat(tmp, &outlen, STRBUFSIZ, TLDR_ZIP_DIR, TLDR_ZIP_DIR_LEN)) + } + if (sstrncat(update_zip_file, &outlen, STRBUFSIZ, TMP_FILE, TMP_FILE_LEN)) { return 1; + } - homedir = gethome(); - if (homedir == NULL) { - fprintf(stderr, "Error: HOME not existant\n"); + /* Download and unzip the file */ + if (download_file(ZIP_URL, update_zip_file, verbose)) { + fprintf(stderr, "Error: Downloading File: %s\n", ZIP_URL); + return 1; + } + + if (unzip(update_zip_file, temp_dir)) { + rm(temp_dir, 0); return 1; } outlen = 0; - if (sstrncat(outhome, &outlen, STRBUFSIZ, homedir, strlen(homedir))) { + if (sstrncat(update_contents, &outlen, STRBUFSIZ, temp_dir, strlen(temp_dir))) { return 1; } - if (sstrncat(outhome, &outlen, STRBUFSIZ, TLDR_HOME, TLDR_HOME_LEN)) { + if (sstrncat(update_contents, &outlen, STRBUFSIZ, TLDR_ZIP_DIR, TLDR_ZIP_DIR_LEN)) { return 1; } - if (mkdir(outhome, 0755) > 0 && errno != EEXIST) { - fprintf(stderr, "Error: Could Not Create Directory: %s\n", outhome); - rm(outpath, 0); + /* tldr_home_db is where we want to move the update contents */ + outlen = 0; + if (sstrncat(tldr_home_db, &outlen, STRBUFSIZ, tldr_home, strlen(tldr_home))) { return 1; } - - if (sstrncat(outhome, &outlen, STRBUFSIZ, TLDR_DIR, TLDR_DIR_LEN)) + if (sstrncat(tldr_home_db, &outlen, STRBUFSIZ, TLDR_DIR, TLDR_HOME_LEN)) { return 1; - if (sstrncat(outhome, &outlen, STRBUFSIZ, "/", 1)) + } + if (sstrncat(tldr_home_db, &outlen, STRBUFSIZ, "/", 1)) { return 1; + } - if ((stat(outhome, &s) == 0) && (S_ISDIR(s.st_mode))) { - if (rm(outhome, 0)) { - fprintf(stderr, "Error: Could Not Remove: %s\n", outhome); + /* Remove the old database */ + if ((stat(tldr_home_db, &s) == 0) && (S_ISDIR(s.st_mode))) { + if (rm(tldr_home_db, 0)) { + fprintf(stderr, "Error: Could not remove the old database: %s\n", tldr_home_db); return 1; } } - if (rename(tmp, outhome)) { - fprintf(stderr, "Error: Could Not Rename: %s to %s\n", tmp, outhome); - rm(outpath, 0); + if (rename(update_contents, tldr_home_db)) { + fprintf(stderr, "Error: Could Not Rename: %s to %s\n", update_contents, tldr_home_db); + rm(temp_dir, 0); return 1; } - if (rm(outpath, 0)) { - fprintf(stderr, "Error: Could Not Remove: %s\n", outpath); + if (rm(temp_dir, 0)) { + fprintf(stderr, "Error: Could Not Remove: %s\n", temp_dir); return 1; } diff --git a/src/tldr.h b/src/tldr.h index 68d2833..b1f9d3f 100644 --- a/src/tldr.h +++ b/src/tldr.h @@ -20,7 +20,8 @@ #define ZIP_URL "https://github.com/tldr-pages/tldr/archive/main.zip" #define ZIP_URL_LEN (sizeof(ZIP_URL_LEN) - 1) -#define TMP_DIR "/tmp/tldrXXXXXX" +/* Relative to TLDR_HOME */ +#define TMP_DIR "/tmp" #define TMP_DIR_LEN (sizeof(TMP_DIR) - 1) #define TMP_FILE "/main.zip" From 51f47d4f29cba6476739024db9a6ce995909b9ca Mon Sep 17 00:00:00 2001 From: Ar7eniyan Date: Wed, 12 Apr 2023 18:30:25 +0300 Subject: [PATCH 2/4] Make error messages case consistent in local.c:update_localdb() --- src/local.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/local.c b/src/local.c index ee5491d..ea04fb5 100644 --- a/src/local.c +++ b/src/local.c @@ -160,7 +160,7 @@ update_localdb(int verbose) return 1; } if (mkdir(tldr_home, 0755) > 0 && errno != EEXIST) { - fprintf(stderr, "Error: Could Not Create Directory: %s\n", tldr_home); + fprintf(stderr, "Error: Could not create directory: %s\n", tldr_home); return 1; } @@ -173,7 +173,7 @@ update_localdb(int verbose) return 1; } if (mkdir(temp_dir, 0755) > 0 && errno != EEXIST) { - fprintf(stderr, "Error: Could Not Create Directory: %s\n", temp_dir); + fprintf(stderr, "Error: Could not create directory: %s\n", temp_dir); return 1; } @@ -188,7 +188,7 @@ update_localdb(int verbose) /* Download and unzip the file */ if (download_file(ZIP_URL, update_zip_file, verbose)) { - fprintf(stderr, "Error: Downloading File: %s\n", ZIP_URL); + fprintf(stderr, "Error: Downloading file: %s\n", ZIP_URL); return 1; } @@ -226,13 +226,13 @@ update_localdb(int verbose) } if (rename(update_contents, tldr_home_db)) { - fprintf(stderr, "Error: Could Not Rename: %s to %s\n", update_contents, tldr_home_db); + fprintf(stderr, "Error: Could not rename: %s to %s\n", update_contents, tldr_home_db); rm(temp_dir, 0); return 1; } if (rm(temp_dir, 0)) { - fprintf(stderr, "Error: Could Not Remove: %s\n", temp_dir); + fprintf(stderr, "Error: Could not remove: %s\n", temp_dir); return 1; } From ae1920339ae8b9bf1d541fe52db568dd2683cf4d Mon Sep 17 00:00:00 2001 From: Ar7eniyan Date: Tue, 11 Jul 2023 17:50:10 +0300 Subject: [PATCH 3/4] Apply suggestions from @SethFalco Co-authored-by: Seth Falco --- src/local.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/local.c b/src/local.c index 3451d53..601b3fb 100644 --- a/src/local.c +++ b/src/local.c @@ -143,8 +143,8 @@ update_localdb(int verbose) char tldr_home[STRBUFSIZ]; /* $HOME/TLDR_HOME */ char tldr_home_db[STRBUFSIZ]; /* $HOME/TLDR_HOME/TLDR_DIR */ char temp_dir[STRBUFSIZ]; /* $HOME/TLDR_HOME/TMP_DIR */ - char update_zip_file[STRBUFSIZ]; /* $HOME/TLDR_HOME/TMP_DIR/TMP_FILE */ - char update_contents[STRBUFSIZ]; /* $HOME/TLDR_HOME/TMP_DIR/TLDR_ZIP_DIR */ + char zip_archive_path[STRBUFSIZ]; /* $HOME/TLDR_HOME/TMP_DIR/TMP_FILE */ + char extracted_contents[STRBUFSIZ]; /* $HOME/TLDR_HOME/TMP_DIR/TLDR_ZIP_DIR */ char const *homedir; size_t outlen; From f718b5497294fb0e62c41a4e4343369271619d76 Mon Sep 17 00:00:00 2001 From: Ar7eniyan Date: Tue, 11 Jul 2023 17:54:51 +0300 Subject: [PATCH 4/4] Fix variable names, didn't notice the names not being replaced everywhere in previous commit --- src/local.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/local.c b/src/local.c index 601b3fb..bf4cc9a 100644 --- a/src/local.c +++ b/src/local.c @@ -182,29 +182,29 @@ update_localdb(int verbose) /* The update zip file will be downloaded to $HOME/TLDR_HOME/TMP_DIR/TMP_FILE */ outlen = 0; - if (sstrncat(update_zip_file, &outlen, STRBUFSIZ, temp_dir, strlen(temp_dir))) { + if (sstrncat(zip_archive_path, &outlen, STRBUFSIZ, temp_dir, strlen(temp_dir))) { return 1; } - if (sstrncat(update_zip_file, &outlen, STRBUFSIZ, TMP_FILE, TMP_FILE_LEN)) { + if (sstrncat(zip_archive_path, &outlen, STRBUFSIZ, TMP_FILE, TMP_FILE_LEN)) { return 1; } /* Download and unzip the file */ - if (download_file(ZIP_URL, update_zip_file, verbose)) { + if (download_file(ZIP_URL, zip_archive_path, verbose)) { fprintf(stderr, "Error: Downloading file: %s\n", ZIP_URL); return 1; } - if (unzip(update_zip_file, temp_dir)) { + if (unzip(zip_archive_path, temp_dir)) { rm(temp_dir, 0); return 1; } outlen = 0; - if (sstrncat(update_contents, &outlen, STRBUFSIZ, temp_dir, strlen(temp_dir))) { + if (sstrncat(extracted_contents, &outlen, STRBUFSIZ, temp_dir, strlen(temp_dir))) { return 1; } - if (sstrncat(update_contents, &outlen, STRBUFSIZ, TLDR_ZIP_DIR, TLDR_ZIP_DIR_LEN)) { + if (sstrncat(extracted_contents, &outlen, STRBUFSIZ, TLDR_ZIP_DIR, TLDR_ZIP_DIR_LEN)) { return 1; } @@ -228,8 +228,8 @@ update_localdb(int verbose) } } - if (rename(update_contents, tldr_home_db)) { - fprintf(stderr, "Error: Could not rename: %s to %s\n", update_contents, tldr_home_db); + if (rename(extracted_contents, tldr_home_db)) { + fprintf(stderr, "Error: Could not rename: %s to %s\n", extracted_contents, tldr_home_db); rm(temp_dir, 0); return 1; }