Add owner concept to fnetnodes.
[doldaconnect.git] / daemon / utils.c
index 1175970..5f2c03a 100644 (file)
@@ -126,6 +126,19 @@ wchar_t *swprintf2(wchar_t *format, ...)
     return(buf);
 }
 
+int havecharset(char *charset)
+{
+    iconv_t cd;
+    
+    if((cd = iconv_open("wchar_t", charset)) == (iconv_t)-1)
+       return(0);
+    iconv_close(cd);
+    if((cd = iconv_open(charset, "wchar_t")) == (iconv_t)-1)
+       return(0);
+    iconv_close(cd);
+    return(1);
+}
+
 wchar_t *icmbstowcs(char *mbs, char *charset)
 {
     int ret;
@@ -190,7 +203,7 @@ wchar_t *icsmbstowcs(char *mbs, char *charset, wchar_t *def)
        free(buf);
     if((buf = icmbstowcs(mbs, charset)) == NULL)
     {
-       if(*def == '~')
+       if((def != NULL) && (*def == L'~'))
        {
            flog(LOG_WARNING, "icsmbstowcs: could not convert wcs string into charset %s: %s", charset, strerror(errno));
            def++;
@@ -264,7 +277,7 @@ char *icswcstombs(wchar_t *wcs, char *charset, char *def)
        free(buf);
     if((buf = icwcstombs(wcs, charset)) == NULL)
     {
-       if(*def == '~')
+       if((def != NULL) && (*def == '~'))
        {
            flog(LOG_WARNING, "icswcstombs: could not convert mbs string from charset %s: %s", charset, strerror(errno));
            def++;
@@ -707,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)
@@ -732,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);
@@ -743,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)
@@ -768,12 +796,27 @@ struct wcspair *newwcspair(wchar_t *key, wchar_t *val, struct wcspair **list)
 
 void freewcspair(struct wcspair *pair, struct wcspair **list)
 {
-    if(list != NULL)
+    struct wcspair *cur;
+    
+    for(cur = *list; cur != NULL; list = &(cur->next), cur = cur->next)
     {
-       if(*list == pair)
-           *list = pair->next;
+       if(cur == pair)
+       {
+           *list = cur->next;
+           break;
+       }
     }
     free(pair->key);
     free(pair->val);
     free(pair);
 }
+
+wchar_t *wpfind(struct wcspair *list, wchar_t *key)
+{
+    for(; list != NULL; list = list->next)
+    {
+       if(!wcscmp(list->key, key))
+           return(list->val);
+    }
+    return(NULL);
+}