From: Goswin v. B. <gos...@we...> - 2011-06-15 18:08:30
|
Björn Haake <bjo...@it...> writes: > Hello, > > I was wondering if somebody can enlighten me... > > I have a constellation where I am doing an ls, triggering a readdir. I > was under the assumption that when I pass back the filler struct, that > a getattr would be called on each item in the list. But now I am > seeing just a getattr /* being processed. Is there something I need to > do in addition, so that the whole filler struct gets processed? This > only happens on RHEL 6 with Samba 3.5 (RHEL5 with Samba 3.0 and NFS > work fine). Could it be that you have an empty directory and are doing "ls mountpoint/*"? In that case bash will call ls with * not expanded and ls will stat "/*" and that is what you see. You also must have an ls alias or dircolors set. A plain ls shouln't call stat and therefor doesn't cause getattr calls if your readdir properly fills the data structures. > I have attached the relevant portions of my readdir function (the > first for loop is there for clarification - obviously I am getting the > array with one single JNI call). > > If someone could tell me where I need to pay attention in order to > receive the getattr on all the entries of readdir I'd be grateful Nothing there you need to pay attention too. That works automatically. > Thanks! > > bjorn > > > > // Readdir snippet > > // Use this array to store the filenames that we receive from JNI > > char** allFileNamesLocal = (char**) malloc( (arrayLength+1) * sizeof(char *)); > > > > // Loop over all entries and get JNI entry down to C > > for (arrCnt = 0; arrCnt < arrayLength; arrCnt++) { > > allFileNamesLocal[arrCnt] = (char *) malloc( sizeof(char) * (fnLen+1) ); > > fileName = (get from JNI) > > strcpy( allFileNamesLocal[arrCnt], fileName); > > } > > > > // fill the struct, start with the obvious > > filler(buf, ".", NULL, 0); > > filler(buf, "..", NULL, 0); > > > > // loop over all elements in our array > > // and fill buf > > for (i = 0; i< (elements); i++) { > > > > filler(buf, allFileNamesLocal[i], &stbuf, 0); You might want to check the return value. The buffer can be insufficient for larger directories. In that case you get repeated readdir calls with offset != 0. You also need to handle the case of seekdir calls which cause the next readdir to have offset != 0. So: handle offset != 0 properly. > if (allFileNamesLocal[i] != NULL) { > > free(allFileNamesLocal[i]); MfG Goswin |