vms file access
Fix the problem From a bug report. His system has a logical name "DATA" pointing at some disk, and
when the dlb utility tried to open "data" for inclusion in the library
being built at install time, it attempted to access the wrong thing and
failed. He then attempted to fix it in a manner which let dlb finish, by
modifying dlb_main.c to append "." to file names that lack a dot, but
then nethack couldn't access "dungeon" in the library because string
comparison didn't match the altered dlb directory entry of "dungeon.".
NetHack was working around this unintended interaction with the
environment issue in fopen_datafile(), and dlb was doing so for fopen()
but not open(). This moves nethack's fixup out of src/files.c and into
sys/vms/vmsfiles.c, adds another routine there so that both open() and
fopen() are covered, and updates the vms Makefiles so that the various
utility programs all link with vmsfiles. (The build script vmsbuild.com
puts object files into a library and gets that last bit for free.)
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
# NetHack Makefile (VMS) - for building nethack itself.
|
||||
# SCCS Id: @(#)Makefile.src 3.5 2006/01/07
|
||||
# SCCS Id: @(#)Makefile.src 3.5 2007/10/27
|
||||
|
||||
# Copy this file to [.src]Makefile. and then edit it as needed.
|
||||
# The default configuration is for building with DEC C (aka Compaq C).
|
||||
@@ -49,7 +49,7 @@ MORELIBS =
|
||||
# Specific VMS object files
|
||||
SYSSRC = $(VMS)vmsmain.c,$(VMS)vmstty.c,$(VMS)vmsunix.c,\
|
||||
$(VMS)vmsmisc.c,$(VMS)vmsfiles.c,$(VMS)vmsmail.c
|
||||
SYSOBJ = vmsmain.obj,vmstty.obj,vmsunix.obj,vmsfiles.obj,vmsmail.obj #,vmsmisc.obj
|
||||
SYSOBJ = vmsmain.obj,vmstty.obj,vmsunix.obj,vmsmail.obj #,vmsmisc.obj,vmsfiles.obj
|
||||
LIBOPT = $(SRC)crtl.opt;
|
||||
|
||||
# termcap library
|
||||
@@ -139,7 +139,7 @@ HACKINCL = align.h amiconf.h artifact.h artilist.h attrib.h beconf.h color.h \
|
||||
# lev_comp.h dgn_comp.h dgn_file.h
|
||||
|
||||
# the following .obj's should be made before any others (for makedefs)
|
||||
FIRSTOBJ = vmsmisc.obj,monst.obj,objects.obj
|
||||
FIRSTOBJ = vmsmisc.obj,vmsfiles.obj,monst.obj,objects.obj
|
||||
|
||||
# split up long list so that we can write pieces of it into nethack.opt
|
||||
HOBJ1 = allmain.obj,alloc.obj,apply.obj,artifact.obj,attrib.obj, \
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# NetHack Makefile (VMS) - for utility programs.
|
||||
# SCCS Id: @(#)Makefile.utl 3.5 2006/03/15
|
||||
# SCCS Id: @(#)Makefile.utl 3.5 2007/10/27
|
||||
|
||||
# Copy this file to [.util]Makefile. and then edit it as needed.
|
||||
# The default configuration is for building with DEC C (aka Compaq C).
|
||||
@@ -91,6 +91,8 @@ RECOVSRC = recover.c
|
||||
DLBSRC = dlb_main.c
|
||||
UTILSRCS = $(MAKESRC) $(SPLEVSRC) $(DGNCOMPSRC) $(RECOVSRC) $(DLBSRC) panic.c
|
||||
|
||||
VMSOBJS = $(SRC)vmsmisc.obj,$(SRC)vmsfiles.obj
|
||||
|
||||
# object files that provide access to NetHack's names
|
||||
NAMEOBJ1 = $(SRC)monst.obj,$(SRC)objects.obj
|
||||
NAMEOBJ2 = $(SRC)drawing.obj,$(SRC)decl.obj
|
||||
@@ -98,24 +100,19 @@ NAMEOBJS = $(NAMEOBJ1),$(NAMEOBJ2)
|
||||
|
||||
# object files for makedefs
|
||||
MAKEOBJS = makedefs.obj,$(NAMEOBJ1)
|
||||
VMSMAKEOBJS = $(SRC)vmsmisc.obj
|
||||
|
||||
# object files for special levels compiler
|
||||
SPLEVOBJS = lev_main.obj,lev_yacc.obj,lev_lex.obj,panic.obj,\
|
||||
$(SRC)alloc.obj,$(NAMEOBJS)
|
||||
VMSSPLEVOBJS = $(SRC)vmsmisc.obj,$(SRC)vmsfiles.obj
|
||||
|
||||
# object files for dungeon compiler
|
||||
DGNCOMPOBJS = dgn_main.obj,dgn_yacc.obj,dgn_lex.obj,panic.obj,$(SRC)alloc.obj
|
||||
VMSDGNCOBJS = $(SRC)vmsmisc.obj
|
||||
|
||||
# object files for recovery utility
|
||||
RECOVOBJS = recover.obj
|
||||
VMSRECOBJS = $(SRC)vmsmisc.obj,$(SRC)vmsfiles.obj
|
||||
|
||||
# object files for dlb utility
|
||||
DLBOBJS = dlb_main.obj,panic.obj,$(SRC)alloc.obj,$(SRC)dlb.obj
|
||||
VMSDLBOBJS = $(SRC)vmsmisc.obj,$(SRC)vmsfiles.obj
|
||||
|
||||
|
||||
# fake target
|
||||
@@ -154,8 +151,8 @@ $(LIBOPT) : $(SRC)Makefile.; # linker options file
|
||||
|
||||
# dependencies for makedefs
|
||||
#
|
||||
$(MAKEDEFS) : $(MAKEOBJS) $(VMSMAKEOBJS) $(LIBOPT)
|
||||
$(LINK) $(LFLAGS) $(MAKEOBJS),$(VMSMAKEOBJS),$(LIBS)
|
||||
$(MAKEDEFS) : $(MAKEOBJS) $(VMSOBJS) $(LIBOPT)
|
||||
$(LINK) $(LFLAGS) $(MAKEOBJS),$(VMSOBJS),$(LIBS)
|
||||
@ $(TOUCH) $(MARKER)
|
||||
|
||||
makedefs.obj : makedefs.c \
|
||||
@@ -184,8 +181,8 @@ $(INC)date.h : $(MAKEDEFS)
|
||||
|
||||
# dependencies for lev_comp
|
||||
#
|
||||
$(LEVCOMP) : $(SPLEVOBJS) $(VMSSPLEVOBJS) # $(LIBOPT)
|
||||
$(LINK)/Exe=$(LEVCOMP) $(LFLAGS) $(SPLEVOBJS),$(VMSSPLEVOBJS),$(LIBS)
|
||||
$(LEVCOMP) : $(SPLEVOBJS) $(VMSOBJS) # $(LIBOPT)
|
||||
$(LINK)/Exe=$(LEVCOMP) $(LFLAGS) $(SPLEVOBJS),$(VMSOBJS),$(LIBS)
|
||||
|
||||
lev_yacc.obj : $(HACK_H) $(INC)sp_lev.h lev_yacc.c
|
||||
$(CC) $(CFLAGS) lev_yacc.c
|
||||
@@ -217,8 +214,8 @@ lev_lex.c : lev_comp.l
|
||||
|
||||
# dependencies for dgn_comp
|
||||
#
|
||||
$(DGNCOMP) : $(DGNCOMPOBJS) $(VMSDGNCOBJS) # $(LIBOPT)
|
||||
$(LINK)/Exe=$(DGNCOMP) $(LFLAGS) $(DGNCOMPOBJS),$(VMSDGNCOBJS),$(LIBS)
|
||||
$(DGNCOMP) : $(DGNCOMPOBJS) $(VMSOBJS) # $(LIBOPT)
|
||||
$(LINK)/Exe=$(DGNCOMP) $(LFLAGS) $(DGNCOMPOBJS),$(VMSOBJS),$(LIBS)
|
||||
|
||||
dgn_yacc.obj : $(CONFIG_H) $(INC)dgn_file.h $(INC)date.h dgn_yacc.c
|
||||
$(CC) $(CFLAGS) dgn_yacc.c
|
||||
@@ -248,15 +245,15 @@ dgn_lex.c : dgn_comp.l
|
||||
|
||||
# dependencies for recover
|
||||
#
|
||||
$(RECOVER) : $(RECOVOBJS) $(VMSRECOBJS) # $(LIBOPT)
|
||||
$(LINK) $(LFLAGS) $(RECOVOBJS),$(VMSRECOBJS),$(LIBS)
|
||||
$(RECOVER) : $(RECOVOBJS) $(VMSOBJS) # $(LIBOPT)
|
||||
$(LINK) $(LFLAGS) $(RECOVOBJS),$(VMSOBJS),$(LIBS)
|
||||
|
||||
recover.obj : $(CONFIG_H) recover.c
|
||||
|
||||
# dependencies for dlb
|
||||
#
|
||||
$(DLB) : $(DLBOBJS) $(VMSDLBOBJS) # $(LIBOPT)
|
||||
$(LINK)/Exe=$(DLB) $(LFLAGS) $(DLBOBJS),$(VMSDLBOBJS),$(LIBS)
|
||||
$(DLB) : $(DLBOBJS) $(VMSOBJS) # $(LIBOPT)
|
||||
$(LINK)/Exe=$(DLB) $(LFLAGS) $(DLBOBJS),$(VMSOBJS),$(LIBS)
|
||||
|
||||
dlb_main.obj : $(CONFIG_H) $(INC)dlb.h dlb_main.c
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* SCCS Id: @(#)vmsfiles.c 3.5 1999/08/29 */
|
||||
/* SCCS Id: @(#)vmsfiles.c 3.5 2007/10/27 */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
@@ -13,10 +13,8 @@
|
||||
int FDECL(vms_link, (const char *,const char *));
|
||||
int FDECL(vms_unlink, (const char *));
|
||||
int FDECL(vms_creat, (const char *,unsigned int));
|
||||
int FDECL(vms_open, (const char *,int,unsigned int));
|
||||
boolean FDECL(same_dir, (const char *,const char *));
|
||||
int FDECL(c__translate, (int));
|
||||
char *FDECL(vms_basename, (const char *));
|
||||
|
||||
#include <rms.h>
|
||||
#if 0
|
||||
@@ -113,16 +111,22 @@ const char *file;
|
||||
and use 32 block buffer for faster throughput; ~30% speedup measured.)
|
||||
*/
|
||||
#undef creat
|
||||
int vms_creat(file, mode)
|
||||
int
|
||||
vms_creat(file, mode)
|
||||
const char *file;
|
||||
unsigned int mode;
|
||||
{
|
||||
char filnambuf[BUFSIZ]; /*(not BUFSZ)*/
|
||||
|
||||
if (index(file, ';')) {
|
||||
/* assumes remove or delete, not vms_unlink */
|
||||
if (!unlink(file)) {
|
||||
(void)sleep(1);
|
||||
(void)unlink(file);
|
||||
}
|
||||
} else if (!index(file, '.')) {
|
||||
/* force some punctuation to be present */
|
||||
file = strcat(strcpy(filnambuf, file), ".");
|
||||
}
|
||||
return creat(file, mode, "shr=nil", "mbc=32", "mbf=2", "rop=wbh");
|
||||
}
|
||||
@@ -133,13 +137,21 @@ unsigned int mode;
|
||||
at least one NFS implementation).
|
||||
*/
|
||||
#undef open
|
||||
int vms_open(file, flags, mode)
|
||||
int
|
||||
vms_open(file, flags, mode)
|
||||
const char *file;
|
||||
int flags;
|
||||
unsigned int mode;
|
||||
{
|
||||
int fd = open(file, flags, mode, "mbc=32", "mbf=2", "rop=rah");
|
||||
char filnambuf[BUFSIZ]; /*(not BUFSZ)*/
|
||||
int fd;
|
||||
|
||||
if (!index(file, '.') && !index(file, ';')) {
|
||||
/* force some punctuation to be present to make sure that
|
||||
the file name can't accidentally match a logical name */
|
||||
file = strcat(strcpy(filnambuf, file), ";0");
|
||||
}
|
||||
fd = open(file, flags, mode, "mbc=32", "mbf=2", "rop=rah");
|
||||
if (fd < 0 && errno == EVMSERR && lib$match_cond(vaxc$errno, RMS$_FLK)) {
|
||||
(void)sleep(1);
|
||||
fd = open(file, flags, mode, "mbc=32", "mbf=2", "rop=rah");
|
||||
@@ -147,6 +159,28 @@ unsigned int mode;
|
||||
return fd;
|
||||
}
|
||||
|
||||
/* do likewise for fopen() */
|
||||
#undef fopen
|
||||
FILE *
|
||||
vms_fopen(file, mode)
|
||||
const char *file, *mode;
|
||||
{
|
||||
char filnambuf[BUFSIZ]; /*(not BUFSZ)*/
|
||||
FILE *fp;
|
||||
|
||||
if (!index(file, '.') && !index(file, ';')) {
|
||||
/* force some punctuation to be present to make sure that
|
||||
the file name can't accidentally match a logical name */
|
||||
file = strcat(strcpy(filnambuf, file), ";0");
|
||||
}
|
||||
fp = fopen(file, mode, "mbc=32", "mbf=2", "rop=rah");
|
||||
if (!fp && errno == EVMSERR && lib$match_cond(vaxc$errno, RMS$_FLK)) {
|
||||
(void)sleep(1);
|
||||
fp = fopen(file, mode, "mbc=32", "mbf=2", "rop=rah");
|
||||
}
|
||||
return fp;
|
||||
}
|
||||
|
||||
/*
|
||||
Determine whether two strings contain the same directory name.
|
||||
Used for deciding whether installed privileges should be disabled
|
||||
|
||||
Reference in New Issue
Block a user