VMS vs. UNIX file system
Marc Evans
marc at ima.ima.isc.com
Wed Sep 21 03:45:48 AEST 1988
Below is a program which I received from DEC a while back which demonstraits
a mechanism which can be used to modify the type of file that RMS thinks any
file is. I have used this as it is below, to work under VMS, while maintaining
UNIX like file IO characteristics.
Happy Hacking...
===============================================================================
Marc Evans | decvax<--\ /-->marc<--\ | That's not a bug...It's
Synergytics| harvard<--\ / \ /--->norton | a design feature... 8-)
Pelham, NH | necntc<---->ima<---->symetrx<---->dupont | =======================
===============================================================================
-------------------- C U T H E R E ------------------------------------------
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: mungattr.c build.com
# Wrapped by marc at edogte on Tue Sep 20 11:41:23 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'mungattr.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'mungattr.c'\"
else
echo shar: Extracting \"'mungattr.c'\" \(2842 characters\)
sed "s/^X//" >'mungattr.c' <<'END_OF_FILE'
X/****************************************************************************
X * Program: mungattr.c
X * Purpose: This program changes the file attributes and record
X * length to a specified value.
X * Author: Mark Turner - Language Support Team (DEC)
X * Date: June, 1988
X ****************************************************************************
X * Modified: Marc Evans - Independant Contractor (Synergytics)
X * Date: Sept., 1988
X ****************************************************************************/
X
X#include <stdio.h>
X#include <iodef.h>
X#include <fibdef.h>
X#include <atrdef.h>
X#include <descrip.h>
X#include <stat.h>
X#include "fatdef.h"
X
struct
X{ short cond_value, count;
X int info;
X} iosb;
X
struct
X{ unsigned short w_size, w_type;
X unsigned int l_addr;
X} acb[2];
X
struct fibdef fib;
struct stat my_buff;
struct
X{ unsigned char rtype, rattrib;
X short rsize;
X char filler_2[12];
X short mrec;
X char filler_3[14];
X} ratt_area;
X
int status;
X
short func_code, chan;
X
X$DESCRIPTOR(fibdesc, &fib);
X$DESCRIPTOR(device, "SYS$DISK:"); /* Disk the file is on */
X
main(argc,argv)
char **argv;
X{
X char *filename;
X
X /* Did the invoker supply a filename? */
X if (argc != 2)
X { fprintf(stderr,"USAGE: %s filename\n",argv[0]);
X exit(1);
X }
X filename = argv[1];
X
X /* Get the FID of the file */
X stat(filename, &my_buff);
X
X /* Assign a channel to the disk */
X if ((status = SYS$ASSIGN(&device,&chan,0,0)) & 1 != 1)
X { LIB$STOP(status); }
X
X /* Init the appropriate fields of the FIB */
X fibdesc.dsc$w_length = FIB$C_LENGTH;
X fib.fib$r_acctl_overlay.fib$r_acctl_bits0.fib$v_write = 1;
X fib.fib$r_fid_overlay.fib$w_fid[0] = my_buff.st_ino[0];
X fib.fib$r_fid_overlay.fib$w_fid[1] = my_buff.st_ino[1];
X fib.fib$r_fid_overlay.fib$w_fid[2] = my_buff.st_ino[2];
X
X /* Set up the attribute control block */
X acb[1].w_size = 0;
X acb[1].w_type = 0;
X acb[1].l_addr = 0;
X acb[0].w_size = ATR$S_RECATTR;
X acb[0].w_type = ATR$C_RECATTR;
X acb[0].l_addr = &ratt_area;
X
X /* Access the file */
X func_code = IO$_ACCESS | IO$M_ACCESS;
X status = SYS$QIOW(0,chan,func_code,&iosb,0,0,&fibdesc,0,0,0,&acb,0);
X if ((status & 1) != 1)
X { LIB$STOP(status); }
X if ((iosb.cond_value & 1) != 1)
X { LIB$STOP(iosb.cond_value); }
X
X /* Change the file to a sequential stream file */
X ratt_area.rtype = FAT$C_FIXED | FAT$C_SEQUENTIAL;
X ratt_area.rsize = 512;
X ratt_area.mrec = 512;
X ratt_area.rattrib = FAT$M_IMPLIEDCC;
X
X /* Modify the file header information */
X status = SYS$QIOW(0,chan,IO$_MODIFY,&iosb,0,0,&fibdesc,0,0,0,&acb,0);
X if ((status & 1) != 1)
X { LIB$STOP(status); }
X if ((iosb.cond_value & 1) != 1)
X { LIB$STOP(iosb.cond_value); }
X
X /* Deaccess the file */
X func_code = IO$_DEACCESS;
X status = SYS$QIOW(0,chan,func_code,&iosb,0,0,&fibdesc,0,0,0,0,0);
X if ((status & 1) != 1)
X { LIB$STOP(status); }
X if ((iosb.cond_value & 1) != 1)
X { LIB$STOP(iosb.cond_value); }
X
X}
END_OF_FILE
if test 2842 -ne `wc -c <'mungattr.c'`; then
echo shar: \"'mungattr.c'\" unpacked with wrong size!
fi
# end of 'mungattr.c'
fi
if test -f 'build.com' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'build.com'\"
else
echo shar: Extracting \"'build.com'\" \(80 characters\)
sed "s/^X//" >'build.com' <<'END_OF_FILE'
X$ set verify
X$ cc/opt/nodebug mungattr.c
X$ link/nodebug mungattr
X$ set noverify
END_OF_FILE
if test 80 -ne `wc -c <'build.com'`; then
echo shar: \"'build.com'\" unpacked with wrong size!
fi
# end of 'build.com'
fi
echo shar: End of shell archive.
exit 0
More information about the Comp.unix.wizards
mailing list