mirror of
https://github.com/SDL-Hercules-390/hyperion.git
synced 2026-04-14 16:10:20 +02:00
265 lines
9.2 KiB
C
265 lines
9.2 KiB
C
/* DASDINIT.C (c) Copyright Roger Bowler, 1999-2003 */
|
|
/* Hercules DASD Utilities: DASD image builder */
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* */
|
|
/* This program creates a disk image file and initializes it as */
|
|
/* a blank FBA or CKD DASD volume. */
|
|
/* */
|
|
/* The program is invoked from the shell prompt using the command: */
|
|
/* */
|
|
/* dasdinit [-options] filename devtype[-model] volser [size] */
|
|
/* */
|
|
/* options options: */
|
|
/* -a include alternate cylinders */
|
|
/* (ignored if size specified manually) */
|
|
/* -z build compressed device using zlib */
|
|
/* -bz2 build compressed device using bzip2 */
|
|
/* -0 build compressed device with no compression */
|
|
/* */
|
|
/* filename is the name of the disk image file to be created */
|
|
/* (this program will not overwrite an existing file) */
|
|
/* */
|
|
/* devtype is the emulated device type. */
|
|
/* CKD: 2311, 2314, 3330, 3350, 3375, 3380, */
|
|
/* 3390, 9345 */
|
|
/* FBA: 0671, 3310, 3370, 9313, 9332, 9335, 9336 */
|
|
/* */
|
|
/* model is the device model number and implies the device */
|
|
/* size. If specified, then size shouldn't be specified.*/
|
|
/* */
|
|
/* volser is the volume serial number (1-6 characters) */
|
|
/* */
|
|
/* size is the size of the device (in cylinders for CKD */
|
|
/* devices, or in 512-byte sectors for FBA devices). */
|
|
/* Shouldn't be specified if model is specified. */
|
|
/* */
|
|
/*-------------------------------------------------------------------*/
|
|
|
|
#include "hercules.h"
|
|
#include "dasdblks.h"
|
|
|
|
#ifdef EXTERNALGUI
|
|
/* Special flag to indicate whether or not we're being
|
|
run under the control of the external GUI facility. */
|
|
int extgui = 0;
|
|
#endif /*EXTERNALGUI*/
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* Subroutine to display command syntax and exit */
|
|
/*-------------------------------------------------------------------*/
|
|
static void
|
|
argexit ( int code, char *m )
|
|
{
|
|
|
|
switch (code) {
|
|
case 0:
|
|
fprintf (stderr, "Invalid or supported option: %s\n",
|
|
m ? m : "(null)");
|
|
break;
|
|
case 1:
|
|
fprintf (stderr, "Invalid or missing filename: %s\n",
|
|
m ? m : "(null)");
|
|
break;
|
|
case 2:
|
|
fprintf (stderr, "Invalid or missing device type: %s\n",
|
|
m ? m : "(null)");
|
|
break;
|
|
case 3:
|
|
fprintf (stderr, "Invalid or missing volser: %s\n",
|
|
m ? m : "(null)");
|
|
break;
|
|
case 4:
|
|
fprintf (stderr, "Invalid or missing size: %s\n",
|
|
m ? m : "(null)");
|
|
break;
|
|
case 5:
|
|
fprintf (stderr, "Invalid number of arguments\n");
|
|
break;
|
|
default:
|
|
|
|
display_version (stderr,
|
|
"Hercules DASD image file creation program\n");
|
|
|
|
fprintf (stderr,
|
|
|
|
"Builds an empty dasd image file:\n\n"
|
|
|
|
" dasdinit [-options] filename devtype[-model] volser [size]\n\n"
|
|
|
|
"where:\n\n"
|
|
|
|
" -v display version info and help\n"
|
|
#ifdef HAVE_LIBZ
|
|
" -z build compressed dasd image file using zlib\n"
|
|
#endif
|
|
#ifdef CCKD_BZIP2
|
|
" -bz2 build compressed dasd image file using bzip2\n"
|
|
#endif
|
|
" -0 build compressed dasd image file with no compression\n"
|
|
#if _FILE_OFFSET_BITS == 64 || defined(_LARGE_FILES)
|
|
" -lfs build a large (uncompressed) dasd file\n"
|
|
#endif
|
|
" -a build dasd image file that includes alternate cylinders\n"
|
|
" (option ignored if size is manually specified)\n\n"
|
|
|
|
" filename name of dasd image file to be created\n\n"
|
|
|
|
" devtype CKD: 2311, 2314, 3330, 3340, 3350, 3375, 3380, 3390, 9345\n"
|
|
" FBA: 0671, 3310, 3370, 9313, 9332, 9335, 9336\n\n"
|
|
|
|
" model device model (implies size) (opt)\n\n"
|
|
|
|
" volser volume serial number (1-6 characters)\n\n"
|
|
|
|
" size number of CKD cylinders or 512-byte FBA sectors\n"
|
|
" (required if model not specified else optional)\n"
|
|
|
|
);
|
|
break;
|
|
}
|
|
exit(code);
|
|
} /* end function argexit */
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* DASDINIT program main entry point */
|
|
/*-------------------------------------------------------------------*/
|
|
int main ( int argc, char *argv[] )
|
|
{
|
|
int altcylflag = 0; /* Alternate cylinders flag */
|
|
U32 size = 0; /* Volume size */
|
|
U32 altsize = 0; /* Alternate cylinders */
|
|
U32 heads = 0; /* Number of tracks/cylinder */
|
|
U32 maxdlen = 0; /* Maximum R1 data length */
|
|
U32 sectsize = 0; /* Sector size */
|
|
U16 devtype = 0; /* Device type */
|
|
BYTE comp = 0xff; /* Compression algoritm */
|
|
BYTE type = 0; /* C=CKD, F=FBA */
|
|
BYTE fname[1024]; /* File name */
|
|
BYTE volser[7]; /* Volume serial number */
|
|
BYTE c; /* Character work area */
|
|
CKDDEV *ckd; /* -> CKD device table entry */
|
|
FBADEV *fba; /* -> FBA device table entry */
|
|
int lfs = 0; /* 1 = Build large file */
|
|
|
|
#ifdef EXTERNALGUI
|
|
if (argc >= 1 && strncmp(argv[argc-1],"EXTERNALGUI",11) == 0)
|
|
{
|
|
extgui = 1;
|
|
argc--;
|
|
}
|
|
#endif /*EXTERNALGUI*/
|
|
|
|
/* Display program identification and help */
|
|
if (argc <= 1 || (argc == 2 && !strcmp(argv[1], "-v")))
|
|
argexit(-1, NULL);
|
|
|
|
/* Process optional arguments */
|
|
for ( ; argc > 1 && argv[1][0] == '-'; argv++, argc--)
|
|
{
|
|
if (strcmp("0", &argv[1][1]) == 0)
|
|
comp = CCKD_COMPRESS_NONE;
|
|
#ifdef HAVE_LIBZ
|
|
else if (strcmp("z", &argv[1][1]) == 0)
|
|
comp = CCKD_COMPRESS_ZLIB;
|
|
#endif
|
|
#ifdef CCKD_BZIP2
|
|
else if (strcmp("bz2", &argv[1][1]) == 0)
|
|
comp = CCKD_COMPRESS_BZIP2;
|
|
#endif
|
|
else if (strcmp("a", &argv[1][1]) == 0)
|
|
altcylflag = 1;
|
|
#if _FILE_OFFSET_BITS == 64 || defined(_LARGE_FILES)
|
|
else if (strcmp("lfs", &argv[1][1]) == 0)
|
|
lfs = 1;
|
|
#endif
|
|
else argexit(0, argv[1]);
|
|
}
|
|
|
|
/* Check remaining number of arguments */
|
|
|
|
if (argc < 4 || argc > 5)
|
|
argexit(5, NULL);
|
|
|
|
/* The first argument is the file name */
|
|
|
|
if (!argv[1] || strlen(argv[1]) == 0
|
|
|| strlen(argv[1]) > sizeof(fname)-1)
|
|
argexit(1, argv[1]);
|
|
|
|
strcpy (fname, argv[1]);
|
|
|
|
/* The second argument is the device type,
|
|
with or without the model number. */
|
|
|
|
if (!argv[2])
|
|
argexit(2, argv[2]);
|
|
ckd = dasd_lookup (DASD_CKDDEV, argv[2], 0, 0);
|
|
if (ckd != NULL)
|
|
{
|
|
type = 'C';
|
|
devtype = ckd->devt;
|
|
size = ckd->cyls;
|
|
altsize = ckd->altcyls;
|
|
heads = ckd->heads;
|
|
maxdlen = ckd->r1;
|
|
}
|
|
else
|
|
{
|
|
fba = dasd_lookup (DASD_FBADEV, argv[2], 0, 0);
|
|
if (fba != NULL)
|
|
{
|
|
type = 'F';
|
|
devtype = fba->devt;
|
|
size = fba->blks;
|
|
altsize = 0;
|
|
sectsize = fba->size;
|
|
}
|
|
}
|
|
|
|
if (!type)
|
|
/* Specified model not found */
|
|
argexit(2, argv[2]);
|
|
|
|
/* The third argument is the volume serial number */
|
|
if (!argv[3] || strlen(argv[3]) == 0
|
|
|| strlen(argv[3]) > sizeof(volser)-1)
|
|
argexit(3, argv[3]);
|
|
|
|
strcpy (volser, argv[3]);
|
|
string_to_upper (volser);
|
|
|
|
/* The fourth argument is the volume size */
|
|
if (argc > 4)
|
|
{
|
|
if (argc > 5)
|
|
argexit(5, NULL);
|
|
|
|
if (!argv[4] || strlen(argv[4]) == 0
|
|
|| sscanf(argv[4], "%u%c", &size, &c) != 1)
|
|
argexit(4, argv[4]);
|
|
|
|
altcylflag = 0;
|
|
}
|
|
|
|
if (altcylflag)
|
|
size += altsize;
|
|
|
|
/* Create the device */
|
|
|
|
if (type == 'C')
|
|
create_ckd (fname, devtype, heads, maxdlen, size, volser,
|
|
comp, lfs, 0);
|
|
else
|
|
create_fba (fname, devtype, sectsize, size, volser, comp,
|
|
lfs, 0);
|
|
|
|
/* Display completion message */
|
|
|
|
fprintf (stderr, _("HHCDI001I DASD initialization successfully "
|
|
"completed.\n"));
|
|
|
|
return 0;
|
|
|
|
} /* end function main */
|