X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fcnid_dbd%2Fpack.c;h=2e9a32eec6a62234ad6cee93f084794d9accd620;hb=321a0107c48da7b3fbf895a2b32244174c1ff39c;hp=eb90d85809b5f45af70e5736e7990e8d1beb26eb;hpb=ba93992178626137806dfb7568a11d3b21d82fc8;p=netatalk.git diff --git a/etc/cnid_dbd/pack.c b/etc/cnid_dbd/pack.c index eb90d858..2e9a32ee 100644 --- a/etc/cnid_dbd/pack.c +++ b/etc/cnid_dbd/pack.c @@ -8,19 +8,21 @@ #include "config.h" #endif /* HAVE_CONFIG_H */ -#include +#include #include -#ifdef HAVE_SYS_TYPES_H -#include -#endif /* HAVE_SYS_TYPES_H */ +#include #include -#include #include +#include +#include #include +#include #include "pack.h" +static const struct vol *volume; + /* --------------- */ /* * This implementation is portable, but could probably be faster by using htonl @@ -74,12 +76,31 @@ int devino(DB *dbp _U_, const DBT *pkey _U_, const DBT *pdata, DBT *skey) /* --------------- */ int idxname(DB *dbp _U_, const DBT *pkey _U_, const DBT *pdata, DBT *skey) { + static char buffer[MAXPATHLEN +2]; + uint16_t flags = CONV_TOLOWER; memset(skey, 0, sizeof(DBT)); - skey->data = (char *)pdata->data + CNID_NAME_OFS; - skey->size = strlen((char *)skey->data) + 1; + + if (convert_charset(volume->v_volcharset, + volume->v_volcharset, + volume->v_maccharset, + (char *)pdata->data + CNID_NAME_OFS, + strlen((char *)pdata->data + CNID_NAME_OFS), + buffer, + MAXPATHLEN, + &flags) == (size_t)-1) { + LOG(log_error, logtype_cnid, "idxname: conversion error"); + } + + skey->data = buffer; + skey->size = strlen(skey->data); return (0); } +void pack_setvol(const struct vol *vol) +{ + volume = vol; +} + /* The equivalent to make_cnid_data in the cnid library. Non re-entrant. We differ from make_cnid_data in that we never return NULL, rqst->name cannot ever cause start[] to overflow because name length is checked in libatalk. */