3
Copyright (C) 2003-2004 Douglas Thain and the University of Wisconsin
4
Copyright (C) 2005- The University of Notre Dame
5
This software is distributed under the GNU General Public License.
6
See the file COPYING for details.
9
#include "pfs_service.h"
11
#include "pfs_process.h"
14
#include "chirp_reli.h"
15
#include "hash_table.h"
22
#include <sys/statfs.h>
27
pfs_service::pfs_service()
31
pfs_service::~pfs_service()
35
void * pfs_service::connect( pfs_name *name )
41
void pfs_service::disconnect( pfs_name *name, void *cxn )
45
int pfs_service::get_default_port()
50
int pfs_service::tilde_is_special()
55
int pfs_service::is_seekable()
60
int pfs_service::is_local()
65
pfs_file * pfs_service::open( pfs_name *name, int flags, mode_t mode )
71
pfs_dir * pfs_service::getdir( pfs_name *name )
77
int pfs_service::stat( pfs_name *name, struct pfs_stat *buf )
79
pfs_service_emulate_stat(name,buf);
83
int pfs_service::statfs( pfs_name *name, struct pfs_statfs *buf )
85
pfs_service_emulate_statfs(buf);
89
int pfs_service::lstat( pfs_name *name, struct pfs_stat *buf )
91
pfs_service_emulate_stat(name,buf);
95
int pfs_service::access( pfs_name *name, mode_t mode )
100
} else if( mode&W_OK ) {
109
Strictly speaking, this should fail, but users get confused
110
about error messages from tools such as cp innocently
111
trying to set the right mode. Same comments apply to
115
int pfs_service::chmod( pfs_name *name, mode_t mode )
120
int pfs_service::chown( pfs_name *name, uid_t uid, gid_t gid )
126
int pfs_service::lchown( pfs_name *name, uid_t uid, gid_t gid )
132
int pfs_service::truncate( pfs_name *name, pfs_off_t length )
138
int pfs_service::utime( pfs_name *name, struct utimbuf *buf )
143
int pfs_service::unlink( pfs_name *name )
149
int pfs_service::rename( pfs_name *old_name, pfs_name *new_name )
155
int pfs_service::chdir( pfs_name *name, char *newpath )
157
strcpy(newpath,name->path);
161
int pfs_service::link( pfs_name *old_name, pfs_name *new_name )
167
int pfs_service::symlink( const char *linkname, pfs_name *new_name )
173
int pfs_service::readlink( pfs_name *name, char *buf, pfs_size_t size )
179
int pfs_service::mknod( pfs_name *name, mode_t mode, dev_t dev )
185
int pfs_service::mkdir( pfs_name *name, mode_t mode )
191
int pfs_service::rmdir( pfs_name *name )
197
int pfs_service::mkalloc( pfs_name *name, pfs_ssize_t size, mode_t mode )
203
int pfs_service::lsalloc( pfs_name *name, char *alloc_name, pfs_ssize_t *size, pfs_ssize_t *inuse )
209
int pfs_service::whoami( pfs_name *name, char *buf, int size )
215
int pfs_service::getacl( pfs_name *name, char *buf, int size )
221
int pfs_service::setacl( pfs_name *name, const char *subject, const char *rights )
227
pfs_location* pfs_service::locate( pfs_name *name )
233
int pfs_service::putfile( pfs_name *source, pfs_name *target )
239
int pfs_service::getfile( pfs_name *source, pfs_name *target )
245
int pfs_service::thirdput( pfs_name *source, pfs_name *target )
251
int pfs_service::md5( pfs_name *source, unsigned char *digest )
257
pfs_service * pfs_service_lookup( const char *name )
259
if(!strcmp(name,"chirp")) {
260
extern pfs_service *pfs_service_chirp;
261
return pfs_service_chirp;
262
} else if(!strcmp(name,"multi")) {
263
extern pfs_service *pfs_service_multi;
264
return pfs_service_multi;
265
} else if(!strcmp(name,"anonftp")) {
266
extern pfs_service *pfs_service_anonftp;
267
return pfs_service_anonftp;
268
} else if(!strcmp(name,"ftp")) {
269
extern pfs_service *pfs_service_ftp;
270
return pfs_service_ftp;
271
} else if(!strcmp(name,"http")) {
272
extern pfs_service *pfs_service_http;
273
return pfs_service_http;
274
} else if(!strcmp(name,"grow")) {
275
extern pfs_service *pfs_service_grow;
276
return pfs_service_grow;
277
} else if(!strcmp(name,"s3")) {
278
extern pfs_service *pfs_service_s3;
279
return pfs_service_s3;
280
#ifdef HAS_GLOBUS_GSS
281
} else if(!strcmp(name,"gsiftp") || !strcmp(name,"gridftp") ) {
282
extern pfs_service *pfs_service_gsiftp;
283
return pfs_service_gsiftp;
286
} else if(!strcmp(name,"nest")) {
287
extern pfs_service *pfs_service_nest;
288
return pfs_service_nest;
291
} else if(!strcmp(name,"gfal") || !strcmp(name,"lfn") || !strcmp(name,"guid") || !strcmp(name,"srm") || !strcmp(name,"rfio") ) {
292
extern pfs_service *pfs_service_gfal;
293
return pfs_service_gfal;
294
} else if(!strcmp(name,"lfc")) {
295
extern pfs_service *pfs_service_lfc;
296
return pfs_service_lfc;
299
} else if(!strcmp(name,"rfio")) {
300
extern pfs_service *pfs_service_rfio;
301
return pfs_service_rfio;
304
} else if(!strcmp(name,"dcap")) {
305
extern pfs_service *pfs_service_dcap;
306
return pfs_service_dcap;
309
} else if(!strcmp(name,"irods")) {
310
extern pfs_service *pfs_service_irods;
311
return pfs_service_irods;
313
} else if(!strcmp(name,"hdfs")) {
314
extern pfs_service *pfs_service_hdfs;
315
return pfs_service_hdfs;
317
} else if(!strcmp(name,"bxgrid")) {
318
extern pfs_service *pfs_service_bxgrid;
319
return pfs_service_bxgrid;
322
} else if(!strcmp(name,"xrootd") || !strcmp(name,"root") ) {
323
extern pfs_service *pfs_service_xrootd;
324
return pfs_service_xrootd;
332
pfs_service * pfs_service_lookup_default()
334
extern pfs_service *pfs_service_local;
335
return pfs_service_local;
338
void pfs_service_emulate_statfs( struct pfs_statfs *buf )
340
memset(buf,0,sizeof(*buf));
343
static int default_block_size = 65336;
345
void pfs_service_set_block_size( int bs )
347
default_block_size = bs;
348
chirp_reli_blocksize_set(bs);
351
int pfs_service_get_block_size()
353
if(!strcmp(pfs_current->name,"ld")) {
356
return default_block_size;
360
void pfs_service_emulate_stat( pfs_name *name, struct pfs_stat *buf )
362
static time_t start_time = 0;
363
memset(buf,0,sizeof(*buf));
364
buf->st_dev = (dev_t) -1;
366
buf->st_ino = hash_string(name->rest);
370
buf->st_mode = S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO ;
371
buf->st_uid = getuid();
372
buf->st_gid = getgid();
375
if(start_time==0) start_time = time(0);
376
buf->st_ctime = buf->st_atime = buf->st_mtime = start_time;
377
buf->st_blksize = default_block_size;
380
static struct hash_table *table = 0;
382
void * pfs_service_connect_cache( pfs_name *name )
384
char key[PFS_PATH_MAX];
392
if(!table) table = hash_table_create(0,0);
395
sprintf(key,"/%s/%s:%d",name->service_name,name->host,name->port);
396
cxn = hash_table_remove(table,key);
400
return name->service->connect(name);
403
void pfs_service_disconnect_cache( pfs_name *name, void *cxn, int invalidate )
405
char key[PFS_PATH_MAX];
406
int save_errno = errno;
408
if(!table) table = hash_table_create(0,0);
410
if(table && !invalidate) {
411
sprintf(key,"/%s/%s:%d",name->service_name,name->host,name->port);
412
if(hash_table_lookup(table,key)) {
413
name->service->disconnect(name,cxn);
415
hash_table_insert(table,key,cxn);
418
name->service->disconnect(name,cxn);