@@ -179,20 +179,43 @@ void sqfs_ll_op_readdir(fuse_req_t req, fuse_ino_t ino, size_t size,
179
179
off_t dir_offset = off ;
180
180
#endif
181
181
182
- if (sqfs_dir_open (& lli -> ll -> fs , & lli -> inode , & dir , dir_offset ))
183
- err = EINVAL ;
184
- if (!err && !(bufpos = buf = malloc (size )))
182
+ memset (& st , 0 , sizeof (st ));
183
+ if (!(bufpos = buf = malloc (size )))
185
184
err = ENOMEM ;
185
+
186
+ if (!err ) {
187
+ /* if ino is set to any non-zero value fuse will override it */
188
+ st .st_ino = 1 ;
189
+ st .st_mode = S_IFDIR ;
190
+ while (dir_offset < 2 ) {
191
+ /* add "." for offset 0 and ".." for offset 1 */
192
+ const char * name ;
193
+ if (dir_offset == 0 )
194
+ name = "." ;
195
+ else
196
+ name = ".." ;
197
+ dir_offset += 1 ;
198
+ esize = sqfs_ll_add_direntry (req , bufpos , size , name , & st , dir_offset );
199
+ if (esize > size )
200
+ break ;
201
+ bufpos += esize ;
202
+ size -= esize ;
203
+ }
204
+ dir_offset -= 2 ;
205
+ }
206
+
207
+ if (!err && sqfs_dir_open (& lli -> ll -> fs , & lli -> inode , & dir , dir_offset ))
208
+ err = EINVAL ;
186
209
187
210
if (!err ) {
188
- memset (& st , 0 , sizeof (st ));
189
211
sqfs_dentry_init (& entry , namebuf );
190
212
while (sqfs_dir_next (& lli -> ll -> fs , & dir , & entry , & sqerr )) {
191
213
st .st_ino = lli -> ll -> ino_fuse_num (lli -> ll , & entry );
192
214
st .st_mode = sqfs_dentry_mode (& entry );
193
215
216
+ /* the offset +2 here is to skip "." and ".." */
194
217
esize = sqfs_ll_add_direntry (req , bufpos , size , sqfs_dentry_name (& entry ),
195
- & st , sqfs_dentry_next_offset (& entry ));
218
+ & st , sqfs_dentry_next_offset (& entry ) + 2 );
196
219
197
220
#ifdef SQFS_BROKEN_DIR_OFFSETS
198
221
/* We couldn't fast-forwards earlier, so manually skip entries instead */
0 commit comments