⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htvmsutils.c

📁 www工具包. 这是W3C官方支持的www支撑库. 其中提供通用目的的客户端的WebAPI: complete HTTP/1.1 (with caching, pipelining, PUT, POS
💻 C
📖 第 1 页 / 共 2 页
字号:
/* MODULE							HTVMSUtil.c**		VMS Utility Routines**** AUTHORS:**	MD	Mark Donszelmann    duns@vxdeop.cern.ch**	FM	Foteos Macrides	    macrides@sci.wfeb.edu**** HISTORY:**	14 Nov 93  MD	Written**	31 Mar 94  FM	Added HTVMS_disableAllPrv**	06 Jul 94  FM	Added HTVMS_getUIC and HTVMS_isOwner**** BUGS:*****/#include <ssdef.h>#include <jpidef.h>#include <uaidef.h>#include <prvdef.h>#include <acldef.h>#include <armdef.h>#include <chpdef.h>#include <lnmdef.h>#include <libdtdef.h>#include <descrip.h>#include <unixlib.h>#include <stdio.h>#include <stat.h>#include <time.h>#include "HTUtils.h"#include "HTVMSUtils.h"#include "HTAccess.h"#define INFINITY 512            /* file name length @@ FIXME */typedef struct {   unsigned BufferLength : 16;   unsigned ItemCode : 16;   unsigned BufferAddress : 32;   unsigned ReturnLengthAddress : 32;} ItemStruct;/* PUBLIC							HTVMS_authSysPrv()**		CHECKS IF THIS PROCESS IS AUTHORIZED TO ENABLE SYSPRV** ON ENTRY:**	No arguments.**** ON EXIT:**	returns	YES if SYSPRV is authorized*/PUBLIC BOOL HTVMS_authSysPrv NOARGS{unsigned long Result;ItemStruct ItemList[2];unsigned long Length;unsigned long Buffer[2];  /* fill Item */  ItemList[0].BufferLength = sizeof(Buffer);  ItemList[0].BufferAddress = Buffer;  ItemList[0].ReturnLengthAddress = &Length;  ItemList[0].ItemCode = JPI$_AUTHPRIV;  /* terminate list */  ItemList[1].ItemCode = 0;  ItemList[1].BufferLength = 0;  /* call system */  Result = SYS$GETJPIW(0, 0, 0, ItemList, 0, 0, 0);  if (Result != SS$_NORMAL)     return(NO);    if (Buffer[0] & PRV$M_SYSPRV)     return(YES);  return(NO);  }/* PUBLIC							HTVMS_enableSysPrv()**		ENABLES SYSPRV** ON ENTRY:**	No arguments.**** ON EXIT:**	*/PUBLIC void HTVMS_enableSysPrv NOARGS{unsigned long Result;unsigned long Prv[2], PreviousPrv[2];   Prv[0] = PRV$M_SYSPRV;   Prv[1] = 0;   Result = SYS$SETPRV(1,&Prv,0,&PreviousPrv);      if (Result == SS$_NORMAL) {         if (!(PreviousPrv[0] & PRV$M_SYSPRV)) {            CTRACE(TDEST, "VMS......... Enabled SYSPRV\n");	}   }}/* PUBLIC							HTVMS_disableSysPrv()**		DISABLES SYSPRV** ON ENTRY:**	No arguments.**** ON EXIT:**	*/PUBLIC void HTVMS_disableSysPrv NOARGS{unsigned long Result;unsigned long Prv[2], PreviousPrv[2];   Prv[0] = PRV$M_SYSPRV;   Prv[1] = 0;   Result = SYS$SETPRV(0,&Prv,0,&PreviousPrv);      if (Result == SS$_NORMAL) {         if (PreviousPrv[0] & PRV$M_SYSPRV) {            CTRACE(TDEST, "VMS......... Disabled SYSPRV\n");         }   }}/* PUBLIC						HTVMS_disableAllPrv()****		Disable all privileges except TMPMBX and NETMBX**** ON ENTRY:**	No arguments.**** ON EXIT:***/PUBLIC void HTVMS_disableAllPrv NOARGS{#ifndef MULTINET#define bzero(s,n) memset(s,'\0',n)#endif    union prvdef prvadr;    bzero((char *) &prvadr, sizeof(prvadr));    prvadr.prv$v_cmkrnl = 1;          prvadr.prv$v_cmexec = 1;          prvadr.prv$v_sysnam = 1;          prvadr.prv$v_grpnam = 1;          prvadr.prv$v_allspool = 1;        prvadr.prv$v_detach = 1;          prvadr.prv$v_diagnose = 1;        prvadr.prv$v_log_io = 1;          prvadr.prv$v_group = 1;           prvadr.prv$v_noacnt = 1;          prvadr.prv$v_prmceb = 1;          prvadr.prv$v_prmmbx = 1;          prvadr.prv$v_pswapm = 1;          prvadr.prv$v_setpri = 1;          prvadr.prv$v_setprv = 1;          prvadr.prv$v_world = 1;           prvadr.prv$v_mount = 1;           prvadr.prv$v_oper = 1;            prvadr.prv$v_exquota = 1;         prvadr.prv$v_volpro = 1;          prvadr.prv$v_phy_io = 1;          prvadr.prv$v_bugchk = 1;          prvadr.prv$v_prmgbl = 1;          prvadr.prv$v_sysgbl = 1;          prvadr.prv$v_pfnmap = 1;          prvadr.prv$v_shmem = 1;           prvadr.prv$v_sysprv = 1;          prvadr.prv$v_bypass = 1;          prvadr.prv$v_syslck = 1;          prvadr.prv$v_share = 1;           prvadr.prv$v_upgrade = 1;         prvadr.prv$v_downgrade = 1;       prvadr.prv$v_grpprv = 1;          prvadr.prv$v_readall = 1;         prvadr.prv$v_security = 1;    }/* PUBLIC							HTVMS_checkAccess()**		CHECKS ACCESS TO FILE FOR CERTAIN USER** ON ENTRY:**	FileName	The file to be accessed**	UserName	Name of the user to check access for.**			User nobody, represented by "" is given NO for an answer**	Method		Method to be checked for**			'method'	'access reuired'**			METHOD_GET	read**			METHOD_HEAD	read**** ON EXIT:**	returns YES if access is allowed**** Not only filename is checked but also filename.dir...**	*/PUBLIC BOOL HTVMS_checkAccess ARGS3(	CONST char *, FileName,	CONST char *, UserName,	HTMethod, Method){unsigned long Result;ItemStruct ItemList[2];unsigned long Flags;unsigned long FlagsLength;unsigned long Access;unsigned long AccessLength;unsigned long ObjType;char *VmsName;char Fname[256];struct dsc$descriptor_s FileNameDesc;struct dsc$descriptor_s UserNameDesc;char *colon;   /* user nobody should access as from account under which server is running */   if (0 == strcmp(UserName,""))   {      CTRACE(TDEST, "VMSAccess... No access allowed user nobody. Error in rulefile specifying 'nobody' as uid for protect rule\n");      return(NO);   }   /* make local copy */   strcpy(Fname,FileName);   /* strip off last slash anyway */   if (Fname[strlen(Fname)-1] == '/')      Fname[strlen(Fname)-1] = '\0';   /* check Filename and convert */   colon = strchr(Fname,':');   if (colon)      VmsName = HTVMS_name("",colon+1);   else      VmsName = HTVMS_name("",Fname);   /* check for GET */   if ((Method == METHOD_GET) ||       (Method == METHOD_HEAD))    {     Access = ARM$M_READ;     Flags = CHP$M_READ;     /* fill Access */     ItemList[0].BufferLength = sizeof(Access);     ItemList[0].BufferAddress = &Access;     ItemList[0].ReturnLengthAddress = &AccessLength;     ItemList[0].ItemCode = CHP$_ACCESS;     /* fill Flags */     ItemList[1].BufferLength = sizeof(Flags);     ItemList[1].BufferAddress = &Flags;     ItemList[1].ReturnLengthAddress = &FlagsLength;     ItemList[1].ItemCode = CHP$_FLAGS;     /* terminate list */     ItemList[2].ItemCode = 0;     ItemList[2].BufferLength = 0;     /* fill input */     ObjType = ACL$C_FILE;     UserNameDesc.dsc$w_length = strlen(UserName);     UserNameDesc.dsc$b_dtype = DSC$K_DTYPE_T;     UserNameDesc.dsc$b_class = DSC$K_CLASS_S;     UserNameDesc.dsc$a_pointer = UserName;     FileNameDesc.dsc$w_length = strlen(VmsName);     FileNameDesc.dsc$b_dtype = DSC$K_DTYPE_T;     FileNameDesc.dsc$b_class = DSC$K_CLASS_S;     FileNameDesc.dsc$a_pointer = VmsName;     /* call system for filename */     Result = SYS$CHECK_ACCESS(&ObjType,&FileNameDesc,&UserNameDesc,ItemList);     if (Result == SS$_NORMAL)        return(YES);     /* try with extension .dir... */     strcat(VmsName,".dir");     FileNameDesc.dsc$w_length = strlen(VmsName);     Result = SYS$CHECK_ACCESS(&ObjType,&FileNameDesc,&UserNameDesc,ItemList);     if (Result == SS$_NORMAL)        return(YES);     /* failed for filename and .dir */     CTRACE(TDEST, "VMSAccess... No access allowed for user '%s', file '%s' under method '%s'\n",UserName,Fname,HTMethod_name(Method));     return(NO);   }   CTRACE(TDEST, "VMSAccess... No access allowed for method '%s'\n",HTMethod_name(Method));   return(NO);}/* PUBLIC							HTVMS_wwwName()**		CONVERTS VMS Name into WWW Name ** ON ENTRY:**	vmsname		VMS file specification (NO NODE)**** ON EXIT:**	returns 	www file specification**** EXAMPLES:**	vmsname				wwwname**	DISK$USER 			disk$user**	DISK$USER: 			/disk$user/**	DISK$USER:[DUNS] 		/disk$user/duns**	DISK$USER:[DUNS.ECHO] 		/disk$user/duns/echo**	[DUNS] 				duns**	[DUNS.ECHO] 			duns/echo**	[DUNS.ECHO.-.TRANS] 		duns/echo/../trans**	[DUNS.ECHO.--.TRANS] 		duns/echo/../../trans**	[.DUNS] 			duns**	[.DUNS.ECHO] 			duns/echo**	[.DUNS.ECHO]TEST.COM 		duns/echo/test.com **	[.DUNS.ECHO]TEST-BLAH.COM	duns/echo/test-blah.com**	[.DUNS-ECHO]TEST.COM 		duns-echo/test.com**	[.X-----]TEST.COM		x-----/test.com**	TEST.COM 			test.com**	DISK$USER:[DUNS].RHOSTS		/disk$user/duns/.rhosts ****	*/PUBLIC char * HTVMS_wwwName ARGS1(	char *, vmsname){static char wwwname[256];char *src, *dst;int dir, up;   dst = wwwname;   src = vmsname;   dir = 0;   up = 0;   if (strchr(src,':')) *(dst++) = '/';   for ( ; *src != '\0' ; src++)   {      switch(*src)      {         case ':':  *(dst++) = '/'; break;         case '-': /* dashes might exist in filename and directory names... */	           if (up)                   { /* directory and up */		      if (*(src-1) == '-') *(dst++) = '/';                      *(dst++) = '.';                       *(dst++) = '.';                    }                   else                   { /* filename or directory name with a dash */                      *(dst++) = '-';                   }                   break;         case '.': if (dir)                   {                      if (*(src-1) != '[') *(dst++) = '/';                      up = 1;                   }                   else                   {  		      if (*(src-1) == ']') *(dst++) = '/';                      *(dst++) = '.';                   }                   break;         case '[': dir = 1; up = 1; break;         case ']': dir = 0; up = 0; break;         default:  up = 0;		   if (*(src-1) == ']') *(dst++) = '/';                   *(dst++) = *src;                    break;      }   }   *(dst++) = '\0';   return(wwwname);}/* PUBLIC							HTVMS_name()**		CONVERTS WWW name into a VMS name** ON ENTRY:**	nn		Node Name (optional)**	fn		WWW file name**** ON EXIT:**	returns 	vms file specification**** Bug:	Returns pointer to static -- non-reentrant*/PUBLIC char * HTVMS_name ARGS2(	CONST char *, nn, 	CONST char *, fn){/*	We try converting the filename into Files-11 syntax. That is, we assume**	first that the file is, like us, on a VMS node. We try remote**	(or local) DECnet access. Files-11, VMS, VAX and DECnet**	are trademarks of Digital Equipment Corporation. **	The node is assumed to be local if the hostname WITHOUT DOMAIN**	matches the local one. @@@*/    static char vmsname[INFINITY];	/* returned */    char * filename = (char*)malloc(strlen(fn)+1);    char * nodename = (char*)malloc(strlen(nn)+2+1);	/* Copies to hack */    char *second;		/* 2nd slash */    char *last;			/* last slash */        char * hostname = HTGetHostName();    if (!filename || !nodename) outofmem(__FILE__, "HTVMSname");    strcpy(filename, fn);    strcpy(nodename, "");	/* On same node? Yes if node names match */    {        char *p, *q;        for (p=hostname, q=nn; *p && *p!='.' && *q && *q!='.'; p++, q++){	    if (TOUPPER(*p)!=TOUPPER(*q)) {	        strcpy(nodename, nn);		q = strchr(nodename, '.');	/* Mismatch */		if (q) *q=0;			/* Chop domain */		strcat(nodename, "::");		/* Try decnet anyway */		break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -