1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
/* CCKDCDSK.C (c) Copyright Roger Bowler, 1999-2003 */
/* Perform chkdsk for a Compressed CKD Direct Access Storage */
/* Device file. */
/*-------------------------------------------------------------------*/
/* Perform check function on a compressed ckd file */
/*-------------------------------------------------------------------*/
#include "hercules.h"
int syntax ();
/*-------------------------------------------------------------------*/
/* Global data areas */
/*-------------------------------------------------------------------*/
#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*/
/*-------------------------------------------------------------------*/
/* Main function for stand-alone chkdsk */
/*-------------------------------------------------------------------*/
int main (int argc, char *argv[])
{
int cckd_chkdsk_rc = 0; /* Program return code */
char *fn; /* File name */
int fd; /* File descriptor */
int level=1; /* Chkdsk level checking */
int ro=0; /* 1=Open readonly */
int force=0; /* 1=Check if OPENED bit on */
CCKDDASD_DEVHDR cdevhdr; /* Compressed CKD device hdr */
#if defined(ENABLE_NLS)
setlocale(LC_ALL, "");
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
#endif
#ifdef EXTERNALGUI
if (argc >= 1 && strncmp(argv[argc-1],"EXTERNALGUI",11) == 0)
{
extgui = 1;
argc--;
}
#endif /*EXTERNALGUI*/
/* parse the arguments */
for (argc--, argv++ ; argc > 0 ; argc--, argv++)
{
if(**argv != '-') break;
switch(argv[0][1])
{
case '0':
case '1':
case '2':
case '3': if (argv[0][2] != '\0') return syntax ();
level = (argv[0][1] & 0xf);
break;
case 'f': if (argv[0][2] != '\0') return syntax ();
force = 1;
break;
case 'r': if (argv[0][2] == 'o' && argv[0][3] == '\0')
ro = 1;
else return syntax ();
break;
case 'v': if (argv[0][2] != '\0') return syntax ();
display_version (stderr, "Hercules cckd chkdsk program ");
return 0;
default: return syntax ();
}
}
if (argc != 1) return syntax ();
fn = argv[0];
/* open the file */
if (ro)
fd = open (fn, O_RDONLY|O_BINARY);
else
fd = open (fn, O_RDWR|O_BINARY);
if (fd < 0)
{
fprintf (stderr,
_("cckdcdsk: error opening file %s: %s\n"),
fn, strerror(errno));
return -1;
}
/* Check CCKD_OPENED bit if -f not specified */
if (!force)
{
if (lseek (fd, CKDDASD_DEVHDR_SIZE, SEEK_SET) < 0)
{
fprintf (stderr, _("cckdcdsk: lseek error: %s\n"),strerror(errno));
close (fd);
return -1;
}
if (read (fd, &cdevhdr, CCKDDASD_DEVHDR_SIZE) < CCKDDASD_DEVHDR_SIZE)
{
fprintf (stderr, _("cckdcdsk: read error: %s\n"),strerror(errno));
close (fd);
return -1;
}
if (cdevhdr.options & CCKD_OPENED)
{
fprintf (stderr, _("cckdcdsk: OPENED bit is on, use `-f'\n"));
close (fd);
return -1;
}
}
/* call the actual chkdsk function */
cckd_chkdsk_rc = cckd_chkdsk (fd, stderr, level);
/* print some statistics */
if (lseek (fd, CKDDASD_DEVHDR_SIZE, SEEK_SET) < 0)
{
fprintf (stderr, _("lseek error: %s\n"),strerror(errno));
if (!cckd_chkdsk_rc) cckd_chkdsk_rc = 1;
}
else
{
if (read (fd, &cdevhdr, CCKDDASD_DEVHDR_SIZE) < 0)
{
fprintf (stderr, _("read error: %s\n"),strerror(errno));
if (!cckd_chkdsk_rc) cckd_chkdsk_rc = 1;
}
else
{
if (cckd_endian() != ((cdevhdr.options & CCKD_BIGENDIAN) != 0))
cckd_swapend_chdr (&cdevhdr);
fprintf (stdout, _("size %d used %d free %d first 0x%x number %d\n"),
cdevhdr.size, cdevhdr.used, cdevhdr.free_total,
cdevhdr.free, cdevhdr.free_number);
}
}
close (fd);
return cckd_chkdsk_rc;
}
/*-------------------------------------------------------------------*/
/* print syntax */
/*-------------------------------------------------------------------*/
int syntax()
{
fprintf (stderr, _("\ncckdcdsk [-v] [-f] [-level] [-ro] file-name\n"
"\n"
" -v display version and exit\n"
"\n"
" -f force check even if OPENED bit is on\n"
"\n"
" level is a digit 0 - 3:\n"
" -0 -- minimal checking\n"
" -1 -- normal checking\n"
" -3 -- maximal checking\n"
"\n"
" -ro open file readonly, no repairs\n"
"\n"));
return -1;
}
|