#include #define NOPLAN9DEFINES #include #include #include #include #include #include #if defined(__FreeBSD__) #include static int diskdev[] = { 151, /* aacd */ 116, /* ad */ 157, /* ar */ 118, /* afd */ 133, /* amrd */ 13, /* da */ 102, /* fla */ 109, /* idad */ 95, /* md */ 131, /* mlxd */ 168, /* pst */ 147, /* twed */ 43, /* vn */ 3, /* wd */ 87, /* wfd */ }; static int isdisk(struct stat *st) { int i, dev; if(!S_ISCHR(st->st_mode)) return 0; dev = major(st->st_rdev); for(i=0; i estr) d->name = "oops"; else{ strcpy(*str, s); d->name = *str; *str += strlen(*str)+1; } } sz += strlen(s)+1; /* user */ if(p && st->st_uid == uid && p->pw_uid == uid) ; else{ p = getpwuid(st->st_uid); uid = st->st_uid; } if(p == nil){ snprint(tmp, sizeof tmp, "%d", (int)st->st_uid); s = tmp; }else s = p->pw_name; sz += strlen(s)+1; if(d){ if(*str+strlen(s)+1 > estr) d->uid = "oops"; else{ strcpy(*str, s); d->uid = *str; *str += strlen(*str)+1; } } /* group */ if(g && st->st_gid == gid && g->gr_gid == gid) ; else{ g = getgrgid(st->st_gid); gid = st->st_gid; } if(g == nil){ snprint(tmp, sizeof tmp, "%d", (int)st->st_gid); s = tmp; }else s = g->gr_name; sz += strlen(s)+1; if(d){ if(*str + strlen(s)+1 > estr) d->gid = "oops"; else{ strcpy(*str, s); d->gid = *str; *str += strlen(*str)+1; } } if(d){ d->type = 'M'; d->muid = ""; d->qid.path = ((uvlong)st->st_dev<<32) | st->st_ino; #ifdef _HAVESTGEN d->qid.vers = st->st_gen; #endif d->mode = st->st_mode&0777; d->atime = st->st_atime; d->mtime = st->st_mtime; d->length = st->st_size; if(S_ISDIR(st->st_mode)){ d->length = 0; d->mode |= DMDIR; d->qid.type = QTDIR; } /* fetch real size for disks */ #ifdef _HAVEDISKLABEL if(isdisk(st)){ int fd, n; struct disklabel lab; if((fd = open(name, O_RDONLY)) < 0) goto nosize; if(ioctl(fd, DIOCGDINFO, &lab) < 0) goto nosize; n = minor(st->st_rdev)&7; if(n >= lab.d_npartitions) goto nosize; d->length = (vlong)(lab.d_partitions[n].p_size) * lab.d_secsize; nosize: if(fd >= 0) close(fd); } #endif } return sz; }