Timothe Litt 66e00b9900 Backlog of work since 2016
Too much to list all, but includes (in no particular order):
 - Cleanup for 64-bit builds, MSVC warnings.
 - Structured help
 - Help file compiler.
 - Supports volsets, writes/create work.
 - Support for I18n in messages, help.
 - Makefiles.
 - Initialize volume/volset
 - Command line editing/history

Builds and works on Linux and Windows (VS).
Not recently built or tested on other platforms, but
not intentinonally broken.
2022-10-10 11:00:20 -04:00

222 lines
7.8 KiB
C

/* This is part of ODS2 written by Paul Nankervis,
* email address: Paulnank@au1.ibm.com
*
* ODS2 is distributed freely for all members of the
* VMS community to use. However all derived works
* must maintain comments in their source to acknowledge
* the contributions of the original author and
* subsequent contributors. This is free software; no
* warranty is offered, and while we believe it to be useful,
* you use it at your own risk. This is free software; no
* warranty is offered, and while we believe it to be useful,
* you use it at your own risk.
*/
#if !defined( DEBUG ) && defined( DEBUG_INITIALCMD )
#define DEBUG DEBUG_INITIALCMD
#else
#ifndef DEBUG
#define DEBUG 0
#endif
#endif
#include "compat.h"
#include "cmddef.h"
#include "access.h"
#include "device.h"
#include "initvol.h"
#include "phyvirt.h"
/******************************************************************* doinitial() */
static struct NEWVOL initpars;
#define init_beg OPT_GENERIC_1
#define init_mid OPT_GENERIC_2
#define init_blk OPT_GENERIC_3
#define init_mount OPT_GENERIC_4
#define init_disp OPT_GENERIC_5
#define init_confirm OPT_GENERIC_6
#define init_uic OPT_GENERIC_7
#define init_dtype OPT_GENERIC_8
static qual_t
idxkwds[] =
{ {"beginning", init_beg, init_mid|init_blk, NV,
"commands initialize qual_index begin"},
{"block", init_blk, init_beg|init_mid, DV(&initpars.indexlbn),
"commands initialize qual_index block"},
{"middle", init_mid, init_beg|init_blk, NV,
"commands initialize qual_index middle"},
{NULL, 0, 0, NV, NULL}
};
qual_t
iniquals[] =
{ {DT_NAME, 0, MOU_DEVTYPE, CV(NULL),
"commands initialize qual_media"},
{"bootblock", 0, 0, DV(&initpars.bootlbn),
"commands initialize qual_bootblock"},
{"cluster_size", 0, 0, DV(&initpars.clustersize),
"commands initialize qual_clustersize" },
{"confirm", init_confirm, 0, NV,
"-commands initialize qual_confirm"},
{"noconfirm", 0, init_confirm,
NV, NULL},
{"create", init_disp|PHY_CREATE,
0, NV,
"commands initialize qual_create" },
{"directories", 0, 0, DV(&initpars.directories),
"commands initialize qual_directories" },
{"file_protection", 0, 0, PV(&initpars.fileprot),
"commands initialize qual_fileprot"},
{"headers", 0, 0, DV(&initpars.headers),
"commands initialize qual_headers" },
{"extension", 0, 0, DV(&initpars.extension),
"commands initialize qual_extension" },
{"windows", 0, 0, DV(&initpars.windows),
"commands initialize qual_windows" },
{"index", 0, init_beg|init_mid|init_blk, KV(idxkwds),
"commands initialize qual_index"},
{"image", init_dtype | MOU_VIRTUAL,
0, NV,
"commands initialize qual_image", },
{"device", init_dtype, MOU_VIRTUAL, NV,
"commands initialize qual_device", },
{"log", MOU_LOG, 0, NV, "-commands initialize qual_log"},
{"nolog", 0, MOU_LOG, NV, NULL},
{"replace", init_disp, PHY_CREATE,
NV,
"commands initialize qual_replace" },
{"mount", init_mount, 0, NV,
"-commands initialize qual_mount"},
{"nomount", 0, init_mount, NV, NULL },
{"virtual", init_dtype | MOU_VIRTUAL, 0, NV, NULL, },
{"maximum_files", 0, 0, DV(&initpars.maxfiles),
"commands initialize qual_maxfiles" },
{"owner_uic", init_uic, 0, UV(&initpars.useruic),
"commands initialize qual_owneruic"},
{"protection", 0, 0, PV(&initpars.volprot),
"commands initialize qual_protection"},
{"user_name", 0, 0, SV(&initpars.username),
"commands initialize qual_username"},
{ NULL, 0, 0, NV, NULL }
};
param_t
inipars[] =
{ {"device", REQ, FSPEC, NOPA, "commands initialize devspec" },
{"labels", REQ, STRING, NOPA, "commands initialize volspec" },
{ NULL, 0, 0, NOPA, NULL }
};
DECL_CMD(initial) {
vmscond_t sts = SS$_NORMAL;
options_t options;
char *devname = NULL;
UNUSED(argc);
devname = argv[1];
memset( &initpars, 0, sizeof( initpars ) );
initpars.extension = 5;
initpars.windows = 7;
sts = checkquals( &options, init_confirm | init_mid | init_mount,
iniquals, qualc, qualv );
do {
size_t len;
struct DEV *dev;
char *p;
if( $FAILED( sts ) ) {
break;
}
options |= MOU_WRITE;
if( !(options & init_dtype) && (p = strchr( devname, '.' )) ) {
len = strlen( p+1 );
if( len >= 1 && len == strspn( p+1, "0123456789" ".;-_"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz" ) )
options |= MOU_VIRTUAL;
}
if( options & MOU_VIRTUAL ) {
if( !(options & init_disp) ) /* Disposition (/create/replace)? */
options |= PHY_CREATE;
} else {
if( options & init_disp ) {
printmsg( INIT_INVOPT, 0, qstyle_s, qstyle_s );
}
}
if( options & init_mid )
initpars.indexlbn = INIT_INDEX_MIDDLE;
if( options & init_beg )
initpars.indexlbn = 0;
if( (options & init_blk) && initpars.indexlbn == INIT_INDEX_MIDDLE )
initpars.indexlbn--;
if( options & MOU_LOG )
initpars.options |= INIT_LOG;
if( options & MOU_VIRTUAL )
initpars.options |= INIT_VIRTUAL;
if( options & init_uic )
initpars.options |= INIT_OWNUIC;
initpars.devtype = disktype[(options & MOU_DEVTYPE) >> MOU_V_DEVTYPE].name;
len = strlen( argv[2] );
if( len > 12 || !*argv[2] ||
strspn( argv[2], VOL_ALPHABET ) != len ) {
sts = printmsg( INIT_BADVOLLABEL, 0 );
break;
}
initpars.label = argv[2];
if( (options & init_confirm) &&
$FAILS(sts = confirm_cmd( (options & MOU_VIRTUAL)?
INIT_CONFIRM_VIRT: INIT_CONFIRM_PHY,
devname, initpars.devtype )) )
break;
if( $FAILS(sts = virt_open( &devname, options, &dev )) )
break;
if( !(dev->access & MOU_WRITE) ) {
sts = SS$_WRITLCK;
virt_close( dev );
break;
}
initpars.devnam = devname;
if( $FAILS(sts = initvol( dev, &initpars )) ) {
virt_close( dev );
break;
}
if( $FAILS(sts = virt_close( dev )) )
break;
if( options & init_mount ) {
sts = mount( (options & (MOU_VIRTUAL|MOU_DEVTYPE|MOU_WRITE)) | MOU_LOG,
1, argv+1, argv+2 );
}
} while( 0 );
if( $SUCCESSFUL( sts ) )
return sts;
sts = printmsg( sts, 0 );
if( (options & (MOU_VIRTUAL|PHY_CREATE)) == (MOU_VIRTUAL|PHY_CREATE) &&
!( $MATCHCOND(sts, SS$_DUPFILENAME) ||
$MATCHCOND(sts, SS$_IVDEVNAM) ) ) {
(void) Unlink( argv[1] );
}
return sts;
}