00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef VTOC_H
00015 #define VTOC_H
00016
00017 #include <string.h>
00018 #include <stdlib.h>
00019 #include <stdio.h>
00020 #include <errno.h>
00021 #include <ctype.h>
00022 #include <time.h>
00023 #include <fcntl.h>
00024 #include <unistd.h>
00025
00026 #include <sys/stat.h>
00027 #include <sys/ioctl.h>
00028
00029 #define LINE_LENGTH 80
00030 #define VTOC_START_CC 0x0
00031 #define VTOC_START_HH 0x1
00032 #define FIRST_USABLE_CYL 1
00033 #define FIRST_USABLE_TRK 2
00034
00035 #define DASD_3380_TYPE 13148
00036 #define DASD_3390_TYPE 13200
00037 #define DASD_9345_TYPE 37701
00038
00039 #define DASD_3380_VALUE 0xbb60
00040 #define DASD_3390_VALUE 0xe5a2
00041 #define DASD_9345_VALUE 0xbc98
00042
00043 #define VOLSER_LENGTH 6
00044 #define BIG_DISK_SIZE 0x10000
00045
00046 #define VTOC_ERROR "VTOC error:"
00047
00048 typedef struct ttr ttr_t;
00049 typedef struct cchhb cchhb_t;
00050 typedef struct cchh cchh_t;
00051 typedef struct labeldate labeldate_t;
00052 typedef struct volume_label volume_label_t;
00053 typedef struct extent extent_t;
00054 typedef struct dev_const dev_const_t;
00055 typedef struct format1_label format1_label_t;
00056 typedef struct format4_label format4_label_t;
00057 typedef struct ds5ext ds5ext_t;
00058 typedef struct format5_label format5_label_t;
00059 typedef struct ds7ext ds7ext_t;
00060 typedef struct format7_label format7_label_t;
00061
00062 struct __attribute__ ((packed)) ttr {
00063 u_int16_t tt;
00064 u_int8_t r;
00065 };
00066
00067 struct __attribute__ ((packed)) cchhb {
00068 u_int16_t cc;
00069 u_int16_t hh;
00070 u_int8_t b;
00071 };
00072
00073 struct __attribute__ ((packed)) cchh {
00074 u_int16_t cc;
00075 u_int16_t hh;
00076 };
00077
00078 struct __attribute__ ((packed)) labeldate {
00079 u_int8_t year;
00080 u_int16_t day;
00081 };
00082
00083 struct __attribute__ ((packed)) volume_label {
00084 char volkey[4];
00085 char vollbl[4];
00086 char volid[6];
00087 u_int8_t security;
00088 cchhb_t vtoc;
00089 char res1[5];
00090 char cisize[4];
00091
00092 char blkperci[4];
00093 char labperci[4];
00094 char res2[4];
00095 char lvtoc[14];
00096 char res3[29];
00097 };
00098
00099 struct __attribute__ ((packed)) extent {
00100 u_int8_t typeind;
00101 u_int8_t seqno;
00102 cchh_t llimit;
00103 cchh_t ulimit;
00104 };
00105
00106 struct __attribute__ ((packed)) dev_const {
00107 u_int16_t DS4DSCYL;
00108 u_int16_t DS4DSTRK;
00109 u_int16_t DS4DEVTK;
00110 u_int8_t DS4DEVI;
00111 u_int8_t DS4DEVL;
00112 u_int8_t DS4DEVK;
00113 u_int8_t DS4DEVFG;
00114 u_int16_t DS4DEVTL;
00115 u_int8_t DS4DEVDT;
00116 u_int8_t DS4DEVDB;
00117 };
00118
00119 struct __attribute__ ((packed)) format1_label {
00120 char DS1DSNAM[44];
00121 u_int8_t DS1FMTID;
00122 char DS1DSSN[6];
00123 u_int16_t DS1VOLSQ;
00124 labeldate_t DS1CREDT;
00125 labeldate_t DS1EXPDT;
00126 u_int8_t DS1NOEPV;
00127 u_int8_t DS1NOBDB;
00128 u_int8_t DS1FLAG1;
00129 char DS1SYSCD[13];
00130 labeldate_t DS1REFD;
00131 u_int8_t DS1SMSFG;
00132 u_int8_t DS1SCXTF;
00133 u_int16_t DS1SCXTV;
00134 u_int8_t DS1DSRG1;
00135 u_int8_t DS1DSRG2;
00136 u_int8_t DS1RECFM;
00137 u_int8_t DS1OPTCD;
00138 u_int16_t DS1BLKL;
00139 u_int16_t DS1LRECL;
00140 u_int8_t DS1KEYL;
00141 u_int16_t DS1RKP;
00142 u_int8_t DS1DSIND;
00143 u_int8_t DS1SCAL1;
00144 char DS1SCAL3[3];
00145 ttr_t DS1LSTAR;
00146 u_int16_t DS1TRBAL;
00147 u_int16_t res1;
00148 extent_t DS1EXT1;
00149 extent_t DS1EXT2;
00150 extent_t DS1EXT3;
00151 cchhb_t DS1PTRDS;
00152 };
00153
00154 struct __attribute__ ((packed)) format4_label {
00155 char DS4KEYCD[44];
00156 u_int8_t DS4IDFMT;
00157 cchhb_t DS4HPCHR;
00158 u_int16_t DS4DSREC;
00159 cchh_t DS4HCCHH;
00160 u_int16_t DS4NOATK;
00161 u_int8_t DS4VTOCI;
00162 u_int8_t DS4NOEXT;
00163 u_int8_t DS4SMSFG;
00164 u_int8_t DS4DEVAC;
00165
00166
00167
00168
00169 dev_const_t DS4DEVCT;
00170 char DS4AMTIM[8];
00171 char DS4AMCAT[3];
00172 char DS4R2TIM[8];
00173 char res1[5];
00174 char DS4F6PTR[5];
00175 extent_t DS4VTOCE;
00176 char res2[10];
00177 u_int8_t DS4EFLVL;
00178 cchhb_t DS4EFPTR;
00179 char res3[9];
00180 };
00181
00182 struct __attribute__ ((packed)) ds5ext {
00183 u_int16_t t;
00184 u_int16_t fc;
00185 u_int8_t ft;
00186 };
00187
00188 struct __attribute__ ((packed)) format5_label {
00189 char DS5KEYID[4];
00190 ds5ext_t DS5AVEXT;
00191 ds5ext_t DS5EXTAV[7];
00192 u_int8_t DS5FMTID;
00193 ds5ext_t DS5MAVET[18];
00194 cchhb_t DS5PTRDS;
00195 };
00196
00197 struct __attribute__ ((packed)) ds7ext {
00198 u_int32_t a;
00199 u_int32_t b;
00200 };
00201
00202 struct __attribute__ ((packed)) format7_label {
00203 char DS7KEYID[4];
00204 ds7ext_t DS7EXTNT[5];
00205 u_int8_t DS7FMTID;
00206 ds7ext_t DS7ADEXT[11];
00207 char res1[2];
00208 cchhb_t DS7PTRDS;
00209 };
00210
00211 char * vtoc_ebcdic_enc (char source[LINE_LENGTH], char target[LINE_LENGTH],
00212 int l);
00213 char * vtoc_ebcdic_dec (char source[LINE_LENGTH], char target[LINE_LENGTH],
00214 int l);
00215 void vtoc_set_extent (extent_t * ext, u_int8_t typeind, u_int8_t seqno,
00216 cchh_t * lower, cchh_t * upper);
00217 void vtoc_set_cchh (cchh_t * addr, u_int16_t cc, u_int16_t hh);
00218 void vtoc_set_cchhb (cchhb_t * addr, u_int16_t cc, u_int16_t hh, u_int8_t b);
00219 void vtoc_set_date (labeldate_t * d, u_int8_t year, u_int16_t day);
00220
00221 void vtoc_volume_label_init (volume_label_t *vlabel);
00222
00223 int vtoc_read_volume_label (int fd, unsigned long vlabel_start,
00224 volume_label_t * vlabel);
00225
00226 int vtoc_write_volume_label (int fd, unsigned long vlabel_start,
00227 volume_label_t *vlabel);
00228
00229 void vtoc_volume_label_set_volser (volume_label_t *vlabel, char *volser);
00230
00231 char *vtoc_volume_label_get_volser (volume_label_t *vlabel, char *volser);
00232
00233 void vtoc_volume_label_set_key (volume_label_t *vlabel, char *key);
00234
00235 void vtoc_volume_label_set_label (volume_label_t *vlabel, char *lbl);
00236
00237 char *vtoc_volume_label_get_label (volume_label_t *vlabel, char *lbl);
00238
00239 void vtoc_read_label (int fd, unsigned long position, format1_label_t *f1,
00240 format4_label_t *f4, format5_label_t *f5,
00241 format7_label_t *f7);
00242
00243 void vtoc_write_label (int fd, unsigned long position, format1_label_t *f1,
00244 format4_label_t *f4, format5_label_t *f5,
00245 format7_label_t *f7);
00246
00247 void vtoc_init_format1_label (char *volid, unsigned int blksize,
00248 extent_t *part_extent, format1_label_t *f1);
00249
00250 void vtoc_init_format4_label (format4_label_t *f4lbl,
00251 unsigned int usable_partitions,
00252 unsigned int cylinders,
00253 unsigned int tracks,
00254 unsigned int blocks,
00255 unsigned int blksize,
00256 u_int16_t dev_type);
00257
00258 void vtoc_update_format4_label (format4_label_t *f4, cchhb_t *highest_f1,
00259 u_int16_t unused_update);
00260
00261 void vtoc_init_format5_label (format5_label_t *f5);
00262
00263 void vtoc_update_format5_label_add (format5_label_t *f5, int verbose, int cyl,
00264 int trk, u_int16_t a, u_int16_t b,
00265 u_int8_t c);
00266
00267 void vtoc_update_format5_label_del (format5_label_t *f5, int verbose, int cyl,
00268 int trk, u_int16_t a, u_int16_t b,
00269 u_int8_t c);
00270
00271 void vtoc_init_format7_label (format7_label_t *f7);
00272
00273 void vtoc_update_format7_label_add (format7_label_t *f7, int verbose,
00274 u_int32_t a, u_int32_t b);
00275
00276 void vtoc_update_format7_label_del (format7_label_t *f7, int verbose,
00277 u_int32_t a, u_int32_t b);
00278
00279 void vtoc_set_freespace(format4_label_t *f4, format5_label_t *f5,
00280 format7_label_t *f7, char ch, int verbose,
00281 u_int32_t start, u_int32_t stop, int cyl, int trk);
00282
00283 #endif