📄 htvmsutils.c
字号:
/* 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 + -