5
/* $Id: stat.c,v 1.20.10.3 2007-08-30 18:19:44 manoj Exp $ */
10
#if defined(CRAY) && defined(__crayx1)
18
* determines directory path for a given file
20
int elio_dirname(const char *fname, char *dirname, int len)
22
size_t flen = strlen(fname);
25
ELIO_ERROR(LONGFAIL,flen);
28
while(fname[flen] != '/' && fname[flen] != '\\' && flen >0 ) flen--;
30
while(fname[flen] != '/' && flen >0 ) flen--;
33
if(flen==0)strcpy(dirname,".");
34
else {strncpy(dirname, fname, flen); dirname[flen]=(char)0;}
45
* determine drive name given the file path name
47
char* elio_drivename(const char* fname)
50
static char path[_MAX_PATH];
51
static char drive[_MAX_DRIVE];
53
if( _fullpath(path,fname,_MAX_PATH) == NULL) return NULL;
54
_splitpath(path, drive, NULL, NULL, NULL);
59
void get_avail_space(int dev, avail_t *avail, int* bsize)
61
static char drive[4]="A:\\";
62
int sectors, cfree, ctotal;
65
GetDiskFreeSpace(drive, §ors, bsize, &cfree, &ctotal);
66
*avail = sectors*(avail_t)cfree;
73
* Stat a file (or path) to determine it's filesystem info
75
int elio_stat(char *fname, stat_t *statinfo)
80
struct STATVFS ufs_statfs;
82
PABLO_start(PABLO_elio_stat);
84
if(stat(fname, &ufs_stat) != 0)
85
ELIO_ERROR(STATFAIL, 1);
88
/* fprintf(stderr,"filesystem %d\n",ufs_stat.st_vfstype);*/
89
/* according to /etc/vfs, "9" means piofs */
90
if(ufs_stat.st_vfstype == 9) statinfo->fs = ELIO_PIOFS;
94
statinfo->fs = ELIO_UFS;
96
/* only regular or directory files are OK */
97
if(!S_ISREG(ufs_stat.st_mode) && !S_ISDIR(ufs_stat.st_mode))
98
ELIO_ERROR(TYPEFAIL, 1);
100
# if defined(CRAY) || defined(NEC)
101
if(statfs(fname, &ufs_statfs, sizeof(ufs_statfs), 0) != 0)
102
# elif defined (CATAMOUNT)
103
statinfo->avail =2*1024*1024*128;
106
if(STATVFS(fname, &ufs_statfs) != 0)
108
ELIO_ERROR(STATFAIL,1);
112
get_avail_space(ufs_statfs.st_dev, &(statinfo->avail), &bsize);
115
/* get number of available blocks */
116
# if defined(CRAY) || defined(NEC)
117
/* f_bfree == f_bavail -- naming changes */
120
if(ufs_statfs.f_secnfree != 0) /* check for secondary partition */
121
statinfo->avail = (avail_t) ufs_statfs.f_secnfree;
124
statinfo->avail = (avail_t) ufs_statfs.f_bfree;
126
statinfo->avail = (avail_t) ufs_statfs.f_bavail;
130
/* on some older systems it was f_bsize */
131
bsize = (int) ufs_statfs.f_bsize;
133
/* get block size, fail if bszie is still 0 */
134
bsize = (int) ufs_statfs.f_frsize;
135
if(bsize==0)bsize =(int) ufs_statfs.f_bsize;
136
if(bsize==0) ELIO_ERROR(STATFAIL, 1);
139
printf("stat: f_frsize=%d f_bsize=%d bsize=%d free blocks=%ld\n",
140
(int) ufs_statfs.f_frsize,(int) ufs_statfs.f_bsize, bsize,
145
/* translate number of available blocks into kilobytes */
147
case 512: statinfo->avail /=2; break;
149
case 2048: statinfo->avail *=2; break;
150
case 4096: statinfo->avail *=4; break;
151
case 8192: statinfo->avail *=8; break;
152
case 16384: statinfo->avail *=16; break;
153
case 32768: statinfo->avail *=32; break;
156
double factor = ((double)bsize)/1024.0;
157
avail = factor * (double)statinfo->avail;
158
statinfo->avail = (avail_t) avail;
162
PABLO_end(PABLO_elio_stat);