38 #if defined(AIX) || defined(__solaris__)
39 #include <sys/vnode.h>
42 #include <sys/param.h>
43 #include <sys/types.h>
72 #define NegVal(x) (x <= 0 ? (x < 0 ? x : -1) : -x)
91 #define XRDOSS_HT_EOF 1
92 #define XRDOSS_HT_DIR 4
111 const char *epname =
"MSS_Opendir";
117 if (strlen(dir_path) > MAXPATHLEN)
126 if ( (rc =
MSS_Xeq(&
sp, ENOENT,
"dlist", dir_path)))
132 {
delete sp; rc = -ENOMEM;
return (
void *)0;}
154 const char *epname =
"MSS_Readdir";
162 {
OssEroute.
Emsg(epname,
"invalid mss handle");
return -EBADF;}
168 {
if ( ((
int)strlen(resp)) >= blen )
171 "readdir rmt", resp);
193 const char *epname =
"MSS_Closedir";
197 {
OssEroute.
Emsg(epname,
"invalid mss handle");
return -EBADF;}
219 const char *epname =
"MSS_Create";
224 if (strlen(path) > MAXPATHLEN)
226 return -ENAMETOOLONG;
231 sprintf(myMode,
"%o",
static_cast<int>(file_mode));
235 return MSS_Xeq(0, 0,
"create", path, myMode);
255 const char *epname =
"MSS_Stat";
256 char ftype, mtype[10], *resp;
258 long xt_uid, xt_gid, atime, ctime, mtime, xt_blksize, xt_blocks;
264 if (strlen(path) > MAXPATHLEN)
266 return -ENAMETOOLONG;
271 if (!buff)
return MSS_Xeq(0, ENOENT, (
isMSSC ?
"statx" :
"exists"), path);
272 if ((retc =
MSS_Xeq(&sfd, ENOENT,
"statx", path)))
return retc;
276 if ( !(resp = sfd ->GetLine()))
281 sscanf(resp,
"%c %9s %d %ld %ld %ld %ld %ld %lld %ld %ld", &ftype, mtype,
282 &xt_nlink, &xt_uid, &xt_gid, &atime, &ctime, &mtime,
283 &xt_size, &xt_blksize, &xt_blocks);
287 memset( (
char *)buff, 0,
sizeof(
struct stat) );
288 buff->st_nlink =
static_cast<nlink_t
>(xt_nlink);
289 buff->st_uid =
static_cast<uid_t
>(xt_uid);
290 buff->st_gid =
static_cast<gid_t
>(xt_gid);
291 buff->st_atime =
static_cast<time_t
>(atime);
292 buff->st_ctime =
static_cast<time_t
>(ctime);
293 buff->st_mtime =
static_cast<time_t
>(mtime);
294 buff->st_size =
static_cast<off_t
>(xt_size);
295 buff->st_blksize=
static_cast<long>(xt_blksize);
297 buff->st_blocks = xt_blocks;
299 buff->st_blocks =
static_cast<blkcnt_t
>(xt_blocks);
302 if (ftype ==
'd') buff->st_mode |= S_IFDIR;
303 else if (ftype ==
'l') buff->st_mode |= S_IFLNK;
304 else buff->st_mode |= S_IFREG;
306 buff->st_mode |=
tranmode(&mtype[0]) << 6;
307 buff->st_mode |=
tranmode(&mtype[3]) << 3;
308 buff->st_mode |=
tranmode(&mtype[6]);
316 if (mode[0] ==
'r') mbits |= S_IROTH;
317 if (mode[1] ==
'w') mbits |= S_IWOTH;
318 if (mode[2] ==
'x') mbits |= S_IXOTH;
334 const char *epname =
"MSS_Unlink";
338 if (strlen(path) > MAXPATHLEN)
340 return -ENAMETOOLONG;
345 return MSS_Xeq(0, ENOENT,
"rm", path);
361 const char *epname =
"MSS_Rename";
365 if (strlen(oldname) > MAXPATHLEN
366 || strlen(newname) > MAXPATHLEN)
367 {
OssEroute.
Emsg(epname,
"mss path too long - ", oldname, newname);
368 return -ENAMETOOLONG;
373 return MSS_Xeq(0, 0,
"mv", oldname, newname);
384 const char *cmd,
const char *arg1,
const char *arg2)
387 static int NoResp = 0;
403 DEBUG(
"Invoking '" <<
RSSCmd <<
' ' <<cmd <<
' ' <<(arg1 ? arg1 :
"")
404 <<
' ' <<(arg2 ? arg2 :
""));
413 {
if (!(0xff & NoResp++))
425 {
DEBUG(
"received '" <<resp <<
"'");
426 if (sscanf(resp,
"%d", &retc) <= 0) retc =
XRDOSS_E8024;
int stat(const char *path, struct stat *buf)
int MSS_Readdir(void *fd, char *buff, int blen)
int MSS_Rename(const char *, const char *)
int MSS_Unlink(const char *)
int MSS_Stat(const char *, struct stat *buff=0)
int MSS_Create(const char *path, mode_t, XrdOucEnv &)
int MSS_Xeq(XrdOucStream **xfd, int okerr, const char *cmd, const char *arg1=0, const char *arg2=0)
void * MSS_Opendir(const char *, int &rc)
int Run(XrdOucStream *Sp, const char *argV[], int argc=0, const char *envV[]=0) const
int Wait4Data(int msMax=-1)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
XrdOssHandle(int type, XrdOucStream *newsp=0)