diff options
author | leo-arch <leonardoabramovich2@gmail.com> | 2024-04-22 12:48:44 -0300 |
---|---|---|
committer | leo-arch <leonardoabramovich2@gmail.com> | 2024-04-22 12:48:44 -0300 |
commit | d2e39dab5b8628b7842f8531dbc805099bb2c83c (patch) | |
tree | ed4a2450e67aa93774938ae116b1fd5d97c02a1a | |
parent | 90f415ca929f72150fbcd736016b0ff5eba265fb (diff) |
Fix: cannot pin dir name containing spaces
-rw-r--r-- | src/long_view.c | 10 | ||||
-rw-r--r-- | src/misc.c | 57 |
2 files changed, 35 insertions, 32 deletions
diff --git a/src/long_view.c b/src/long_view.c index eb4def10..bd424500 100644 --- a/src/long_view.c +++ b/src/long_view.c @@ -44,13 +44,10 @@ #define PERM_STR_LEN ((MAX_COLOR * 14) + 16) /* construct_file_perms() */ #define TIME_STR_LEN (MAX_TIME_STR + (MAX_COLOR * 2) + 2) /* construct_timestamp() */ - /* construct_human_size() returns a string of at most MAX_HUMAN_SIZE chars (helpers.h) */ #define SIZE_STR_LEN (MAX_HUMAN_SIZE + (MAX_COLOR * 3) + 10) /* construct_file_size() */ - /* 2 colors + 2 names + (space + NUL byte) + DIM */ #define ID_STR_LEN ((MAX_COLOR * 2) + (NAME_MAX * 2) + 2 + 4) - /* Max inode number able to hold: 999 billions! Padding could be as long * as max inode lenght - 1 */ #define INO_STR_LEN ((MAX_COLOR * 2) + ((12 + 1) * 2) + 4) @@ -58,7 +55,6 @@ #define LINKS_STR_LEN ((MAX_COLOR * 2) + 32) /* Files counter */ #define FC_STR_LEN ((MAX_COLOR * 2) + 32) - /* File allocated blocks */ #define BLK_STR_LEN ((MAX_COLOR * 2) + 32) @@ -397,9 +393,9 @@ construct_files_counter(const struct fileinfo *props, char *fc_str, (int)props->filesn, df_c); } else { snprintf(fc_str, FC_STR_LEN, "%s%*c%s", dn_c, max, - props->filesn < 0 ? '?' /* Dir with no read permission */ - : (props->dir == 1 ? '0' : '-'), - df_c); + props->filesn < 0 ? '?' /* Dir with no read permission */ + : (props->dir == 1 ? '0' : '-'), + df_c); } } @@ -1900,8 +1900,7 @@ save_pinned_dir(void) int fd = 0; FILE *fp = open_fwrite(pin_file, &fd); if (!fp) { - xerror(_("%s: Error storing pinned directory: %s\n"), - PROGRAM_NAME, strerror(errno)); + xerror(_("pin: Error saving pinned directory: %s\n"), strerror(errno)); } else { fprintf(fp, "%s", pinned_dir); fclose(fp); @@ -1915,50 +1914,58 @@ save_pinned_dir(void) int pin_directory(char *dir) { - if (!dir || !*dir) return FUNC_FAILURE; + if (!dir || !*dir) + return FUNC_FAILURE; - struct stat attr; - if (lstat(dir, &attr) == -1) { - xerror("%s: '%s': %s\n", PROGRAM_NAME, dir, strerror(errno)); + char *d = unescape_str(dir, 0); + if (!d) + return FUNC_FAILURE; + + struct stat a; + if (lstat(d, &a) == -1) { + xerror("pin: '%s': %s\n", d, strerror(errno)); + free(d); return FUNC_FAILURE; } - if (pinned_dir) - {free(pinned_dir); pinned_dir = (char *)NULL;} + if (pinned_dir) { + free(pinned_dir); + pinned_dir = (char *)NULL; + } - const size_t dir_len = strlen(dir); + const size_t dir_len = strlen(d); /* If absolute path */ if (*dir == '/') { - pinned_dir = savestring(dir, dir_len); + pinned_dir = savestring(d, dir_len); } else { /* If relative path */ if (strcmp(workspaces[cur_ws].path, "/") == 0) { pinned_dir = xnmalloc(dir_len + 2, sizeof(char)); - snprintf(pinned_dir, dir_len + 2, "/%s", dir); + snprintf(pinned_dir, dir_len + 2, "/%s", d); } else { const size_t plen = dir_len + strlen(workspaces[cur_ws].path) + 2; pinned_dir = xnmalloc(plen, sizeof(char)); - snprintf(pinned_dir, plen, "%s/%s", workspaces[cur_ws].path, dir); + snprintf(pinned_dir, plen, "%s/%s", workspaces[cur_ws].path, d); } } - if (xargs.stealth_mode == 1 || save_pinned_dir() == FUNC_SUCCESS) - goto END; - - free(pinned_dir); - pinned_dir = (char *)NULL; - return FUNC_FAILURE; - -END: - printf(_("%s: Succesfully pinned '%s'\n"), PROGRAM_NAME, dir); - return FUNC_SUCCESS; + if (xargs.stealth_mode == 1 || save_pinned_dir() == FUNC_SUCCESS) { + printf(_("pin: Succesfully pinned '%s'\n"), d); + free(d); + return FUNC_SUCCESS; + } else { + free(d); + free(pinned_dir); + pinned_dir = (char *)NULL; + return FUNC_FAILURE; + } } int unpin_dir(void) { if (!pinned_dir) { - printf(_("%s: No pinned file\n"), PROGRAM_NAME); + puts(_("unpin: No pinned file")); return FUNC_SUCCESS; } @@ -1967,7 +1974,7 @@ unpin_dir(void) char *pin_file = xnmalloc(config_dir_len + 7, sizeof(char)); snprintf(pin_file, config_dir_len + 7, "%s/.pin", config_dir); if (unlink(pin_file) == -1) { - xerror("%s: '%s': %s\n", PROGRAM_NAME, pin_file, strerror(errno)); + xerror("pin: '%s': %s\n", pin_file, strerror(errno)); cmd_error = 1; } @@ -1976,7 +1983,7 @@ unpin_dir(void) return FUNC_FAILURE; } - printf(_("Succesfully unpinned %s\n"), pinned_dir); + printf(_("unpin: Succesfully unpinned '%s'\n"), pinned_dir); free(pinned_dir); pinned_dir = (char *)NULL; |