X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=etc%2Fafpd%2Fcatsearch.c;h=42790807cb9dde9e0cab793d6cacfe4149a472c8;hb=1b20936596f89b2706f1122ca2fabad6ffe00c98;hp=b20dcba9811d5c7dbc95a0149e413c23e4dc20a8;hpb=6dc1d33c33b947a2379654553f1e9740abbe324e;p=netatalk.git diff --git a/etc/afpd/catsearch.c b/etc/afpd/catsearch.c index b20dcba9..42790807 100644 --- a/etc/afpd/catsearch.c +++ b/etc/afpd/catsearch.c @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -112,6 +111,7 @@ struct dsitem { struct dir *dir; /* Structure describing this directory */ int pidx; /* Parent's dsitem structure index. */ int checked; /* Have we checked this directory ? */ + int path_len; char *path; /* absolute UNIX path to this directory */ }; @@ -131,7 +131,7 @@ static struct scrit c1, c2; /* search criteria */ static int addstack(char *uname, struct dir *dir, int pidx) { struct dsitem *ds; - int l; + size_t l, u; /* check if we have some space on stack... */ if (dsidx >= dssize) { @@ -145,22 +145,26 @@ static int addstack(char *uname, struct dir *dir, int pidx) ds = dstack + dsidx++; ds->dir = dir; ds->pidx = pidx; + ds->checked = 0; if (pidx >= 0) { - l = strlen(dstack[pidx].path); - if (!(ds->path = malloc(l + strlen(uname) + 2) )) + l = dstack[pidx].path_len; + u = strlen(uname) +1; + if (!(ds->path = malloc(l + u + 1) )) return -1; - strcpy(ds->path, dstack[pidx].path); - strcat(ds->path, "/"); - strcat(ds->path, uname); + memcpy(ds->path, dstack[pidx].path, l); + ds->path[l] = '/'; + memcpy(&ds->path[l+1], uname, u); + ds->path_len = l +u; + } + else { + ds->path = strdup(uname); + ds->path_len = strlen(uname); } - - ds->checked = 0; - return 0; } /* Removes checked items from top of directory stack. Returns index of the first unchecked elements or -1. */ -static int reducestack() +static int reducestack(void) { int r; if (save_cidx != -1) { @@ -180,7 +184,7 @@ static int reducestack() } /* Clears directory stack. */ -static void clearstack() +static void clearstack(void) { save_cidx = -1; while (dsidx > 0) { @@ -211,7 +215,7 @@ static struct adouble *adl_lkup(struct vol *vol, struct path *path, struct adoub adp = &ad; } - if ( ad_metadata( path->u_name, ((isdir)?ADFLAGS_DIR:0), adp) < 0 ) { + if ( ad_metadata( path->u_name, vol_noadouble(vol) | ((isdir)?ADFLAGS_DIR:0), adp) < 0 ) { adp = NULL; /* FIXME without resource fork adl_lkup will be call again */ } @@ -233,12 +237,13 @@ static struct finderinfo *unpack_buffer(struct finderinfo *finfo, char *buffer) /* -------------------- */ static struct finderinfo * -unpack_finderinfo(char *upath, struct adouble *adp, struct finderinfo *finfo) +unpack_finderinfo(struct vol *vol, struct path *path, struct adouble **adp, struct finderinfo *finfo, int islnk) { packed_finder buf; void *ptr; - ptr = get_finderinfo(upath, adp, &buf); + *adp = adl_lkup(vol, path, *adp); + ptr = get_finderinfo(vol, path->u_name, *adp, &buf,islnk); return unpack_buffer(finfo, ptr); } @@ -260,6 +265,8 @@ static int crit_check(struct vol *vol, struct path *path) { u_int32_t ac_date, ab_date; static char convbuf[514]; /* for convert_charset dest_len parameter +2 */ size_t len; + int islnk; + islnk=S_ISLNK(path->st.st_mode); if (S_ISDIR(path->st.st_mode)) { if (!c1.dbitmap) @@ -301,7 +308,7 @@ static int crit_check(struct vol *vol, struct path *path) { /* Check for filename */ if ((c1.rbitmap & (1<v_maccharset, CH_UCS2, path->m_name, strlen(path->m_name), convbuf, 512)) ) + if ( (size_t)(-1) == (len = convert_string(vol->v_maccharset, CH_UCS2, path->m_name, -1, convbuf, 512)) ) goto crit_check_ret; if ((c1.rbitmap & (1<u_name, adp, &finderinfo); + finfo = unpack_finderinfo(vol, path, &adp, &finderinfo,islnk); if (finfo->f_type != c1.finfo.f_type) goto crit_check_ret; } @@ -383,8 +389,7 @@ static int crit_check(struct vol *vol, struct path *path) { /* Check creator ID */ if ((c1.rbitmap & (1<u_name, adp, &finderinfo); + finfo = unpack_finderinfo(vol, path, &adp, &finderinfo,islnk); } if (finfo->creator != c1.finfo.creator) goto crit_check_ret; @@ -393,8 +398,7 @@ static int crit_check(struct vol *vol, struct path *path) { /* Check finder info attributes */ if ((c1.rbitmap & (1<u_name, adp, &finderinfo); + finfo = unpack_finderinfo(vol, path, &adp, &finderinfo,islnk); } if ((finfo->attrs & c2.finfo.attrs) != c1.finfo.attrs) @@ -404,8 +408,7 @@ static int crit_check(struct vol *vol, struct path *path) { /* Check label */ if ((c1.rbitmap & (1<u_name, adp, &finderinfo); + finfo = unpack_finderinfo(vol, path, &adp, &finderinfo,islnk); } if ((finfo->label & c2.finfo.label) != c1.finfo.label) goto crit_check_ret; @@ -425,7 +428,8 @@ static int rslt_add ( struct vol *vol, struct path *path, char **buf, int ext) { char *p = *buf; - int ret, tbuf =0; + int ret; + size_t tbuf =0; u_int16_t resultsize; int isdir = S_ISDIR(path->st.st_mode); @@ -484,7 +488,7 @@ static int rslt_add ( struct vol *vol, struct path *path, char **buf, int ext) * rbuf - output buffer * rbuflen - output buffer length */ -#define NUM_ROUNDS 100 +#define NUM_ROUNDS 200 static int catsearch(struct vol *vol, struct dir *dir, int rmatches, u_int32_t *pos, char *rbuf, u_int32_t *nrecs, int *rsize, int ext) { @@ -519,11 +523,10 @@ static int catsearch(struct vol *vol, struct dir *dir, dirpos = NULL; } - if (addstack("", dir, -1) == -1) { + if (addstack(vpath, dir, -1) == -1) { result = AFPERR_MISC; goto catsearch_end; } - dstack[0].path = strdup(vpath); /* FIXME: Sometimes DID is given by client ! (correct this one above !) */ } @@ -665,8 +668,8 @@ catsearch_end: /* Exiting catsearch: error condition */ } /* catsearch() */ /* -------------------------- */ -int catsearch_afp(AFPObj *obj _U_, char *ibuf, int ibuflen, - char *rbuf, int *rbuflen, int ext) +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; @@ -738,8 +741,8 @@ int catsearch_afp(AFPObj *obj _U_, char *ibuf, int ibuflen, } /* Parse file specifications */ - spec1 = ibuf; - spec2 = ibuf + spec_len + 2; + spec1 = (unsigned char*)ibuf; + spec2 = (unsigned char*)ibuf + spec_len + 2; spec1 += 2; spec2 += 2; @@ -829,7 +832,7 @@ int catsearch_afp(AFPObj *obj _U_, char *ibuf, int ibuflen, /* Get the long filename */ memcpy(tmppath, bspec1 + spec1[1] + 1, (bspec1 + spec1[1])[0]); tmppath[(bspec1 + spec1[1])[0]]= 0; - len = convert_string ( vol->v_maccharset, CH_UCS2, tmppath, strlen(tmppath), c1.lname, sizeof(c1.lname)); + len = convert_string ( vol->v_maccharset, CH_UCS2, tmppath, -1, c1.lname, sizeof(c1.lname)); if (len == (size_t)(-1)) return AFPERR_PARAM; @@ -887,15 +890,15 @@ int catsearch_afp(AFPObj *obj _U_, char *ibuf, int ibuflen, } /* catsearch_afp */ /* -------------------------- */ -int afp_catsearch (AFPObj *obj, char *ibuf, int ibuflen, - char *rbuf, int *rbuflen) +int afp_catsearch (AFPObj *obj, char *ibuf, size_t ibuflen, + char *rbuf, size_t *rbuflen) { return catsearch_afp( obj, ibuf, ibuflen, rbuf, rbuflen, 0); } -int afp_catsearch_ext (AFPObj *obj, char *ibuf, int ibuflen, - char *rbuf, int *rbuflen) +int afp_catsearch_ext (AFPObj *obj, char *ibuf, size_t ibuflen, + char *rbuf, size_t *rbuflen) { return catsearch_afp( obj, ibuf, ibuflen, rbuf, rbuflen, 1); }