static Spfcall* ufs_stat(Spfid *fid) { int err; Fid *f; Spfcall *ret; Spwstat wstat; f = fid->aux; err = fidstat(f); if (err < 0) create_rerror(err); ustat2npwstat(f->path, &f->stat, &wstat, fid->conn->dotu, fid->conn->srv->upool); ret = sp_create_rstat(&wstat, fid->conn->dotu); free(wstat.extension); return ret; }
static u32 npfs_read_dir(Fid *f, u8* buf, u64 offset, u32 count, int dotu) { int i, n, plen; char *dname, *path; struct dirent *dirent; struct stat st; Spwstat wstat; if (offset == 0) { rewinddir(f->dir); f->diroffset = 0; } plen = strlen(f->path); n = 0; dirent = NULL; dname = f->direntname; while (n < count) { if (!dname) { dirent = readdir(f->dir); if (!dirent) break; if (strcmp(dirent->d_name, ".") == 0 || strcmp(dirent->d_name, "..") == 0) continue; dname = dirent->d_name; } path = malloc(plen + strlen(dname) + 2); sprintf(path, "%s/%s", f->path, dname); if (lstat(path, &st) < 0) { free(path); create_rerror(errno); return 0; } ustat2npwstat(path, &st, &wstat, dotu); i = sp_serialize_stat(&wstat, buf + n, count - n - 1, dotu); free(wstat.extension); free(path); path = NULL; if (i==0) break; dname = NULL; n += i; } if (f->direntname) { free(f->direntname); f->direntname = NULL; } if (dirent) f->direntname = strdup(dirent->d_name); f->diroffset += n; return n; }