2
Copyright (C) 2003-2004 Douglas Thain and the University of Wisconsin
3
Copyright (C) 2005- The University of Notre Dame
4
This software is distributed under the GNU General Public License.
5
See the file COPYING for details.
9
Note that this module supports a variety of URLs,
10
all implemented by the EGEE GFAL library.
15
#include "pfs_table.h"
16
#include "pfs_service.h"
20
#include "stringtools.h"
33
#include <sys/statfs.h>
35
void format_name( pfs_name *name, char *path )
37
if(!strcmp(name->service_name,"lfn")) {
38
sprintf(path,"lfn:/%s%s",name->host,name->rest);
39
} else if(!strcmp(name->service_name,"guid")) {
40
sprintf(path,"guid:%s",name->host);
41
} else if(!strcmp(name->service_name,"gfal")) {
42
sprintf(path,"%s",name->path+6);
44
/* note double slashes needed for srm, dcap, and rfio */
45
/* name->rest always begins with a slash */
46
sprintf(path,"%s://%s/%s",
48
name->port==0 ? name->host : name->hostport,
54
class pfs_file_gfal : public pfs_file
59
pfs_off_t current_offset;
62
pfs_file_gfal( pfs_name *name, int f ) : pfs_file(name) {
70
debug(D_GFAL,"close %d",gfd);
71
result = gfal_close(gfd);
72
debug(D_GFAL,"= %d",result);
76
virtual pfs_ssize_t read( void *data, pfs_size_t length, pfs_off_t offset ) {
78
debug(D_GFAL,"read %d %x %d %d",gfd,data,length,offset);
79
if(offset!=current_offset) gfal_lseek(gfd,offset,SEEK_SET);
80
result = gfal_read(gfd,data,length);
81
if(result>0) current_offset+=result;
82
debug(D_GFAL,"= %d",result);
86
virtual pfs_ssize_t write( const void *data, pfs_size_t length, pfs_off_t offset ) {
88
debug(D_GFAL,"write %d %x %d %d",gfd,data,length,offset);
89
if(offset!=current_offset) gfal_lseek(gfd,offset,SEEK_SET);
90
result = gfal_write(gfd,data,length);
91
if(result>0) current_offset+=result;
92
debug(D_GFAL,"= %d",result);
96
virtual int fstat( struct pfs_stat *buf ) {
97
pfs_service_emulate_stat(&name,buf);
98
buf->st_size = this->get_size();
102
virtual pfs_ssize_t get_size() {
103
current_offset = gfal_lseek(gfd,0,SEEK_END);
104
return current_offset;
108
class pfs_service_gfal : public pfs_service {
110
virtual pfs_file * open( pfs_name *name, int flags, mode_t mode ) {
113
char gfalname[PFS_PATH_MAX];
114
format_name(name,gfalname);
116
debug(D_GFAL,"open %s %d %d",gfalname,flags,mode);
117
gfd = gfal_open(gfalname,flags,mode);
118
debug(D_GFAL,"= %d",gfd);
120
return new pfs_file_gfal(name,gfd);
126
virtual pfs_dir * getdir( pfs_name *name ) {
130
char gfalname[PFS_PATH_MAX];
131
format_name(name,gfalname);
133
debug(D_GFAL,"getdir %s",gfalname);
135
gfaldir = gfal_opendir(gfalname);
137
pfs_dir *dir = new pfs_dir(name);
138
while(((d=gfal_readdir(gfaldir)))) {
139
dir->append(d->d_name);
147
virtual int stat( pfs_name *name, struct pfs_stat *buf ) {
150
char gfalname[PFS_PATH_MAX];
151
format_name(name,gfalname);
153
debug(D_GFAL,"stat %s",gfalname);
154
result = gfal_stat(gfalname,&gbuf);
155
if(result==0) COPY_STAT(gbuf,*buf);
156
debug(D_GFAL,"= %d",result);
160
virtual int lstat( pfs_name *name, struct pfs_stat *buf ) {
163
char gfalname[PFS_PATH_MAX];
164
format_name(name,gfalname);
166
debug(D_GFAL,"lstat %s",gfalname);
167
result = gfal_lstat(gfalname,&gbuf);
168
if(result==0) COPY_STAT(gbuf,*buf);
169
debug(D_GFAL,"= %d",result);
173
virtual int unlink( pfs_name *name ) {
175
char gfalname[PFS_PATH_MAX];
176
format_name(name,gfalname);
178
debug(D_GFAL,"unlink %s",gfalname);
179
result = gfal_unlink(gfalname);
180
debug(D_GFAL,"= %d",result);
184
virtual int access( pfs_name *name, mode_t mode ) {
186
char gfalname[PFS_PATH_MAX];
187
format_name(name,gfalname);
189
debug(D_GFAL,"access %s %d",gfalname,mode);
190
result = gfal_access(gfalname,mode);
191
debug(D_GFAL,"= %d",result);
195
virtual int chmod( pfs_name *name, mode_t mode ) {
197
char gfalname[PFS_PATH_MAX];
198
format_name(name,gfalname);
200
debug(D_GFAL,"chmod %s %d",gfalname,mode);
201
result = gfal_chmod(gfalname,mode);
202
debug(D_GFAL,"= %d",result);
206
virtual int rename( pfs_name *name, pfs_name *newname ) {
208
char gfalname[PFS_PATH_MAX];
209
char newgfalname[PFS_PATH_MAX];
210
format_name(name,gfalname);
211
format_name(newname,newgfalname);
213
debug(D_GFAL,"rename %s %s",gfalname,newgfalname);
214
result = gfal_rename(gfalname,newgfalname);
215
debug(D_GFAL,"= %d",result);
219
virtual int chdir( pfs_name *name, char *newname ) {
223
char gfalname[PFS_PATH_MAX];
224
format_name(name,gfalname);
226
result = this->stat(name,&buf);
227
if(result<0) return result;
229
if(S_ISDIR(buf.st_mode)) {
230
strcpy(newname,name->path);
238
virtual int mkdir( pfs_name *name, mode_t mode ) {
240
char gfalname[PFS_PATH_MAX];
241
format_name(name,gfalname);
243
debug(D_GFAL,"mkdir %s %d",gfalname,mode);
244
result = gfal_mkdir(gfalname,mode);
245
debug(D_GFAL,"= %d",result);
249
virtual int rmdir( pfs_name *name ) {
251
char gfalname[PFS_PATH_MAX];
252
format_name(name,gfalname);
254
debug(D_GFAL,"rmdir %s",gfalname);
255
result = gfal_rmdir(gfalname);
256
debug(D_GFAL,"= %d",result);
260
virtual int is_local() {
264
virtual int is_seekable() {
270
static pfs_service_gfal pfs_service_gfal_instance;
271
pfs_service *pfs_service_gfal = &pfs_service_gfal_instance;