mirror of
https://github.com/open-simh/simtools.git
synced 2026-01-22 10:31:47 +00:00
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.
222 lines
7.8 KiB
C
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;
|
|
}
|