/*
* Copyright (C) 1999-2004 by CERN/IT/PDP/DM
* All rights reserved
*/
#ifndef lint
static char sccsid[] = "@(#)Cns_procreq.c,v 1.61 2004/03/03 08:51:31 CERN IT-PDP/DM Jean-Philippe Baud";
#endif /* not lint */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
#include <sys/stat.h>
#include <time.h>
#include <sys/types.h>
#include <uuid/uuid.h>
#include <python3.5m/Python.h>
#include <fcntl.h>
#include <time.h>
#include <pthread.h>
#if defined(_WIN32)
#define R_OK 4
#define W_OK 2
#define X_OK 1
#define F_OK 0
#define S_ISGID 0002000
#define S_ISVTX 0001000
#include <winsock2.h>
#else
#include <unistd.h>
#include <netinet/in.h>
#endif
#define MAXPATHLEN 1023 //the largest size of the file path
#define UNIT_SIZE (1024*1024)
#define PATH "/cdfs_data/"
#define VIRPATH "/data/xrootdfs/file/"
#include "marshall.h"
#include "Cgrp.h"
#include "Cns.h"
#include "Cns_server.h"
#include "Cpwd.h"
#include "Cupv_api.h"
#include "rfcntl.h"
#include "serrno.h"
#include "u64subr.h"
#include "Cns_api.h"
extern int being_shutdown;
extern char localhost[CA_MAXHOSTNAMELEN+1];
struct transread_argument
{
char remote_path[100];
char local_path[100];
int start_location;
int nums;
int blocksize;
};
void transread(const char *host,const char *filepath,const char *targetdir,const char *uid,const char *gid,int position,int size);
/* Cns_logreq - log a request */
/* Split the message into lines so they don't exceed LOGBUFSZ-1 characters
* A backslash is appended to a line to be continued
* A continuation line is prefixed by '+ '
*/
void Cns_logreq(char *func,char *logbuf)
{
int n1, n2;
char *p;
char savechrs1[2];
char savechrs2[2];
n1 = LOGBUFSZ - strlen (func) - 36;
n2 = strlen (logbuf);
p = logbuf;
while (n2 > n1) {
savechrs1[0] = *(p + n1);
savechrs1[1] = *(p + n1 + 1);
*(p + n1) = '\\';
*(p + n1 + 1) = '\0';
nslogit (func, NS098, p);
if (p != logbuf) {
*p = savechrs2[0];
*(p + 1) = savechrs2[1];
}
p += n1 - 2;
savechrs2[0] = *p;
savechrs2[1] = *(p + 1);
*p = '+';
*(p + 1) = ' ';
*(p + 2) = savechrs1[0];
*(p + 3) = savechrs1[1];
n2 -= n1;
}
nslogit (func, NS098, p);
if (p != logbuf) {
*p = savechrs2[0];
*(p + 1) = savechrs2[1];
}
}
int marshall_DIRX (char **sbpp,struct Cns_file_metadata *fmd_entry)
{
char *sbp = *sbpp;
marshall_HYPER (sbp, fmd_entry->fileid);
marshall_WORD (sbp, fmd_entry->filemode);
marshall_LONG (sbp, fmd_entry->nlink);
marshall_LONG (sbp, fmd_entry->uid);
marshall_LONG (sbp, fmd_entry->gid);
marshall_HYPER (sbp, fmd_entry->filesize);
marshall_TIME_T (sbp, fmd_entry->atime);
marshall_TIME_T (sbp, fmd_entry->mtime);
marshall_TIME_T (sbp, fmd_entry->ctime);
marshall_WORD (sbp, fmd_entry->fileclass);
marshall_BYTE (sbp, fmd_entry->status);
marshall_STRING (sbp, fmd_entry->name);
*sbpp = sbp;
return (0);
}
int marshall_DIRXT (char **sbpp,int magic,struct Cns_file_metadata *fmd_entry,struct Cns_seg_metadata *smd_entry)
{
char *sbp = *sbpp;
marshall_HYPER (sbp, fmd_entry->parent_fileid);
if (magic >= CNS_MAGIC3)
marshall_HYPER (sbp, smd_entry->s_fileid);
marshall_WORD (sbp, smd_entry->copyno);
marshall_WORD (sbp, smd_entry->fsec);
marshall_HYPER (sbp, smd_entry->segsize);
marshall_LONG (sbp, smd_entry->compression);
marshall_BYTE (sbp, smd_entry->s_status);
marshall_STRING (sbp, smd_entry->vid);
if (magic >= CNS_MAGIC4) {
marshall_STRING (sbp, smd_entry->checksum_name);
marshall_LONG (sbp, smd_entry->checksum);
}
if (magic >= CNS_MAGIC2)
marshall_WORD (sbp, smd_entry->side);
marshall_LONG (sbp, smd_entry->fseq);
marshall_OPAQUE (sbp, smd_entry->blockid, 4);
marshall_STRING (sbp, fmd_entry->name);
*sbpp = sbp;
return (0);
}
/* Cns_srv_access - check accessibility of a file/directory */
int Cns_srv_access(int magic,char *req_data,char *clienthost,struct Cns_srv_thread_info *thip)
{
int amode;
char basename[CA_MAXNAMELEN+1];
u_signed64 cwd;
struct Cns_file_metadata fmd_entry;
char func[16];
gid_t gid;
char logbuf[CA_MAXPATHLEN+13];
mode_t mode;
struct Cns_file_metadata parent_dir;
char path[CA_MAXPATHLEN+1];
char *rbp;
uid_t uid;
strcpy (func, "Cns_srv_access");
rbp = req_data;
unmarshall_LONG (rbp, uid);
unmarshall_LONG (rbp, gid);
nslogit (func, NS092, "access", uid, gid, clienthost);
unmarshall_HYPER (rbp, cwd);
if (unmarshall_STRINGN (rbp, path, CA_MAXPATHLEN+1))
return (SENAMETOOLONG);
unmarshall_LONG (rbp, amode);
sprintf (logbuf, "access %o %s", amode, path);
Cns_logreq (func, logbuf);
if (amode & ~(R_OK | W_OK | X_OK | F_OK))
return (EINVAL);
if (Cns_splitname (cwd, path, basename))
return (serrno);
if (*basename == '/') { /* Cns_access / */
parent_dir.fileid = 0;
} else { /* check parent directory components for search permission */
if (Cns_chkdirperm (&thip->dbfd, cwd, path, S_IEXEC, uid, gid,
clienthost, &parent_dir, NULL))
return (serrno);
}
/* get basename entry */
if (Cns_get_fmd_by_fullid (&thip->dbfd, parent_dir.fileid, basename,
&fmd_entry, 0, NULL))
return (serrno);
/* check permissions for basename */
if (amode == F_OK)
return (0);
mode = (amode & (R_OK|W_OK|X_OK)) << 6;
if (Cns_chkentryperm (&fmd_entry, mode, uid, gid, clienthost))
return (EACCES);
return (0);
}
/* Cns_srv_chclass - change class on directory */
int Cns_srv_chclass(int magic,char *req_data,char *clienthost,struct Cns_srv_thread_info *thip)
{
char basename[CA_MAXNAMELEN+1];
char class_name[CA_MAXCLASNAMELEN+1];
int classid;
u_signed64 cwd;
struct Cns_file_metadata fmd_entry;
char func[16];
gid_t gid;
char logbuf[CA_MAXPATHLEN+CA_MAXCLASNAMELEN+16];
struct Cns_class_metadata new_class_entry;
Cns_dbrec_addr new_rec_addrc;
struct Cns_class_metadata old_class_entry;
Cns_dbrec_addr old_rec_addrc;
struct Cns_file_metadata parent_dir;
char path[CA_MAXPATHLEN+1];
char *rbp;
Cns_dbrec_addr rec_addr;
uid_t uid;
strcpy (func, "Cns_srv_chclass");
rbp = req_data;
unmarshall_LONG (rbp, uid);
unmarshall_LONG (rbp, gid);
nslogit (func, NS092, "chclass", uid, gid, clienthost);
unmarshall_HYPER (rbp, cwd);
if (unmarshall_STRINGN (rbp, path, CA_MAXPATHLEN+1))
return (SENAMETOOLONG);
unmarshall_LONG (rbp, classid);
if (unmarshall_STRINGN (rbp, class_name, CA_MAXCLASNAMELEN+1))
return (EINVAL);
sprintf (logbuf, "chclass %s %d %s", path, classid, class_name);
Cns_logreq (func, logbuf);
if (Cns_splitname (cwd, path, basename))
return (serrno);
if (*basename == '/') { /* Cns_chclass / */
parent_dir.fileid = 0;
} else { /* check parent directory components for search permission */
if (Cns_chkdirperm (&thip->dbfd, cwd, path, S_IEXEC, uid, gid,
clienthost, &parent_dir, NULL))
return (serrno);
}
/* start transaction */
(void) Cns_start_tr (thip->s, &thip->dbfd);
/* is the class valid? */
if (classid > 0) {
if (Cns_get_class_by_id (&thip->dbfd, classid, &new_class_entry,
1, &new_rec_addrc))
if (serrno == ENOENT) {
sendrep (thip->s, MSG_ERR, "No such class\n");
return (EINVAL);
} else
return (serrno);
if (*class_name && strcmp (class_name, new_class_entry.name))
return (EINVAL);
} else {
if (Cns_get_class_by_name (&thip->dbfd, class_name, &new_class_entry,
1, &new_rec_addrc))
if (serrno == ENOENT) {
sendrep (thip->s, MSG_ERR, "No such class\n");
return (EINVAL);
} else
return (serrno);
}
/* get/lock basename entry */
if (Cns_get_fmd_by_fullid (&thip->dbfd, parent_dir.fileid, basename,
&fmd_entry, 1, &rec_addr))
return (serrno);
/* check if the user is authorized to chclass this entry */
if (uid != fmd_entry.uid &&
Cupv_check (uid, gid, clienthost, localhost, P_ADMIN))
return (EPERM);
if ((fmd_entry.filemode & S_IFDIR) == 0)
return (ENOTDIR);
/* update entries */
if (fmd_entry.fileclass != new_class_entry.classid) {
if (fmd_entry.fileclass > 0) {
if (Cns_get_class_by_id (&thip->dbfd, fmd_entr
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
leaf高能物理文件存储系统 (489个子文件)
libshift.a 2.81MB
libns.a 1.31MB
libns.a 1.31MB
Cns_procreq.c 144KB
Cns_mysql_ifce.c 48KB
Cns_main.c 20KB
nsls.c 19KB
Cns_Cdb_ifce.c 16KB
Cns_raima_ifce.c 14KB
test.c 10KB
cdfs_fuse.c 10KB
Data_daemon.c 10KB
Cns_xrd.c 8KB
nsfind.c 8KB
nsmodifyclass.c 7KB
nsenterclass.c 6KB
nssetchecksum.c 5KB
nslistclass.c 5KB
nsrm.c 5KB
nschown.c 5KB
send2nsd.c 5KB
ns_test.c 4KB
nschclass.c 4KB
Cns_chkperm.c 4KB
Utils.c 4KB
nstouch.c 4KB
Cns_listtape.c 4KB
Cns_listclass.c 4KB
nsmkdir.c 4KB
nscat.c 3KB
Cns_readdirxt.c 3KB
Cns_readdirxc.c 3KB
Cns_getsegattrs.c 3KB
Cns_readdirx.c 3KB
Cns_readdirxt_t.c 3KB
Cns_readdirxc_t.c 3KB
Cns_stat.c 3KB
nslisttape.c 3KB
Cns_readdir.c 3KB
Cns_readdirx_t.c 3KB
Cns_setsegattrs.c 3KB
Cns_readdirc.c 3KB
Cns_queryclass.c 3KB
Cns_readdir_t.c 3KB
Cns_download_segdata.c 3KB
Cns_readdirc_t.c 3KB
Cns_stat_t.c 3KB
Cns_read_t.c 3KB
Cns_modifyclass.c 3KB
Cns_getattr_id.c 2KB
Cns_replaceseg.c 2KB
Cns_opendir_t_xrd.c 2KB
Cns_enterclass.c 2KB
Cns_creat.c 2KB
Cns_get_Data_daemon.c 2KB
Cns_Data_daemon.c 2KB
Cns_updateseg_checksum.c 2KB
Cns_opendir.c 2KB
Cns_transform.c 2KB
nssetactualpath.c 2KB
Cns_setfsize.c 2KB
Cns_access_t.c 2KB
Cns_open_t.c 2KB
Cns_selectsrvr.c 2KB
Cns_setatime.c 2KB
nsrename.c 2KB
Cns_utime.c 2KB
Cns_get_virpath.c 2KB
Cns_opendir_t.c 2KB
nsshutdown.c 2KB
nschmod.c 2KB
Cns_setactualpath.c 2KB
Cns_chclass.c 2KB
Cns_chdir.c 2KB
Cns_createactfile.c 2KB
Cns_touch_t.c 2KB
Cns_rename.c 2KB
Cns_getcomment.c 2KB
Cns_chown.c 2KB
Cns_setcomment.c 2KB
Cns_delactualpath.c 2KB
Cns_mkdir.c 2KB
nsdeleteclass.c 2KB
Cns_chmod.c 2KB
Cns_setseg.c 2KB
Cns_access.c 2KB
Cns_delcomment.c 2KB
Cns_undelete.c 2KB
Cns_delete.c 2KB
Cns_unlink.c 2KB
Cns_rmdir.c 2KB
Cns_cat.c 2KB
sendrep.c 2KB
Cns_getpath.c 2KB
Cns_deleteclass.c 2KB
nsdelactualpath.c 2KB
nssetcomment.c 2KB
nsdelcomment.c 2KB
Cns_errmsg.c 2KB
nslogit.c 1KB
共 489 条
- 1
- 2
- 3
- 4
- 5
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6649
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功