X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Futils.c;h=38e3ac95ec9830d64f62b611d45780dc79dc449c;hb=c7185019854aa79630ff944e191f59582c675d8b;hp=c006b4f872afd3b2c3cb47dfc437e6cf5f09d13b;hpb=732471142064666ef8defeb70ad82281e9cbea4a;p=doldaconnect.git diff --git a/daemon/utils.c b/daemon/utils.c index c006b4f..38e3ac9 100644 --- a/daemon/utils.c +++ b/daemon/utils.c @@ -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++; @@ -533,6 +546,8 @@ char *base64decode(char *data, size_t *datalen) c = (int)(unsigned char)*data; if(c == '=') break; + if(c == '\n') + continue; if(base64rev[c] == -1) { if(buf != NULL) @@ -630,6 +645,8 @@ char *base32decode(char *data, size_t *datalen) c = (int)(unsigned char)*data; if(c == '=') break; + if(c == '\n') + continue; if(base32rev[c] == -1) { if(buf != NULL) @@ -741,3 +758,50 @@ char *findfile(char *gname, char *uname, char *homedir) } return(NULL); } + +struct wcspair *newwcspair(wchar_t *key, wchar_t *val, struct wcspair **list) +{ + struct wcspair *pair; + + pair = smalloc(sizeof(*pair)); + memset(pair, 0, sizeof(*pair)); + if(key != NULL) + pair->key = swcsdup(key); + if(val != NULL) + pair->val = swcsdup(val); + if(list == NULL) + { + pair->next = NULL; + } else { + pair->next = *list; + *list = pair; + } + return(pair); +} + +void freewcspair(struct wcspair *pair, struct wcspair **list) +{ + struct wcspair *cur; + + for(cur = *list; cur != NULL; list = &(cur->next), cur = cur->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); +}