155 // check that it's a dir |
155 // check that it's a dir |
156 if (dir_node->mode_type != S_IFDIR) |
156 if (dir_node->mode_type != S_IFDIR) |
157 EERROR(err = ENOTDIR, "bad mode"); |
157 EERROR(err = ENOTDIR, "bad mode"); |
158 |
158 |
159 // fill in the dirbuf |
159 // fill in the dirbuf |
160 if (dirbuf_init(&buf, size)) |
160 if (dirbuf_init(&buf, size, off)) |
161 ERROR("failed to init dirbuf"); |
161 ERROR("failed to init dirbuf"); |
162 |
162 |
163 // add . and .. |
163 // add . and .. |
164 // we set the next offset to 2, because all dirent offsets will be larger than that |
164 // we set the next offset to 2, because all dirent offsets will be larger than that |
165 err = dirbuf_add(req, off, &buf, 0, 1, ".", dir_node->inode, S_IFDIR ) |
165 err = dirbuf_add(req, &buf, 0, 1, ".", dir_node->inode, S_IFDIR ) |
166 || dirbuf_add(req, off, &buf, 1, 2, "..", dir_node->inode, S_IFDIR ); |
166 || dirbuf_add(req, &buf, 1, 2, "..", dir_node->inode, S_IFDIR ); |
167 |
167 |
168 if (err != 0) |
168 if (err != 0) |
169 EERROR(err, "failed to add . and .. dirents"); |
169 EERROR(err, "failed to add . and .. dirents"); |
170 |
170 |
171 // look up all child nodes |
171 // look up all child nodes |
173 // skip non-children |
173 // skip non-children |
174 if (node->parent != dir_node->inode) |
174 if (node->parent != dir_node->inode) |
175 continue; |
175 continue; |
176 |
176 |
177 // child node offsets are just inode + 2 |
177 // child node offsets are just inode + 2 |
178 if ((err = dirbuf_add(req, off, &buf, node->inode + 2, node->inode + 3, node->name, node->inode, node->mode_type)) < 0) |
178 if ((err = dirbuf_add(req, &buf, node->inode + 2, node->inode + 3, node->name, node->inode, node->mode_type)) < 0) |
179 EERROR(err, "failed to add dirent for inode=%lu", node->inode); |
179 EERROR(err, "failed to add dirent for inode=%lu", node->inode); |
180 |
180 |
181 // stop if it's full |
181 // stop if it's full |
182 if (err > 0) |
182 if (err > 0) |
183 break; |
183 break; |