src/simple.c
changeset 27 461be4cd34a3
parent 10 e74c23297b11
equal deleted inserted replaced
26:61668c57f4bb 27:461be4cd34a3
   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;