#define DS_BSIZE 128
static int save_cidx = -1; /* Saved index of currently scanned directory. */
-
static struct dsitem *dstack = NULL; /* Directory stack data... */
static int dssize = 0; /* Directory stack (allocated) size... */
static int dsidx = 0; /* First free item index... */
-
static struct scrit c1, c2; /* search criteria */
+/* Clears directory stack. */
+static void clearstack(void)
+{
+ save_cidx = -1;
+ while (dsidx > 0) {
+ dsidx--;
+ free(dstack[dsidx].path);
+ }
+}
+
/* Puts new item onto directory stack. */
static int addstack(char *uname, struct dir *dir, int pidx)
{
struct dsitem *ds;
size_t l, u;
+ struct dsitem *tmpds = NULL;
/* check if we have some space on stack... */
if (dsidx >= dssize) {
dssize += DS_BSIZE;
- dstack = realloc(dstack, dssize * sizeof(struct dsitem));
- if (dstack == NULL)
+ tmpds = realloc(dstack, dssize * sizeof(struct dsitem));
+ if (tmpds == NULL) {
+ clearstack();
+ free(dstack);
return -1;
+ }
+ dstack = tmpds;
}
/* Put new element. Allocate and copy lname and path. */
return -1;
}
-/* Clears directory stack. */
-static void clearstack(void)
-{
- save_cidx = -1;
- while (dsidx > 0) {
- dsidx--;
- free(dstack[dsidx].path);
- }
-}
-
/* Looks up for an opened adouble structure, opens resource fork of selected file.
* FIXME What about noadouble?
*/
* 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;
}
}
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) {
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 */
/* Call search */
*rbuflen = 24;
if ((c1.rbitmap & (1 << FILPBIT_PDINFO))
+ && !(c1.rbitmap & (1<<CATPBIT_PARTIAL))
&& (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 */