r_mkdir: don't truncate the path on error (#322)

currently, in case of error, r_mkdir will leave the path at a truncated
state.

a7d39b0ab8 is the commit that introduced this change, and in it the
error printing is moved from r_mkdir to the caller, which makes me think
it was probably intentional.

make it so that the function itself prints the error/warning
message and returns the path back to the caller unharmed.

Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/322
Reviewed-by: Berke Kocaoğlu <berke.kocaoglu@metu.edu.tr>
Reviewed-by: TAAPArthur <taaparthur@noreply.codeberg.org>
This commit is contained in:
NRK 2022-06-22 05:05:03 +02:00
parent a67665a1c1
commit 9812d601c1
2 changed files with 10 additions and 8 deletions

View file

@ -92,10 +92,8 @@ static void tns_cache_write(Imlib_Image im, const char *filepath, bool force)
{ {
if ((dirend = strrchr(cfile, '/')) != NULL) { if ((dirend = strrchr(cfile, '/')) != NULL) {
*dirend = '\0'; *dirend = '\0';
if (r_mkdir(cfile) == -1) { if (r_mkdir(cfile) < 0)
error(0, errno, "%s", cfile);
goto end; goto end;
}
*dirend = '/'; *dirend = '/';
} }
imlib_context_set_image(im); imlib_context_set_image(im);

14
util.c
View file

@ -193,10 +193,11 @@ char* r_readdir(r_dir_t *rdir, bool skip_dotfiles)
int r_mkdir(char *path) int r_mkdir(char *path)
{ {
int rc = 0;
char c, *s = path; char c, *s = path;
struct stat st; struct stat st;
while (*s != '\0') { while (*s != '\0' && rc == 0) {
if (*s == '/') { if (*s == '/') {
s++; s++;
continue; continue;
@ -204,12 +205,15 @@ int r_mkdir(char *path)
for (; *s != '\0' && *s != '/'; s++); for (; *s != '\0' && *s != '/'; s++);
c = *s; c = *s;
*s = '\0'; *s = '\0';
if (mkdir(path, 0755) == -1) if (mkdir(path, 0755) == -1) {
if (errno != EEXIST || stat(path, &st) == -1 || !S_ISDIR(st.st_mode)) if (errno != EEXIST || stat(path, &st) == -1 || !S_ISDIR(st.st_mode)) {
return -1; error(0, errno, "%s", path);
rc = -1;
}
}
*s = c; *s = c;
} }
return 0; return rc;
} }
void construct_argv(char **argv, unsigned int len, ...) void construct_argv(char **argv, unsigned int len, ...)