#include <atalk/bstradd.h>
#include <atalk/unicode.h>
#include <atalk/globals.h>
+#include <atalk/netatalk_conf.h>
#include "desktop.h"
#include "directory.h"
if (!isdir && (of = of_findname(path))) {
adp = of->of_ad;
} else {
- ad_init(&ad, vol->v_adouble, vol->v_ad_options);
+ ad_init(&ad, vol);
adp = &ad;
}
* An other option would be to call get_id in utompath but
* we need to pass parent dir
*/
- if (!(path->m_name = utompath(vol, path->u_name, 0 , utf8_encoding()) )) {
+ if (!(path->m_name = utompath(vol, path->u_name, 0 , utf8_encoding(vol->v_obj)) )) {
/*retry with the right id */
cnid_t id;
}
/* save the id for getfilparm */
path->id = id;
- if (!(path->m_name = utompath(vol, path->u_name, id , utf8_encoding()))) {
+ if (!(path->m_name = utompath(vol, path->u_name, id , utf8_encoding(vol->v_obj)))) {
return 0;
}
}
result |= 1;
crit_check_ret:
if (adp != NULL)
- ad_close_metadata(adp);
+ ad_close(adp, ADFLAGS_HF);
return result;
}
/* ------------------------------ */
-static int rslt_add ( struct vol *vol, struct path *path, char **buf, int ext)
+static int rslt_add (const AFPObj *obj, struct vol *vol, struct path *path, char **buf, int ext)
{
char *p = *buf;
}
if ( isdir ) {
- ret = getdirparams(vol, c1.dbitmap, path, path->d_dir, p , &tbuf );
+ ret = getdirparams(obj, vol, c1.dbitmap, path, path->d_dir, p , &tbuf );
}
else {
/* FIXME slow if we need the file ID, we already know it, done ? */
- ret = getfilparams ( vol, c1.fbitmap, path, path->d_dir, p, &tbuf);
+ ret = getfilparams (obj, vol, c1.fbitmap, path, path->d_dir, p, &tbuf);
}
if ( ret != AFP_OK )
* @param ext (r) extended search flag
*/
#define NUM_ROUNDS 200
-static int catsearch(struct vol *vol,
+static int catsearch(const AFPObj *obj,
+ struct vol *vol,
struct dir *dir,
int rmatches,
uint32_t *pos,
{
static uint32_t cur_pos; /* Saved position index (ID) - used to remember "position" across FPCatSearch calls */
static DIR *dirpos; /* UNIX structure describing currently opened directory. */
- struct dir *curdir; /* struct dir of current directory */
+ struct dir *currentdir; /* struct dir of current directory */
int cidx, r;
struct dirent *entry;
int result = AFP_OK;
start_time = time(NULL);
while ((cidx = reducestack()) != -1) {
+ LOG(log_debug, logtype_afpd, "catsearch: dir: \"%s\"", dstack[cidx].path);
+
error = lchdir(dstack[cidx].path);
if (!error && dirpos == NULL)
goto catsearch_end;
}
- if ((curdir = dirlookup_bypath(vol, dstack[cidx].path)) == NULL) {
+ if ((currentdir = dirlookup_bypath(vol, dstack[cidx].path)) == NULL) {
result = AFPERR_MISC;
goto catsearch_end;
}
+ LOG(log_debug, logtype_afpd, "catsearch: current struct dir: \"%s\"", cfrombstr(currentdir->d_fullpath));
while ((entry = readdir(dirpos)) != NULL) {
(*pos)++;
if (!check_dirent(vol, entry->d_name))
continue;
+ LOG(log_debug, logtype_afpd, "catsearch(\"%s\"): dirent: \"%s\"",
+ cfrombstr(currentdir->d_fullpath), entry->d_name);
+
memset(&path, 0, sizeof(path));
path.u_name = entry->d_name;
if (of_stat(&path) != 0) {
*/
int unlen = strlen(path.u_name);
path.d_dir = dircache_search_by_name(vol,
- curdir,
+ currentdir,
path.u_name,
unlen);
if (path.d_dir == NULL) {
/* path.m_name is set by adddir */
if ((path.d_dir = dir_add(vol,
- curdir,
+ currentdir,
&path,
unlen)) == NULL) {
result = AFPERR_MISC;
goto catsearch_end;
}
} else {
- path.d_dir = curdir;
+ path.d_dir = currentdir;
}
ccr = crit_check(vol, &path);
/* bit 0 means that criteria has been met */
if ((ccr & 1)) {
- r = rslt_add ( vol, &path, &rrbuf, ext);
+ r = rslt_add (obj, vol, &path, &rrbuf, ext);
if (r == 0) {
result = AFPERR_MISC;
* @param rsize (w) length of data written to output buffer
* @param ext (r) extended search flag
*/
-static int catsearch_db(struct vol *vol,
+static int catsearch_db(const AFPObj *obj,
+ struct vol *vol,
struct dir *dir,
const char *uname,
int rmatches,
memset(&path, 0, sizeof(path));
path.u_name = name;
- path.m_name = utompath(vol, name, cnid, utf8_encoding());
+ path.m_name = utompath(vol, name, cnid, utf8_encoding(vol->v_obj));
if (of_stat(&path) != 0) {
switch (errno) {
LOG(log_debug, logtype_afpd,"catsearch_db: match: %s/%s",
getcwdpath(), path.u_name);
/* bit 1 means that criteria has been met */
- r = rslt_add(vol, &path, &rrbuf, ext);
+ r = rslt_add(obj, vol, &path, &rrbuf, ext);
if (r == 0) {
result = AFPERR_MISC;
goto catsearch_end;
memcpy (c1.utf8name, spec1+2, namelen);
c1.utf8name[namelen] = 0;
- if ((uname = mtoupath(vol, c1.utf8name, 0, utf8_encoding())) == NULL)
+ if ((uname = mtoupath(vol, c1.utf8name, 0, utf8_encoding(obj))) == NULL)
return AFPERR_PARAM;
/* convert charset */
&& (strcmp(vol->v_cnidscheme, "dbd") == 0)
&& (vol->v_flags & AFPVOL_SEARCHDB))
/* we've got a name and it's a dbd volume, so search CNID database */
- ret = catsearch_db(vol, vol->v_root, uname, rmatches, &catpos[0], rbuf+24, &nrecs, &rsize, ext);
+ ret = catsearch_db(obj, vol, vol->v_root, uname, rmatches, &catpos[0], rbuf+24, &nrecs, &rsize, ext);
else
/* perform a slow filesystem tree search */
- ret = catsearch(vol, vol->v_root, rmatches, &catpos[0], rbuf+24, &nrecs, &rsize, ext);
+ ret = catsearch(obj, vol, vol->v_root, rmatches, &catpos[0], rbuf+24, &nrecs, &rsize, ext);
memcpy(rbuf, catpos, sizeof(catpos));
rbuf += sizeof(catpos);