summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorleo-arch <leonardoabramovich2@gmail.com>2024-04-22 12:48:44 -0300
committerleo-arch <leonardoabramovich2@gmail.com>2024-04-22 12:48:44 -0300
commitd2e39dab5b8628b7842f8531dbc805099bb2c83c (patch)
treeed4a2450e67aa93774938ae116b1fd5d97c02a1a
parent90f415ca929f72150fbcd736016b0ff5eba265fb (diff)
Fix: cannot pin dir name containing spaces
-rw-r--r--src/long_view.c10
-rw-r--r--src/misc.c57
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);
}
}
diff --git a/src/misc.c b/src/misc.c
index e1cbf078..b6ab6de9 100644
--- a/src/misc.c
+++ b/src/misc.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;