]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/catsearch.c
Merge master
[netatalk.git] / etc / afpd / catsearch.c
index 6a9161e2e8720743ca3cbbf4100b0980de9d34b0..ad28c6f668d4f36f539d1884c2bd61d3f83f2351 100644 (file)
 #include <atalk/util.h>
 #include <atalk/bstradd.h>
 #include <atalk/unicode.h>
+#include <atalk/globals.h>
 
 #include "desktop.h"
 #include "directory.h"
 #include "dircache.h"
 #include "file.h"
 #include "volume.h"
-#include "globals.h"
 #include "filedir.h"
 #include "fork.h"
 
 
 struct finderinfo {
-       u_int32_t f_type;
-       u_int32_t creator;
-       u_int16_t attrs;    /* File attributes (high 8 bits)*/
-       u_int16_t label;    /* Label (low 8 bits )*/
+       uint32_t f_type;
+       uint32_t creator;
+       uint16_t attrs;    /* File attributes (high 8 bits)*/
+       uint16_t label;    /* Label (low 8 bits )*/
        char reserved[22]; /* Unknown (at least for now...) */
 };
 
@@ -86,14 +86,14 @@ typedef char packed_finder[ADEDLEN_FINDERI];
 
 /* This is our search-criteria structure. */
 struct scrit {
-       u_int32_t rbitmap;          /* Request bitmap - which values should we check ? */
-       u_int16_t fbitmap, dbitmap; /* file & directory bitmap - which values should we return ? */
-       u_int16_t attr;             /* File attributes */
+       uint32_t rbitmap;          /* Request bitmap - which values should we check ? */
+       uint16_t fbitmap, dbitmap; /* file & directory bitmap - which values should we return ? */
+       uint16_t attr;             /* File attributes */
        time_t cdate;               /* Creation date */
        time_t mdate;               /* Last modification date */
        time_t bdate;               /* Last backup date */
-       u_int32_t pdid;             /* Parent DID */
-    u_int16_t offcnt;           /* Offspring count */
+       uint32_t pdid;             /* Parent DID */
+    uint16_t offcnt;           /* Offspring count */
        struct finderinfo finfo;    /* Finder info */
        char lname[64];             /* Long name */ 
        char utf8name[514];         /* UTF8 or UCS2 name */ /* for convert_charset dest_len parameter +2 */
@@ -210,7 +210,7 @@ static struct adouble *adl_lkup(struct vol *vol, struct path *path, struct adoub
        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;
        } 
 
@@ -257,11 +257,11 @@ unpack_finderinfo(struct vol *vol, struct path *path, struct adouble **adp, stru
  */
 static int crit_check(struct vol *vol, struct path *path) {
        int result = 0;
-       u_int16_t attr, flags = CONV_PRECOMPOSE;
+       uint16_t attr, flags = CONV_PRECOMPOSE;
        struct finderinfo *finfo = NULL, finderinfo;
        struct adouble *adp = NULL;
        time_t c_date, b_date;
-       u_int32_t ac_date, ab_date;
+       uint32_t ac_date, ab_date;
        static char convbuf[514]; /* for convert_charset dest_len parameter +2 */
        size_t len;
     int islnk;
@@ -418,7 +418,7 @@ static int crit_check(struct vol *vol, struct path *path) {
        result |= 1;
 crit_check_ret:
        if (adp != NULL)
-               ad_close_metadata(adp);
+               ad_close(adp, ADFLAGS_HF);
        return result;
 }  
 
@@ -429,7 +429,7 @@ static int rslt_add ( struct vol *vol, struct path *path, char **buf, int ext)
        char            *p = *buf;
        int             ret;
        size_t          tbuf =0;
-       u_int16_t       resultsize;
+       uint16_t        resultsize;
        int             isdir = S_ISDIR(path->st.st_mode); 
 
        /* Skip resultsize */
@@ -502,9 +502,9 @@ static int catsearch(struct vol *vol,
                      int *rsize,
                      int ext)
 {
-    static u_int32_t cur_pos;    /* Saved position index (ID) - used to remember "position" across FPCatSearch calls */
+    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;
@@ -550,6 +550,8 @@ static int catsearch(struct vol *vol,
     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)
@@ -576,10 +578,11 @@ static int catsearch(struct vol *vol,
                        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)++;
@@ -587,6 +590,9 @@ static int catsearch(struct vol *vol,
                        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) {
@@ -611,14 +617,13 @@ static int catsearch(struct vol *vol,
                                */
                 int unlen = strlen(path.u_name);
                 path.d_dir = dircache_search_by_name(vol,
-                                                     curdir,
+                                                     currentdir,
                                                      path.u_name,
-                                                     unlen,
-                                                     path.st.st_ctime);
+                                                     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;
@@ -632,7 +637,7 @@ static int catsearch(struct vol *vol,
                                        goto catsearch_end;
                                } 
             } else {
-               path.d_dir = curdir;
+               path.d_dir = currentdir;
             }
 
                        ccr = crit_check(vol, &path);
@@ -841,17 +846,17 @@ static int catsearch_afp(AFPObj *obj _U_, char *ibuf, size_t ibuflen,
                   char *rbuf, size_t *rbuflen, int ext)
 {
     struct vol *vol;
-    u_int16_t   vid;
-    u_int16_t   spec_len;
-    u_int32_t   rmatches, reserved;
-    u_int32_t  catpos[4];
-    u_int32_t   pdid = 0;
+    uint16_t   vid;
+    uint16_t   spec_len;
+    uint32_t   rmatches, reserved;
+    uint32_t   catpos[4];
+    uint32_t   pdid = 0;
     int ret, rsize;
-    u_int32_t nrecs = 0;
+    uint32_t nrecs = 0;
     unsigned char *spec1, *spec2, *bspec1, *bspec2;
     size_t     len;
-    u_int16_t  namelen;
-    u_int16_t  flags;
+    uint16_t   namelen;
+    uint16_t   flags;
     char           tmppath[256];
     char        *uname;