Skip to content

Commit 0163d31

Browse files
committed
add "." and ".." in directory listings
1 parent 4289904 commit 0163d31

File tree

2 files changed

+51
-6
lines changed

2 files changed

+51
-6
lines changed

hl.c

+23-1
Original file line numberDiff line numberDiff line change
@@ -145,17 +145,39 @@ static int sqfs_hl_op_readdir(const char *path, void *buf,
145145
#ifdef SQFS_BROKEN_DIR_OFFSETS
146146
offset = 0;
147147
#endif
148+
149+
memset(&st, 0, sizeof(st));
150+
151+
st.st_mode = S_IFDIR;
152+
while (offset < 2) {
153+
/* fill "." for offset 0 and ".." for offset 1 */
154+
const char *name;
155+
if (offset == 0)
156+
name = ".";
157+
else
158+
name = "..";
159+
offset += 1;
160+
if (filler(buf, name, &st, (sqfs_off_t) offset
161+
#if FUSE_USE_VERSION >= 30
162+
, 0
163+
#endif
164+
)) {
165+
return 0;
166+
}
167+
}
168+
offset -= 2;
169+
148170
if (sqfs_dir_open(fs, inode, &dir, offset))
149171
return -EINVAL;
150172

151-
memset(&st, 0, sizeof(st));
152173
sqfs_dentry_init(&entry, namebuf);
153174
while (sqfs_dir_next(fs, &dir, &entry, &err)) {
154175
#ifdef SQFS_BROKEN_DIR_OFFSETS
155176
sqfs_off_t doff = 0;
156177
#else
157178
sqfs_off_t doff = sqfs_dentry_next_offset(&entry);
158179
#endif
180+
doff += 2; /* to skip "." and ".." */
159181
st.st_mode = sqfs_dentry_mode(&entry);
160182
if (filler(buf, sqfs_dentry_name(&entry), &st, doff
161183
#if FUSE_USE_VERSION >= 30

ll.c

+28-5
Original file line numberDiff line numberDiff line change
@@ -179,20 +179,43 @@ void sqfs_ll_op_readdir(fuse_req_t req, fuse_ino_t ino, size_t size,
179179
off_t dir_offset = off;
180180
#endif
181181

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)))
185184
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;
186209

187210
if (!err) {
188-
memset(&st, 0, sizeof(st));
189211
sqfs_dentry_init(&entry, namebuf);
190212
while (sqfs_dir_next(&lli->ll->fs, &dir, &entry, &sqerr)) {
191213
st.st_ino = lli->ll->ino_fuse_num(lli->ll, &entry);
192214
st.st_mode = sqfs_dentry_mode(&entry);
193215

216+
/* the offset +2 here is to skip "." and ".." */
194217
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);
196219

197220
#ifdef SQFS_BROKEN_DIR_OFFSETS
198221
/* We couldn't fast-forwards earlier, so manually skip entries instead */

0 commit comments

Comments
 (0)