expose unix mode bits

This commit is contained in:
rsc 2005-02-08 20:17:02 +00:00
parent 0a22905232
commit 2acd6fa6ff
4 changed files with 28 additions and 10 deletions

View file

@ -181,6 +181,20 @@ _p9dir(struct stat *lst, struct stat *st, char *name, Dir *d, char **str, char *
d->qid.type = QTDIR; d->qid.type = QTDIR;
} }
if(S_ISLNK(st->st_mode))
d->mode |= DMSYMLINK;
if(S_ISFIFO(st->st_mode))
d->mode |= DMNAMEDPIPE;
if(S_ISSOCK(st->st_mode))
d->mode |= DMSOCKET;
if(S_ISBLK(st->st_mode)){
d->mode |= DMDEVICE;
d->qid.path = ('b'<<16)|st->st_rdev;
}
if(S_ISCHR(st->st_mode)){
d->mode |= DMDEVICE;
d->qid.path = ('c'<<16)|st->st_rdev;
}
/* fetch real size for disks */ /* fetch real size for disks */
#ifdef _HAVEDISKSIZE #ifdef _HAVEDISKSIZE
if(S_ISBLK(st->st_mode) && (fd = open(name, O_RDONLY)) >= 0){ if(S_ISBLK(st->st_mode) && (fd = open(name, O_RDONLY)) >= 0){

View file

@ -4,7 +4,7 @@
#include <sys/stat.h> #include <sys/stat.h>
extern int _p9dir(struct stat*, char*, Dir*, char**, char*); extern int _p9dir(struct stat*, struct stat*, char*, Dir*, char**, char*);
Dir* Dir*
dirfstat(int fd) dirfstat(int fd)
@ -18,7 +18,7 @@ dirfstat(int fd)
return nil; return nil;
snprint(tmp, sizeof tmp, "/dev/fd/%d", fd); snprint(tmp, sizeof tmp, "/dev/fd/%d", fd);
nstr = _p9dir(&st, tmp, nil, nil, nil); nstr = _p9dir(&st, &st, tmp, nil, nil, nil);
d = mallocz(sizeof(Dir)+nstr, 1); d = mallocz(sizeof(Dir)+nstr, 1);
if(d == nil) if(d == nil)
return nil; return nil;

View file

@ -4,7 +4,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <dirent.h> #include <dirent.h>
extern int _p9dir(struct stat*, char*, Dir*, char**, char*); extern int _p9dir(struct stat*, struct stat*, char*, Dir*, char**, char*);
#if defined(__linux__) #if defined(__linux__)
static int static int
@ -63,7 +63,7 @@ dirpackage(int fd, char *buf, int n, Dir **dp)
char *p, *str, *estr; char *p, *str, *estr;
int i, nstr, m; int i, nstr, m;
struct dirent *de; struct dirent *de;
struct stat st; struct stat st, lst;
Dir *d; Dir *d;
n = countde(buf, n); n = countde(buf, n);
@ -86,7 +86,7 @@ dirpackage(int fd, char *buf, int n, Dir **dp)
de->d_name[0] = 0; de->d_name[0] = 0;
else{ else{
st = lst; st = lst;
if((lst.st_mode&S_IFMT) == S_ISLNK) if((lst.st_mode&S_IFMT) == S_IFLNK)
stat(de->d_name, &st); stat(de->d_name, &st);
nstr += _p9dir(&lst, &st, de->d_name, nil, nil, nil); nstr += _p9dir(&lst, &st, de->d_name, nil, nil, nil);
} }
@ -106,8 +106,12 @@ dirpackage(int fd, char *buf, int n, Dir **dp)
m = 0; m = 0;
for(i=0; i<n; i++){ for(i=0; i<n; i++){
de = (struct dirent*)p; de = (struct dirent*)p;
if(de->d_name[0] != 0 && stat(de->d_name, &st) >= 0) if(de->d_name[0] != 0 && lstat(de->d_name, &st) >= 0){
_p9dir(&st, de->d_name, &d[m++], &str, estr); st = lst;
if((lst.st_mode&S_IFMT) == S_IFLNK)
stat(de->d_name, &st);
_p9dir(&lst, &st, de->d_name, &d[m++], &str, estr);
}
p += de->d_reclen; p += de->d_reclen;
} }

View file

@ -4,12 +4,12 @@
#include <sys/stat.h> #include <sys/stat.h>
extern int _p9dir(struct stat*, char*, Dir*, char**, char*); extern int _p9dir(struct stat*, struct stat*, char*, Dir*, char**, char*);
Dir* Dir*
dirstat(char *file) dirstat(char *file)
{ {
struct lstat lst; struct stat lst;
struct stat st; struct stat st;
int nstr; int nstr;
Dir *d; Dir *d;
@ -18,7 +18,7 @@ dirstat(char *file)
if(lstat(file, &lst) < 0) if(lstat(file, &lst) < 0)
return nil; return nil;
st = lst; st = lst;
if((lst.mode&S_IFMT) == S_ISLNK) if((lst.st_mode&S_IFMT) == S_IFLNK)
stat(file, &st); stat(file, &st);
nstr = _p9dir(&lst, &st, file, nil, nil, nil); nstr = _p9dir(&lst, &st, file, nil, nil, nil);