X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Futils.c;h=5f2c03a4f2e5eb99d4b9f87e4dab9f298d9d2789;hb=3e0252c1448d505c1f2c58ba8024d5026529ff60;hp=38e3ac95ec9830d64f62b611d45780dc79dc449c;hpb=edccab15098b6bc9f8fb81ba219b556a60bc6c4a;p=doldaconnect.git diff --git a/daemon/utils.c b/daemon/utils.c index 38e3ac9..5f2c03a 100644 --- a/daemon/utils.c +++ b/daemon/utils.c @@ -720,21 +720,30 @@ char *getetcpath(char *binpath) return(etcpath); } -char *findfile(char *gname, char *uname, char *homedir) +char *findfile(char *gname, char *uname, char *homedir, int filldef) { char *path, *binpath, *etcpath, *p; + struct passwd *pw; + int mode; - if((homedir != NULL) && ((path = sprintf2("%s/.%s", homedir, uname)) != NULL)) - { - if(!access(path, F_OK)) - return(path); - free(path); + mode = R_OK | (filldef ? W_OK : 0); + if(uname != NULL) { + if(homedir == NULL) + homedir = getenv("HOME"); + if((homedir == NULL) && ((pw = getpwuid(getuid())) != NULL)) + homedir = pw->pw_dir; + if((homedir != NULL) && ((path = sprintf2("%s/.%s", homedir, uname)) != NULL)) + { + if(!access(path, mode)) + return(path); + free(path); + } } if(gname != NULL) { if(strchr(gname, '/') != NULL) { - if(!access(gname, F_OK)) + if(!access(gname, mode)) return(sstrdup(gname)); } else { if((binpath = getenv("PATH")) == NULL) @@ -745,7 +754,7 @@ char *findfile(char *gname, char *uname, char *homedir) { if((path = sprintf2("%s/%s", p, gname)) != NULL) { - if(!access(path, F_OK)) + if(!access(path, mode)) { free(etcpath); return(path); @@ -756,7 +765,13 @@ char *findfile(char *gname, char *uname, char *homedir) free(etcpath); } } - return(NULL); + if(filldef) { + if(uname && homedir) + return(sprintf2("%s/.%s", homedir, uname)); + return(sprintf2("/etc/%s", gname)); + } else { + return(NULL); + } } struct wcspair *newwcspair(wchar_t *key, wchar_t *val, struct wcspair **list)