/*-------------------------------------------------------------------*/ int main (int argc, char *argv[]) { int i; /* Index */ int rc; /* Return code */ 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 */ DEVBLK devblk; /* DEVBLK */ DEVBLK *dev=&devblk; /* -> DEVBLK */ INITIALIZE_UTILITY("cckdcdsk"); /* 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': case '4': 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 ", FALSE); return 0; default: return syntax (); } } if (argc < 1) return syntax (); for (i = 0; i < argc; i++) { memset (dev, 0, sizeof(DEVBLK)); dev->batch = 1; /* open the file */ hostpath(dev->filename, argv[i], sizeof(dev->filename)); dev->fd = hopen(dev->filename, ro ? O_RDONLY|O_BINARY : O_RDWR|O_BINARY); if (dev->fd < 0) { cckdumsg (dev, 700, "open error: %s\n", strerror(errno)); continue; } /* Check CCKD_OPENED bit if -f not specified */ if (!force) { if (lseek (dev->fd, CCKD_DEVHDR_POS, SEEK_SET) < 0) { cckdumsg (dev, 702, "lseek error offset 0x%" I64_FMT "x: %s\n", (long long)CCKD_DEVHDR_POS, strerror(errno)); close (dev->fd); continue; } if ((rc = read (dev->fd, &cdevhdr, CCKD_DEVHDR_SIZE)) < CCKD_DEVHDR_SIZE) { cckdumsg (dev, 703, "read error rc=%d offset 0x%" I64_FMT "x len %d: %s\n", rc, (long long)CCKD_DEVHDR_POS, CCKD_DEVHDR_SIZE, rc < 0 ? strerror(errno) : "incomplete"); close (dev->fd); continue; } if (cdevhdr.options & CCKD_OPENED) { cckdumsg (dev, 707, "OPENED bit is on, use -f\n"); close (dev->fd); continue; } } /* if (!force) */ rc = cckd_chkdsk (dev, level); close (dev->fd); } /* for each arg */ return 0; }
int main ( int argc, char *argv[]) { char *pgmname; /* prog name in host format */ char *pgm; /* less any extension (.ext) */ char msgbuf[512]; /* message build work area */ CKDDASD_DEVHDR devhdr; /* CKD device header */ CCKDDASD_DEVHDR cdevhdr; /* Compressed CKD device hdr */ int level = 0; /* Chkdsk level */ int force = 0; /* 1=swap if OPENED bit on */ int rc; /* Return code */ int i; /* Index */ int bigend; /* 1=big-endian file */ DEVBLK devblk; /* DEVBLK */ DEVBLK *dev=&devblk; /* -> DEVBLK */ char *strtok_str = NULL; /* Set program name */ if ( argc > 0 ) { if ( strlen(argv[0]) == 0 ) { pgmname = strdup( UTILITY_NAME ); } else { char path[MAX_PATH]; #if defined( _MSVC_ ) GetModuleFileName( NULL, path, MAX_PATH ); #else strncpy( path, argv[0], sizeof( path ) ); #endif pgmname = strdup(basename(path)); #if !defined( _MSVC_ ) strncpy( path, argv[0], sizeof(path) ); #endif } } else { pgmname = strdup( UTILITY_NAME ); } pgm = strtok_r( strdup(pgmname), ".", &strtok_str); INITIALIZE_UTILITY( pgmname ); /* Display the program identification message */ MSGBUF( msgbuf, MSG_C( HHC02499, "I", pgm, "Swap 'endianess' of a cckd file" ) ); display_version (stderr, msgbuf+10, FALSE); /* 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 (pgm); level = (argv[0][1] & 0xf); break; case 'f': if (argv[0][2] != '\0') return syntax (pgm); force = 1; break; case 'v': if (argv[0][2] != '\0') return syntax (pgm); return 0; default: return syntax (pgm); } } if (argc < 1) return syntax (pgm); for (i = 0; i < argc; i++) { memset (dev, 0, sizeof (DEVBLK)); dev->batch = 1; /* open the input file */ hostpath(dev->filename, argv[i], sizeof(dev->filename)); dev->fd = HOPEN (dev->filename, O_RDWR|O_BINARY); if (dev->fd < 0) { fprintf(stdout, MSG(HHC00354, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, dev->filename, "open()", strerror(errno))); continue; } /* read the CKD device header */ if ((rc = read (dev->fd, &devhdr, CKDDASD_DEVHDR_SIZE)) < CKDDASD_DEVHDR_SIZE) { fprintf(stdout, MSG(HHC00355, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, dev->filename, "read()", (U64)0, rc < 0 ? strerror(errno) : "incomplete")); close (dev->fd); continue; } if (memcmp(devhdr.devid, "CKD_C370", 8) != 0 && memcmp(devhdr.devid, "CKD_S370", 8) != 0 && memcmp(devhdr.devid, "FBA_C370", 8) != 0 && memcmp(devhdr.devid, "FBA_S370", 8) != 0) { fprintf(stdout, MSG(HHC00356, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, dev->filename)); close (dev->fd); continue; } /* read the compressed CKD device header */ if ((rc = read (dev->fd, &cdevhdr, CCKD_DEVHDR_SIZE)) < CCKD_DEVHDR_SIZE) { fprintf(stdout, MSG(HHC00355, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, dev->filename, "read()", (U64)CCKD_DEVHDR_POS, rc < 0 ? strerror(errno) : "incomplete")); close (dev->fd); continue; } /* Check the OPENED bit */ if (!force && (cdevhdr.options & CCKD_OPENED)) { fprintf(stdout, MSG(HHC00352, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, dev->filename)); close (dev->fd); continue; } /* get the byte order of the file */ bigend = (cdevhdr.options & CCKD_BIGENDIAN); /* call chkdsk */ if (cckd_chkdsk (dev, level) < 0) { fprintf(stdout, MSG(HHC00353, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, dev->filename)); close (dev->fd); continue; } /* re-read the compressed CKD device header */ if (lseek (dev->fd, CCKD_DEVHDR_POS, SEEK_SET) < 0) { fprintf(stdout, MSG(HHC00355, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, dev->filename, "lseek()", (U64)CCKD_DEVHDR_POS, strerror(errno))); close (dev->fd); continue; } if ((rc = read (dev->fd, &cdevhdr, CCKD_DEVHDR_SIZE)) < CCKD_DEVHDR_SIZE) { fprintf(stdout, MSG(HHC00355, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, dev->filename, "read()", (U64)CCKD_DEVHDR_POS, rc < 0 ? strerror(errno) : "incomplete")); close (dev->fd); continue; } /* swap the byte order of the file if chkdsk didn't do it for us */ if (bigend == (cdevhdr.options & CCKD_BIGENDIAN)) { fprintf(stdout, MSG(HHC00357, "I", SSID_TO_LCSS(dev->ssid), dev->devnum, dev->filename, cckd_endian() ? "big-endian" : "little-endian")); if (cckd_swapend (dev) < 0) fprintf(stdout, MSG(HHC00378, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, dev->filename)); } close (dev->fd); } /* for each arg */ return 0; } /* end main */