(get_lftp_{config,data,cache}_dir) new functions; use them. · lavv17/lftp@21dc400
@@ -32,6 +32,7 @@
3232#include <ctype.h>
3333#include <sys/ioctl.h>
3434#include <fcntl.h>
35+#include <pwd.h>
35363637#ifdef HAVE_TERMIOS_H
3738#include <termios.h>
@@ -769,32 +770,103 @@ bool temporary_network_error(int err)
769770return false;
770771}
771772772-const char *get_lftp_home()
773+const char *get_home()
773774{
774775static char *home=NULL;
775-776776if(home)
777777return home;
778+ home=getenv("HOME");
779+if(home)
780+return home;
781+struct passwd *pw=getpwuid(getuid());
782+if(pw && pw->pw_dir)
783+return home=pw->pw_dir;
784+return NULL;
785+}
778786779- home=getenv("LFTP_HOME");
780-if(!home)
787+const char *get_lftp_home_nocreate()
788+{
789+static char *lftp_home=NULL;
790+791+if(lftp_home)
792+return *lftp_home?lftp_home:NULL;
793+794+ lftp_home=getenv("LFTP_HOME");
795+if(!lftp_home)
781796 {
782-home=getenv("HOME");
783-if(home)
784-home=xstring::cat(home,"/.lftp",NULL).borrow();
797+const char *h=get_home();
798+if(h)
799+lftp_home=xstring::cat(h,"/.lftp",NULL).borrow();
785800else
786801return NULL;
787802 }
788803else
789-home=xstrdup(home);
804+lftp_home=xstrdup(lftp_home);
790805791-if(!*home)
806+return *lftp_home?lftp_home:NULL;
807+}
808+const char *get_lftp_home_if_exists()
809+{
810+const char *home=get_lftp_home_nocreate();
811+struct stat st;
812+if(stat(home,&st)==-1 || !S_ISDIR(st.st_mode))
792813return NULL;
793-794-mkdir(home,0755);
795814return home;
796815}
797816817+// new XDG directories
818+const char *get_lftp_dir(char *&cached_dir,const char *env,const char *def)
819+{
820+if(cached_dir)
821+return cached_dir;
822+823+// use old existing directory for compatibility
824+const char *dir=get_lftp_home_if_exists();
825+if(dir)
826+return cached_dir=xstrdup(dir);
827+828+// use explicit directory if specified, otherwise use default under home
829+const char *home=getenv(env);
830+if(home) {
831+// explicit XDG dir
832+ (void)mkdir(home,0755);
833+ dir=xstring::cat(home,"/lftp",NULL);
834+ } else {
835+ home=get_home();
836+if(!home)
837+return NULL;
838+ xstring& path=xstring::get_tmp(home);
839+ path.append('/');
840+const char *slash=strchr(def,'/');
841+if(slash) {
842+ path.append(def,slash-def);
843+ (void)mkdir(path,0755);
844+ path.append(slash);
845+ } else {
846+ path.append(def);
847+ }
848+ (void)mkdir(path,0755);
849+ dir=path.append("/lftp");
850+ }
851+ (void)mkdir(dir,0755);
852+return cached_dir=xstrdup(dir);
853+}
854+const char *get_lftp_config_dir()
855+{
856+static char *config_dir;
857+return get_lftp_dir(config_dir,"XDG_CONFIG_HOME",".config");
858+}
859+const char *get_lftp_data_dir()
860+{
861+static char *data_dir;
862+return get_lftp_dir(data_dir,"XDG_DATA_HOME",".local/share");
863+}
864+const char *get_lftp_cache_dir()
865+{
866+static char *cache_dir;
867+return get_lftp_dir(cache_dir,"XDG_CACHE_HOME",".cache");
868+}
869+798870const char *memrchr(const char *buf,char c,size_t len)
799871{
800872 buf+=len;