mkdir exportdir's parent, if necessary

Tux Paint's export features will fail if the parent
of the export directory didn't exist.  e.g., using the
default (either via XDG or hard-coded fallback) of
"~/Pictures/TuxPaint/", Tux Paint could not export if
"~/Pictures/" didn't exist yet.  It will now try to
mkdir it as well.  h/t Tim Dickson

Updated OPTIONS documents to explain this.

Also, documenting --exportdir in manpage (was missing!)
This commit is contained in:
Bill Kendrick 2021-01-13 22:48:29 -08:00
parent c2a4b9862a
commit c97932606f
9 changed files with 74 additions and 20 deletions

View file

@ -1,7 +1,7 @@
/*
get_fname.c
Copyright (c) 2009 - 2020
Copyright (c) 2009 - 2021
http://www.tuxpaint.org/
This program is free software; you can redistribute it and/or modify
@ -57,6 +57,11 @@
and easily-accessible place for end users to retrieve the exports.
The defaults may be overridden with the "--exportdir" option.
* DIR_EXPORT_PARENT: The parent of the directory
specified by DIR_EXPORT. (e.g., if /home/username/Pictures/TuxPaint/
is our export dir., we may need to make .../Pictures first,
the first time we export something.)
*/
@ -88,7 +93,7 @@ char *get_fname(const char *const name, int kind)
dir = savedir;
} else if (kind == DIR_DATA) {
dir = datadir;
} else if (kind == DIR_EXPORT) {
} else if (kind == DIR_EXPORT || kind == DIR_EXPORT_PARENT) {
dir = exportdir;
}
@ -97,6 +102,20 @@ char *get_fname(const char *const name, int kind)
dir, (*name) ? '/' : '\0', /* Some mkdir()'s don't like trailing slashes */
name);
if (kind == DIR_EXPORT_PARENT) {
int len, i, stop;
stop = -1;
len = strlen(f);
for (i = len - 1; i >= 0 && stop == -1; i--) {
if (f[i] == '/')
stop = i;
}
if (stop != -1) {
f[stop] = '\0';
}
}
return strdup(f);
}

View file

@ -1,7 +1,7 @@
/*
get_fname.h
Copyright (c) 2009 - July 25, 2020
Copyright (c) 2009 - January 13, 2021
http://www.tuxpaint.org/
This program is free software; you can redistribute it and/or modify
@ -34,7 +34,8 @@ enum
/* (See get_fname.c for details) */
DIR_SAVE,
DIR_DATA,
DIR_EXPORT
DIR_EXPORT,
DIR_EXPORT_PARENT
};
char *get_fname(const char *const name, int kind);

View file

@ -1,5 +1,5 @@
.\" tuxpaint.1 - 2020.12.27
.TH TUXPAINT 1 "27 December 2020" "0.9.26" "Tux Paint"
.\" tuxpaint.1 - 2021.01.13
.TH TUXPAINT 1 "13 January 2021" "0.9.26" "Tux Paint"
.SH NAME
tuxpaint -- "Tux Paint", a drawing program for young children.
@ -131,6 +131,8 @@ tuxpaint -- "Tux Paint", a drawing program for young children.
.br
[\-\-savedir \fIDIR\fP]
.br
[\-\-exportdir \fIDIR\fP]
.br
[\-\-datadir \fIDIR\fP]
.br
[\-\-saveover]
@ -484,7 +486,11 @@ Use the \fIalllocalefonts\fP option to load all such fonts, for use in the
.TP 8
.B \-\-savedir \fIDIR\fP
Specify where \fITux Paint\fP should save files.
Specify where \fITux Paint\fP should save and load its drawings.
.TP 8
.B \-\-exportdir \fIDIR\fP
Specify where \fITux Paint\fP should export drawings and animations.
.TP 8
.B \-\-datadir \fIDIR\fP

View file

@ -25963,9 +25963,16 @@ static char * get_export_filepath(const char * ext) {
/* Make sure the export dir exists */
if (!make_directory(DIR_EXPORT, "", "Can't create export directory (E016)"))
if (!make_directory(DIR_EXPORT, "", "Can't create export directory; will try to make its parent (E016)"))
{
return NULL;
/* See if perhaps we need to try and make its parent directory first? */
if (make_directory(DIR_EXPORT_PARENT, "", "Can't create export directory parent (E016b)")) {
if (!make_directory(DIR_EXPORT, "", "Can't create export directory (E016c)")) {
return NULL;
}
} else {
return NULL;
}
}
/* Create a unique filename, within that dir */