10
#if defined(__FreeBSD__) || defined(__OpenBSD__)
11
#include <sys/disklabel.h>
12
#include <sys/ioctl.h>
13
static int diskdev[] = {
31
isdisk(struct stat *st)
10
#if defined(__APPLE__)
14
disksize(int fd, struct stat *st)
21
ioctl(fd, DKIOCGETBLOCKSIZE, &bs);
22
ioctl(fd, DKIOCGETBLOCKCOUNT, &bc);
28
#elif defined(__FreeBSD__)
31
#include <sys/disklabel.h>
32
#include <sys/ioctl.h>
34
disksize(int fd, struct stat *st)
38
if(ioctl(fd, DIOCGMEDIASIZE, &mediasize) >= 0)
43
#elif defined(__OpenBSD__)
45
#include <sys/disklabel.h>
46
#include <sys/ioctl.h>
48
disksize(int fd, struct stat *st)
35
53
if(!S_ISCHR(st->st_mode))
37
dev = major(st->st_rdev);
38
for(i=0; i<nelem(diskdev); i++)
55
if(ioctl(fd, DIOCGDINFO, &lab) < 0)
57
n = minor(st->st_rdev)&7;
58
if(n >= lab.d_npartitions)
60
return (vlong)lab.d_partitions[n].p_size * lab.d_secsize;
43
#define _HAVEDISKLABEL
46
#if defined(__linux__)
63
#elif defined(__linux__)
47
64
#include <linux/hdreg.h>
48
65
#include <linux/fs.h>
49
66
#include <sys/ioctl.h>
51
68
#define major(dev) ((int)(((dev) >> 8) & 0xff))
53
disksize(int fd, int dev)
70
disksize(int fd, struct stat *st)
66
83
if(ioctl(fd, BLKGETSIZE, &l) >= 0)
68
85
if(ioctl(fd, HDIO_GETGEO, &geo) >= 0)
69
86
return (vlong)geo.heads*geo.sectors*geo.cylinders*512;
75
#if !defined(__linux__) && !defined(__sun__)
92
disksize(int fd, struct stat *st)
98
int _p9usepwlibrary = 1;
80
100
* Caching the last group and passwd looked up is
81
101
* a significant win (stupidly enough) on most systems.
123
143
if(p && st->st_uid == uid && p->pw_uid == uid)
145
else if(_p9usepwlibrary){
126
146
p = getpwuid(st->st_uid);
127
147
uid = st->st_uid;
149
if(p == nil || st->st_uid != uid || p->pw_uid != uid){
130
150
snprint(tmp, sizeof tmp, "%d", (int)st->st_uid);
146
166
if(g && st->st_gid == gid && g->gr_gid == gid)
168
else if(_p9usepwlibrary){
149
169
g = getgrgid(st->st_gid);
150
170
gid = st->st_gid;
172
if(g == nil || st->st_gid != gid || g->gr_gid != gid){
153
173
snprint(tmp, sizeof tmp, "%d", (int)st->st_gid);
173
193
#ifdef _HAVESTGEN
174
194
d->qid.vers = st->st_gen;
197
d->qid.vers = st->st_mtime + st->st_ctime;
176
198
d->mode = st->st_mode&0777;
177
199
d->atime = st->st_atime;
178
200
d->mtime = st->st_mtime;
179
201
d->length = st->st_size;
181
if(S_ISDIR(st->st_mode)){
203
if(S_ISLNK(lst->st_mode)){ /* yes, lst not st */
204
d->mode |= DMSYMLINK;
205
d->length = lst->st_size;
207
else if(S_ISDIR(st->st_mode)){
183
209
d->mode |= DMDIR;
184
210
d->qid.type = QTDIR;
186
if(S_ISLNK(lst->st_mode)) /* yes, lst not st */
187
d->mode |= DMSYMLINK;
188
if(S_ISFIFO(st->st_mode))
212
else if(S_ISFIFO(st->st_mode))
189
213
d->mode |= DMNAMEDPIPE;
190
if(S_ISSOCK(st->st_mode))
214
else if(S_ISSOCK(st->st_mode))
191
215
d->mode |= DMSOCKET;
192
if(S_ISBLK(st->st_mode)){
216
else if(S_ISBLK(st->st_mode)){
193
217
d->mode |= DMDEVICE;
194
218
d->qid.path = ('b'<<16)|st->st_rdev;
196
if(S_ISCHR(st->st_mode)){
220
else if(S_ISCHR(st->st_mode)){
197
221
d->mode |= DMDEVICE;
198
222
d->qid.path = ('c'<<16)|st->st_rdev;
200
224
/* fetch real size for disks */
202
if(S_ISBLK(st->st_mode) && (fd = open(name, O_RDONLY)) >= 0){
203
d->length = disksize(fd, major(st->st_dev));
207
#ifdef _HAVEDISKLABEL
210
struct disklabel lab;
212
if((fd = open(name, O_RDONLY)) < 0)
214
if(ioctl(fd, DIOCGDINFO, &lab) < 0)
216
n = minor(st->st_rdev)&7;
217
if(n >= lab.d_npartitions)
220
d->length = (vlong)(lab.d_partitions[n].p_size) * lab.d_secsize;
225
if(S_ISBLK(lst->st_mode) || S_ISCHR(lst->st_mode)){
226
if((fd = open(name, O_RDONLY)) >= 0){
227
d->length = disksize(fd, st);