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;
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++;
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++;
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)
{
if((path = sprintf2("%s/%s", p, gname)) != NULL)
{
- if(!access(path, F_OK))
+ if(!access(path, mode))
{
free(etcpath);
return(path);
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)
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);