/*
- * Copyright (C) 2002 Rafal Lewczuk (rlewczuk@pronet.pl)
+ * Netatalk 2002 (c)
* Copyright (C) 1990, 1993 Regents of The University of Michigan
* All Rights Reserved. See COPYRIGHT
*/
* libatalk/afpd functions only when it is really needed, mainly while
* returning some non-UNIX information or filtering by non-UNIX criteria.
*
+ * Initial version written by Rafal Lewczuk <rlewczuk@pronet.pl>
+ *
*/
#ifdef HAVE_CONFIG_H
#include <errno.h>
#include <syslog.h>
#include <unistd.h>
+#include <ctype.h>
#if STDC_HEADERS
#include <string.h>
#include <atalk/adouble.h>
#ifdef CNID_DB
#include <atalk/cnid.h>
-#endif /* DID_MTAB */
+#endif /* CNID_DB */
#include "desktop.h"
#include "directory.h"
#include "file.h"
#include "filedir.h"
#include "fork.h"
-#ifdef DID_MTAB
-#include "parse-mtab.h"
-#endif /* DID_MTAB */
-
-#ifdef WITH_CATSEARCH
-
struct finderinfo {
u_int32_t f_type;
u_int32_t creator;
/* Check if we need to free (or release) dir structures */
} else
return dsidx - 1;
- } // while
+ }
return -1;
} /* reducestack() */
{
struct dir *dir, *curdir;
struct stat statbuf;
+ char* mname = NULL;
if (dstack[cidx].dir != NULL)
return 1;
return 0;
}
- if (!dir && ((dir = adddir(vol, curdir, dstack[cidx].lname, strlen(dstack[cidx].lname),
+ mname = utompath(vol, dstack[cidx].lname);
+ if (!dir && ((dir = adddir(vol, curdir, mname, strlen(mname),
dstack[cidx].path, strlen(dstack[cidx].path), &statbuf)) == NULL))
return 0;
dstack[cidx].dir = dir;
} /* resolve_dir */
/* Looks up for an opened adouble structure, opens resource fork of selected file. */
-static struct adouble *adl_lkup(struct vol *vol, char *upath, int cidx)
+static struct adouble *adl_lkup(char *upath, struct stat *sb)
{
static struct adouble ad;
struct adouble *adp;
- char *mpath = utompath(vol, upath);
struct ofork *of;
+ int isdir = S_ISDIR(sb->st_mode);
-/*
- //if (dstack[cidx].dir == NULL && !resolve_dir(vol, cidx))
- // return NULL;
-
- //if ((of = of_findname(vol, dstack[cidx].dir, mpath))) {
- // adp = of->of_ad;
- //} else {
- */
+ if (!isdir && (of = of_findname(upath, sb ))) {
+ adp = of->of_ad;
+ } else {
memset(&ad, 0, sizeof(ad));
adp = &ad;
- /* } */
+ }
- if ( ad_open( upath, ADFLAGS_HF, O_RDONLY, 0, adp) < 0 ) {
+ if ( ad_open( upath, ADFLAGS_HF | (isdir)?ADFLAGS_DIR:0, O_RDONLY, 0, adp) < 0 ) {
return NULL;
}
return adp;
if (stat(uname, &sbuf) < 0)
return 0;
- if (S_ISDIR(sbuf.st_mode))
+ if (S_ISDIR(sbuf.st_mode)) {
r = 2;
-
+ if (!c1.dbitmap)
+ return r;
+ }
+ else if (!c1.fbitmap)
+ return 0;
+
/* Kind of optimization:
* -- first check things we've already have - filename
* -- last check things we get from ad_open()
/* Check for creation date... */
if (c1.rbitmap & (1<<DIRPBIT_CDATE)) {
- if (adp || (adp = adl_lkup(vol, uname, cidx))) {
+ if (adp || (adp = adl_lkup(uname, &sbuf))) {
if (ad_getdate(adp, AD_DATE_CREATE, (u_int32_t*)&c_date) >= 0)
c_date = AD_DATE_TO_UNIX(c_date);
else c_date = sbuf.st_mtime;
/* Check for backup date... */
if (c1.rbitmap & (1<<DIRPBIT_BDATE)) {
- if (adp || (adp == adl_lkup(vol, uname, cidx))) {
+ if (adp || (adp == adl_lkup(uname, &sbuf))) {
if (ad_getdate(adp, AD_DATE_BACKUP, (u_int32_t*)&b_date) >= 0)
b_date = AD_DATE_TO_UNIX(b_date);
else b_date = sbuf.st_mtime;
}
/* Check attributes */
- if ((c1.rbitmap & (1<<DIRPBIT_ATTR)) && c2.attr != 0)
- if (adp || (adp = adl_lkup(vol, uname, cidx))) {
+ if ((c1.rbitmap & (1<<DIRPBIT_ATTR)) && c2.attr != 0) {
+ if (adp || (adp = adl_lkup(uname, &sbuf))) {
ad_getattr(adp, &attr);
if ((attr & c2.attr) != c1.attr)
goto crit_check_ret;
} else goto crit_check_ret;
+ }
/* Check file type ID */
- if ((c1.rbitmap & (1<<DIRPBIT_FINFO)) && c2.finfo.f_type != 0)
- if (adp || (adp = adl_lkup(vol, uname, cidx))) {
+ if ((c1.rbitmap & (1<<DIRPBIT_FINFO)) && c2.finfo.f_type != 0) {
+ if (adp || (adp = adl_lkup(uname, &sbuf))) {
finfo = (struct finderinfo*)ad_entry(adp, ADEID_FINDERI);
if (finfo->f_type != c1.finfo.f_type)
goto crit_check_ret;
} else goto crit_check_ret;
+ }
/* Check creator ID */
- if ((c1.rbitmap & (1<<DIRPBIT_FINFO)) && c2.finfo.creator != 0)
- if (adp || (adp = adl_lkup(vol, uname, cidx))) {
+ if ((c1.rbitmap & (1<<DIRPBIT_FINFO)) && c2.finfo.creator != 0) {
+ if (adp || (adp = adl_lkup(uname, &sbuf))) {
finfo = (struct finderinfo*)ad_entry(adp, ADEID_FINDERI);
if (finfo->creator != c1.finfo.creator)
goto crit_check_ret;
} else goto crit_check_ret;
+ }
/* Check finder info attributes */
- if ((c1.rbitmap & (1<<DIRPBIT_FINFO)) && c2.finfo.attrs != 0)
- if (adp || (adp = adl_lkup(vol, uname, cidx))) {
+ if ((c1.rbitmap & (1<<DIRPBIT_FINFO)) && c2.finfo.attrs != 0) {
+ if (adp || (adp = adl_lkup(uname, &sbuf))) {
finfo = (struct finderinfo*)ad_entry(adp, ADEID_FINDERI);
if ((finfo->attrs & c2.finfo.attrs) != c1.finfo.attrs)
goto crit_check_ret;
} else goto crit_check_ret;
+ }
/* Check label */
- if ((c1.rbitmap & (1<<DIRPBIT_FINFO)) && c2.finfo.label != 0)
- if (adp || (adp = adl_lkup(vol, uname, cidx))) {
+ if ((c1.rbitmap & (1<<DIRPBIT_FINFO)) && c2.finfo.label != 0) {
+ if (adp || (adp = adl_lkup(uname, &sbuf))) {
finfo = (struct finderinfo*)ad_entry(adp, ADEID_FINDERI);
if ((finfo->label & c2.finfo.label) != c1.finfo.label)
goto crit_check_ret;
} else goto crit_check_ret;
+ }
/* FIXME: Attributes check ! */
static int rslt_add(struct vol *vol, struct stat *statbuf, char *fname, short cidx, int isdir, char **rbuf)
{
char *p = *rbuf;
- int l = fname != NULL ? strlen(fname) : 0;
+ char *savefname = (fname != NULL) ? strdup (fname) : NULL;
+ int l = savefname != NULL ? strlen(savefname) : 0;
u_int32_t did;
char p0;
}
/* Fill offset of returned file name */
- if (fname != NULL) {
- *p++ = 0;
- *p++ = (int)(p - *rbuf) + 1;
+ if (savefname != NULL) {
+ *p = 0;
+ p += 1;
+ *p = (int)(p - *rbuf) - 1;
+ p += 1;
p[0] = l;
- strcpy(p+1, fname);
+ strcpy(p+1, savefname);
p += l + 1;
}
*rbuf = p;
/* *rbuf[0] = (int)(p-*rbuf); */
+ if (savefname != NULL)
+ free (savefname);
return 1;
} /* rslt_add */
u_int32_t rmatches, reserved;
u_int32_t catpos[4];
u_int32_t pdid = 0;
- char *lname = NULL;
- struct dir *dir;
int ret, rsize, i = 0;
u_int32_t nrecs = 0;
- static int nrr = 1;
char *spec1, *spec2, *bspec1, *bspec2;
memset(&c1, 0, sizeof(c1));
ibuf += sizeof(c1.fbitmap);
memcpy(&c1.dbitmap, ibuf, sizeof(c1.dbitmap));
- c1.dbitmap = c2.dbitmap = ntohl(c1.dbitmap);
+ c1.dbitmap = c2.dbitmap = ntohs(c1.dbitmap);
ibuf += sizeof(c1.dbitmap);
memcpy(&c1.rbitmap, ibuf, sizeof(c1.rbitmap));
/* File attribute bits... */
if (c1.rbitmap & (1 << FILPBIT_ATTR)) {
- memcpy(&c1.attr, ibuf, sizeof(c1.attr));
+ memcpy(&c1.attr, spec1, sizeof(c1.attr));
spec1 += sizeof(c1.attr);
c1.attr = ntohs(c1.attr);
- memcpy(&c2.attr, ibuf, sizeof(c2.attr));
+ memcpy(&c2.attr, spec2, sizeof(c2.attr));
spec2 += sizeof(c1.attr);
c2.attr = ntohs(c2.attr);
}
}
/* Finder info */
- if (c1.rbitmap * (1 << FILPBIT_FINFO)) {
+ if (c1.rbitmap & (1 << FILPBIT_FINFO)) {
memcpy(&c1.finfo, spec1, sizeof(c1.finfo));
spec1 += sizeof(c1.finfo);
memcpy(&c2.finfo, spec2, sizeof(c2.finfo));
spec2 += sizeof(c2.finfo);
} /* Finder info */
- /* Offspring count - only directories */
- if (c1.dbitmap != 0 && (c1.rbitmap & (1 << DIRPBIT_OFFCNT)) != 0) {
+ if ((c1.rbitmap & (1 << DIRPBIT_OFFCNT)) != 0) {
+ /* Offspring count - only directories */
+ if (c1.fbitmap == 0) {
memcpy(&c1.offcnt, spec1, sizeof(c1.offcnt));
spec1 += sizeof(c1.offcnt);
c1.offcnt = ntohs(c1.offcnt);
memcpy(&c2.offcnt, spec2, sizeof(c2.offcnt));
spec2 += sizeof(c2.offcnt);
c2.offcnt = ntohs(c2.offcnt);
- } /* Offspring count */
+ }
+ else if (c1.dbitmap == 0) {
+ /* ressource fork length */
+ }
+ else {
+ /* error */
+ }
+ } /* Offspring count/ressource fork length */
/* Long name */
if (c1.rbitmap & (1 << FILPBIT_LNAME)) {
/* Get the long filename */
memcpy(c1.lname, bspec1 + spec1[1] + 1, (bspec1 + spec1[1])[0]);
- c1.lname[(bspec1 + spec1[1])[0]]= 0;
+ c1.lname[(int) (bspec1 + spec1[1])[0]]= 0;
for (i = 0; c1.lname[i] != 0; i++)
c1.lname[i] = tolower(c1.lname[i]);
/* FIXME: do we need it ? It's always null ! */
memcpy(c2.lname, bspec2 + spec2[1] + 1, (bspec2 + spec2[1])[0]);
- c2.lname[(bspec2 + spec2[1])[0]]= 0;
+ c2.lname[(int) (bspec2 + spec2[1])[0]]= 0;
for (i = 0; c2.lname[i] != 0; i++)
c2.lname[i] = tolower(c2.lname[i]);
}
rbuf += sizeof(c1.fbitmap);
c1.dbitmap = htons(c1.dbitmap);
memcpy(rbuf, &c1.dbitmap, sizeof(c1.dbitmap));
- rbuf += sizeof(c2.dbitmap);
+ rbuf += sizeof(c1.dbitmap);
nrecs = htonl(nrecs);
memcpy(rbuf, &nrecs, sizeof(nrecs));
rbuf += sizeof(nrecs);
/* FIXME: we need a clean separation between afp stubs and 'real' implementation */
/* (so, all buffer packing/unpacking should be done in stub, everything else
should be done in other functions) */
-
-#endif
-/* WITH_CATSEARCH */
\ No newline at end of file