#ifndef __SFS_NATIVE_H__
#define __SFS_NATIVE_H__
/******************************************************************************/
/* */
/* X r d S f s N a t i v e . h h */
/* */
/* (c) 2004 by the Board of Trustees of the Leland Stanford, Jr., University */
/* Produced by Andrew Hanushevsky for Stanford University under contract */
/* DE-AC02-76-SFO0515 with the Department of Energy */
/* */
/* This file is part of the XRootD software suite. */
/* */
/* XRootD is free software: you can redistribute it and/or modify it under */
/* the terms of the GNU Lesser General Public License as published by the */
/* Free Software Foundation, either version 3 of the License, or (at your */
/* option) any later version. */
/* */
/* XRootD is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
/* License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
/* COPYING (GPL license). If not, see . */
/* */
/* The copyright holder's institutional names and contributor's names may not */
/* be used to endorse or promote products derived from this software without */
/* specific prior written permission of the institution or contributor. */
/******************************************************************************/
#include
#include
#include
#include "XrdSfs/XrdSfsInterface.hh"
class XrdSysError;
class XrdSysLogger;
/******************************************************************************/
/* X r d S f s N a t i v e D i r e c t o r y */
/******************************************************************************/
class XrdSfsNativeDirectory : public XrdSfsDirectory
{
public:
int open(const char *dirName,
const XrdSecClientName *client = 0,
const char *opaque = 0);
const char *nextEntry();
int close();
const char *FName() {return (const char *)fname;}
XrdSfsNativeDirectory(char *user=0, int monid=0)
: XrdSfsDirectory(user, monid)
{ateof = 0; fname = 0;
dh = (DIR *)0;
d_pnt = &dirent_full.d_entry;
}
~XrdSfsNativeDirectory() {if (dh) close();}
private:
DIR *dh; // Directory stream handle
char ateof;
char *fname;
struct {struct dirent d_entry;
char pad[MAXNAMLEN]; // This is only required for Solaris!
} dirent_full;
struct dirent *d_pnt;
};
/******************************************************************************/
/* X r d S f s N a t i v e F i l e */
/******************************************************************************/
class XrdSfsAio;
class XrdSfsNativeFile : public XrdSfsFile
{
public:
int open(const char *fileName,
XrdSfsFileOpenMode openMode,
mode_t createMode,
const XrdSecClientName *client = 0,
const char *opaque = 0);
int close();
using XrdSfsFile::fctl;
int fctl(const int cmd,
const char *args,
XrdOucErrInfo &out_error);
const char *FName() {return fname;}
int getMmap(void **Addr, off_t &Size)
{if (Addr) Addr = 0; Size = 0; return SFS_OK;}
int read(XrdSfsFileOffset fileOffset,
XrdSfsXferSize preread_sz) {return SFS_OK;}
XrdSfsXferSize read(XrdSfsFileOffset fileOffset,
char *buffer,
XrdSfsXferSize buffer_size);
int read(XrdSfsAio *aioparm);
XrdSfsXferSize readv(XrdOucIOVec *readV,
int readCount);
XrdSfsXferSize write(XrdSfsFileOffset fileOffset,
const char *buffer,
XrdSfsXferSize buffer_size);
int write(XrdSfsAio *aioparm);
int sync();
int sync(XrdSfsAio *aiop);
int stat(struct stat *buf);
int truncate(XrdSfsFileOffset fileOffset);
int getCXinfo(char cxtype[4], int &cxrsz) {return cxrsz = 0;}
XrdSfsNativeFile(char *user=0, int monid=0)
: XrdSfsFile(user, monid)
{oh = -1; fname = 0;}
~XrdSfsNativeFile() {if (oh) close();}
private:
int oh;
char *fname;
};
/******************************************************************************/
/* X r d S f s N a t i v e */
/******************************************************************************/
class XrdSfsNative : public XrdSfsFileSystem
{
public:
// Object Allocation Functions
//
XrdSfsDirectory *newDir(char *user=0, int monid=0)
{return (XrdSfsDirectory *)new XrdSfsNativeDirectory(user,monid);}
XrdSfsFile *newFile(char *user=0,int monid=0)
{return (XrdSfsFile *)new XrdSfsNativeFile(user,monid);}
// Other Functions
//
int chmod(const char *Name,
XrdSfsMode Mode,
XrdOucErrInfo &out_error,
const XrdSecClientName *client = 0,
const char *opaque = 0);
int exists(const char *fileName,
XrdSfsFileExistence &exists_flag,
XrdOucErrInfo &out_error,
const XrdSecClientName *client = 0,
const char *opaque = 0);
int fsctl(const int cmd,
const char *args,
XrdOucErrInfo &out_error,
const XrdSecClientName *client = 0);
int getStats(char *buff, int blen) {return 0;}
const char *getVersion();
int mkdir(const char *dirName,
XrdSfsMode Mode,
XrdOucErrInfo &out_error,
const XrdSecClientName *client = 0,
const char *opaque = 0);
int prepare( XrdSfsPrep &pargs,
XrdOucErrInfo &out_error,
const XrdSecClientName *client = 0) {return 0;}
int rem(const char *path,
XrdOucErrInfo &out_error,
const XrdSecClientName *client = 0,
const char *opaque = 0);
int remdir(const char *dirName,
XrdOucErrInfo &out_error,
const XrdSecClientName *client = 0,
const char *opaque = 0);
int rename(const char *oldFileName,
const char *newFileName,
XrdOucErrInfo &out_error,
const XrdSecClientName *client = 0,
const char *opaqueO = 0,
const char *opaqueN = 0);
int stat(const char *Name,
struct stat *buf,
XrdOucErrInfo &out_error,
const XrdSecClientName *client = 0,
const char *opaque = 0);
int stat(const char *Name,
mode_t &mode,
XrdOucErrInfo &out_error,
const XrdSecClientName *client = 0,
const char *opaque = 0)
{struct stat bfr;
int rc = stat(Name, &bfr, out_error, client);
if (!rc) mode = bfr.st_mode;
return rc;
}
int truncate(const char *Name,
XrdSfsFileOffset fileOffset,
XrdOucErrInfo &out_error,
const XrdSecEntity *client = 0,
const char *opaque = 0);
// Common functions
//
static int Mkpath(const char *path, mode_t mode,
const char *info=0);
static int Emsg(const char *, XrdOucErrInfo&, int, const char *x,
const char *y="");
XrdSfsNative(XrdSysError *lp);
virtual ~XrdSfsNative() {}
private:
static XrdSysError *eDest;
};
#endif