(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)

769770

return false;

770771

}

771772772-

const char *get_lftp_home()

773+

const char *get_home()

773774

{

774775

static char *home=NULL;

775-776776

if(home)

777777

return 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();

785800

else

786801

return NULL;

787802

}

788803

else

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))

792813

return NULL;

793-794-

mkdir(home,0755);

795814

return 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+798870

const char *memrchr(const char *buf,char c,size_t len)

799871

{

800872

buf+=len;