OpenCores
URL https://opencores.org/ocsvn/eco32/eco32/trunk

Subversion Repositories eco32

[/] [eco32/] [tags/] [eco32-0.24/] [disk/] [tools/] [fs-NetBSD/] [dsklbl/] [dsklbl.c] - Blame information for rev 211

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 17 hellwig
/*
2
 * dsklbl.c -- show or write a disklabel onto a NetBSD partition
3
 */
4
 
5
 
6
#include <stdio.h>
7
#include <stdlib.h>
8
#include <string.h>
9
#include <stdarg.h>
10
 
11
#include "types.h"
12
#include "disklabel.h"
13
 
14
 
15
/**************************************************************/
16
 
17
 
18
#define SSIZE           512     /* disk sector size in bytes */
19
#define BSIZE           8192    /* disk block size in bytes */
20
 
21
 
22
/**************************************************************/
23
 
24
 
25
void error(char *fmt, ...) {
26
  va_list ap;
27
 
28
  va_start(ap, fmt);
29
  printf("Error: ");
30
  vprintf(fmt, ap);
31
  printf("\n");
32
  va_end(ap);
33
  exit(1);
34
}
35
 
36
 
37
/**************************************************************/
38
 
39
 
40
unsigned int read4FromEco(unsigned char *p) {
41
  return (unsigned int) p[0] << 24 |
42
         (unsigned int) p[1] << 16 |
43
         (unsigned int) p[2] <<  8 |
44
         (unsigned int) p[3] <<  0;
45
}
46
 
47
 
48
void write4ToEco(unsigned char *p, unsigned int data) {
49
  p[0] = data >> 24;
50
  p[1] = data >> 16;
51
  p[2] = data >>  8;
52
  p[3] = data >>  0;
53
}
54
 
55
 
56
unsigned short read2FromEco(unsigned char *p) {
57
  return (unsigned short) p[0] << 8 |
58
         (unsigned short) p[1] << 0;
59
}
60
 
61
 
62
void write2ToEco(unsigned char *p, unsigned short data) {
63
  p[0] = data >> 8;
64
  p[1] = data >> 0;
65
}
66
 
67
 
68
void conv4FromEcoToX86(unsigned char *p) {
69
  unsigned int data;
70
 
71
  data = read4FromEco(p);
72
  * (unsigned int *) p = data;
73
}
74
 
75
 
76
void conv4FromX86ToEco(unsigned char *p) {
77
  unsigned int data;
78
 
79
  data = * (unsigned int *) p;
80
  write4ToEco(p, data);
81
}
82
 
83
 
84
void conv2FromEcoToX86(unsigned char *p) {
85
  unsigned short data;
86
 
87
  data = read2FromEco(p);
88
  * (unsigned short *) p = data;
89
}
90
 
91
 
92
void conv2FromX86ToEco(unsigned char *p) {
93
  unsigned short data;
94
 
95
  data = * (unsigned short *) p;
96
  write2ToEco(p, data);
97
}
98
 
99
 
100
/**************************************************************/
101
 
102
 
103
uint16_t chksum(DiskLabel *lp, int numParts) {
104
  uint16_t *start;
105
  uint16_t *end;
106
  uint16_t sum;
107
 
108
  start = (uint16_t *) lp;
109
  end = (uint16_t *) &lp->d_parts[numParts];
110
  sum = 0;
111
  while (start < end) {
112
    sum ^= *start++;
113
  }
114
  return sum;
115
}
116
 
117
 
118
/**************************************************************/
119
 
120
 
121
void dlFromEcoToX86(DiskLabel *lp) {
122
  int i;
123
  int numParts;
124
 
125
  conv4FromEcoToX86((unsigned char *) &lp->d_magic);
126
  conv2FromEcoToX86((unsigned char *) &lp->d_type);
127
  conv2FromEcoToX86((unsigned char *) &lp->d_subtype);
128
  conv4FromEcoToX86((unsigned char *) &lp->d_secsize);
129
  conv4FromEcoToX86((unsigned char *) &lp->d_nsectors);
130
  conv4FromEcoToX86((unsigned char *) &lp->d_ntracks);
131
  conv4FromEcoToX86((unsigned char *) &lp->d_ncylinders);
132
  conv4FromEcoToX86((unsigned char *) &lp->d_secpercyl);
133
  conv4FromEcoToX86((unsigned char *) &lp->d_secperunit);
134
  conv2FromEcoToX86((unsigned char *) &lp->d_sparespertrack);
135
  conv2FromEcoToX86((unsigned char *) &lp->d_sparespercyl);
136
  conv4FromEcoToX86((unsigned char *) &lp->d_acylinders);
137
  conv2FromEcoToX86((unsigned char *) &lp->d_rpm);
138
  conv2FromEcoToX86((unsigned char *) &lp->d_interleave);
139
  conv2FromEcoToX86((unsigned char *) &lp->d_trackskew);
140
  conv2FromEcoToX86((unsigned char *) &lp->d_cylskew);
141
  conv4FromEcoToX86((unsigned char *) &lp->d_headswitch);
142
  conv4FromEcoToX86((unsigned char *) &lp->d_trkseek);
143
  conv4FromEcoToX86((unsigned char *) &lp->d_flags);
144
  for (i = 0; i < NDDATA; i++) {
145
    conv4FromEcoToX86((unsigned char *) &lp->d_drivedata[i]);
146
  }
147
  for (i = 0; i < NSPARE; i++) {
148
    conv4FromEcoToX86((unsigned char *) &lp->d_spare[i]);
149
  }
150
  conv4FromEcoToX86((unsigned char *) &lp->d_magic2);
151
  conv2FromEcoToX86((unsigned char *) &lp->d_checksum);
152
  conv2FromEcoToX86((unsigned char *) &lp->d_npartitions);
153
  numParts = lp->d_npartitions;
154
  if (numParts < 0 || numParts > MAXPARTS) {
155
    printf("Warning: number of partitions out of range!\n");
156
    numParts = MAXPARTS;
157
  }
158
  conv4FromEcoToX86((unsigned char *) &lp->d_bbsize);
159
  conv4FromEcoToX86((unsigned char *) &lp->d_sbsize);
160
  for (i = 0; i < MAXPARTS; i++) {
161
    conv4FromEcoToX86((unsigned char *) &lp->d_parts[i].p_size);
162
    conv4FromEcoToX86((unsigned char *) &lp->d_parts[i].p_offset);
163
    conv4FromEcoToX86((unsigned char *) &lp->d_parts[i].p_fsize);
164
    conv2FromEcoToX86((unsigned char *) &lp->d_parts[i].p_cpg);
165
  }
166
  /* after byte-swapping, the checksum must be calculated again */
167
  lp->d_checksum = 0;
168
  lp->d_checksum = chksum(lp, numParts);
169
  /* Attention: the new checksum must not be converted! */
170
}
171
 
172
 
173
void dlFromX86ToEco(DiskLabel *lp) {
174
  int i;
175
  int numParts;
176
 
177
  conv4FromX86ToEco((unsigned char *) &lp->d_magic);
178
  conv2FromX86ToEco((unsigned char *) &lp->d_type);
179
  conv2FromX86ToEco((unsigned char *) &lp->d_subtype);
180
  conv4FromX86ToEco((unsigned char *) &lp->d_secsize);
181
  conv4FromX86ToEco((unsigned char *) &lp->d_nsectors);
182
  conv4FromX86ToEco((unsigned char *) &lp->d_ntracks);
183
  conv4FromX86ToEco((unsigned char *) &lp->d_ncylinders);
184
  conv4FromX86ToEco((unsigned char *) &lp->d_secpercyl);
185
  conv4FromX86ToEco((unsigned char *) &lp->d_secperunit);
186
  conv2FromX86ToEco((unsigned char *) &lp->d_sparespertrack);
187
  conv2FromX86ToEco((unsigned char *) &lp->d_sparespercyl);
188
  conv4FromX86ToEco((unsigned char *) &lp->d_acylinders);
189
  conv2FromX86ToEco((unsigned char *) &lp->d_rpm);
190
  conv2FromX86ToEco((unsigned char *) &lp->d_interleave);
191
  conv2FromX86ToEco((unsigned char *) &lp->d_trackskew);
192
  conv2FromX86ToEco((unsigned char *) &lp->d_cylskew);
193
  conv4FromX86ToEco((unsigned char *) &lp->d_headswitch);
194
  conv4FromX86ToEco((unsigned char *) &lp->d_trkseek);
195
  conv4FromX86ToEco((unsigned char *) &lp->d_flags);
196
  for (i = 0; i < NDDATA; i++) {
197
    conv4FromX86ToEco((unsigned char *) &lp->d_drivedata[i]);
198
  }
199
  for (i = 0; i < NSPARE; i++) {
200
    conv4FromX86ToEco((unsigned char *) &lp->d_spare[i]);
201
  }
202
  conv4FromX86ToEco((unsigned char *) &lp->d_magic2);
203
  conv2FromX86ToEco((unsigned char *) &lp->d_checksum);
204
  numParts = lp->d_npartitions;
205
  if (numParts < 0 || numParts > MAXPARTS) {
206
    printf("Warning: number of partitions out of range!\n");
207
    numParts = MAXPARTS;
208
  }
209
  conv2FromX86ToEco((unsigned char *) &lp->d_npartitions);
210
  conv4FromX86ToEco((unsigned char *) &lp->d_bbsize);
211
  conv4FromX86ToEco((unsigned char *) &lp->d_sbsize);
212
  for (i = 0; i < MAXPARTS; i++) {
213
    conv4FromX86ToEco((unsigned char *) &lp->d_parts[i].p_size);
214
    conv4FromX86ToEco((unsigned char *) &lp->d_parts[i].p_offset);
215
    conv4FromX86ToEco((unsigned char *) &lp->d_parts[i].p_fsize);
216
    conv2FromX86ToEco((unsigned char *) &lp->d_parts[i].p_cpg);
217
  }
218
  /* after byte-swapping, the checksum must be calculated again */
219
  lp->d_checksum = 0;
220
  lp->d_checksum = chksum(lp, numParts);
221
  /* Attention: the new checksum must not be converted! */
222
}
223
 
224
 
225
/**************************************************************/
226
 
227
 
228
FILE *diskFile;
229
unsigned long sliceStart;
230
unsigned long sliceSize;
231
 
232
 
233
void readSector(unsigned int sno, unsigned char *buf) {
234
  int n;
235
 
236
  if (sno >= sliceSize) {
237
    error("illegal sector number %u in readSector()", sno);
238
  }
239
  fseek(diskFile, (sliceStart + sno) * SSIZE, SEEK_SET);
240
  n = fread(buf, 1, SSIZE, diskFile);
241
  if (n != SSIZE) {
242
    error("read error on sector %u", sno);
243
  }
244
}
245
 
246
 
247
void writeSector(unsigned int sno, unsigned char *buf) {
248
  int n;
249
 
250
  if (sno >= sliceSize) {
251
    error("illegal sector number %u in writeSector()", sno);
252
  }
253
  fseek(diskFile, (sliceStart + sno) * SSIZE, SEEK_SET);
254
  n = fwrite(buf, 1, SSIZE, diskFile);
255
  if (n != SSIZE) {
256
    error("write error on sector %u", sno);
257
  }
258
}
259
 
260
 
261
/**************************************************************/
262
 
263
 
264
void showDiskLabel(DiskLabel *lp) {
265
  int i;
266
  int c;
267
  int numParts;
268
 
269
  printf("magic number    : 0x%08X\n", lp->d_magic);
270
  if (lp->d_magic != DSKMAGIC) {
271
    printf("Warning: wrong magic number!\n");
272
  }
273
  printf("type            : 0x%04X\n", lp->d_type);
274
  printf("subtype         : 0x%04X\n", lp->d_subtype);
275
  printf("typename        : '");
276
  for (i = 0; i < NTYPENAME; i++) {
277
    c = lp->d_typename[i];
278
    if (c == 0) {
279
      break;
280
    }
281
    if (c >= 0x20 && c < 0x7F) {
282
      printf("%c", c);
283
    } else {
284
      printf(".");
285
    }
286
  }
287
  printf("'\n");
288
  printf("packname        : '");
289
  for (i = 0; i < NPACKNAME; i++) {
290
    c = lp->d_packname[i];
291
    if (c == 0) {
292
      break;
293
    }
294
    if (c >= 0x20 && c < 0x7F) {
295
      printf("%c", c);
296
    } else {
297
      printf(".");
298
    }
299
  }
300
  printf("'\n");
301
  printf("secsize         : 0x%08X\n", lp->d_secsize);
302
  printf("nsectors        : 0x%08X\n", lp->d_nsectors);
303
  printf("ntracks         : 0x%08X\n", lp->d_ntracks);
304
  printf("ncylinders      : 0x%08X\n", lp->d_ncylinders);
305
  printf("secpercyl       : 0x%08X\n", lp->d_secpercyl);
306
  printf("secperunit      : 0x%08X\n", lp->d_secperunit);
307
  printf("sparespertrack  : 0x%04X\n", lp->d_sparespertrack);
308
  printf("sparespercyl    : 0x%04X\n", lp->d_sparespercyl);
309
  printf("acylinders      : 0x%08X\n", lp->d_acylinders);
310
  printf("rpm             : 0x%04X\n", lp->d_rpm);
311
  printf("interleave      : 0x%04X\n", lp->d_interleave);
312
  printf("trackskew       : 0x%04X\n", lp->d_trackskew);
313
  printf("cylskew         : 0x%04X\n", lp->d_cylskew);
314
  printf("headswitch      : 0x%08X\n", lp->d_headswitch);
315
  printf("trkseek         : 0x%08X\n", lp->d_trkseek);
316
  printf("flags           : 0x%08X\n", lp->d_flags);
317
  printf("magic2          : 0x%08X\n", lp->d_magic2);
318
  if (lp->d_magic2 != DSKMAGIC) {
319
    printf("Warning: wrong magic number!\n");
320
  }
321
  printf("checksum        : 0x%04X\n", lp->d_checksum);
322 160 hellwig
  printf("NOTE: The checksum may have been re-computed because of\n");
323
  printf("endianness conversion, and thus may differ from the disk!\n");
324 17 hellwig
  printf("bbsize          : 0x%08X\n", lp->d_bbsize);
325
  printf("sbsize          : 0x%08X\n", lp->d_sbsize);
326
  printf("npartitions     : 0x%04X\n", lp->d_npartitions);
327
  numParts = lp->d_npartitions;
328
  if (numParts < 0 || numParts > MAXPARTS) {
329
    printf("Warning: number of partitions out of range!\n");
330
    numParts = MAXPARTS;
331
  }
332
  for (i = 0; i < numParts; i++) {
333
    if (lp->d_parts[i].p_size == 0) {
334
      continue;
335
    }
336
    printf("  partition %c:\n", 'a' + i);
337
    printf("    size        : 0x%08X\n", lp->d_parts[i].p_size);
338
    printf("    offset      : 0x%08X\n", lp->d_parts[i].p_offset);
339
    printf("    fsize       : 0x%08X\n", lp->d_parts[i].p_fsize);
340
    printf("    fstype      : 0x%02X\n", lp->d_parts[i].p_fstype);
341
    printf("    frag        : 0x%02X\n", lp->d_parts[i].p_frag);
342
    printf("    cpg         : 0x%04X\n", lp->d_parts[i].p_cpg);
343
  }
344
}
345
 
346
 
347
/**************************************************************/
348
 
349
 
350
void initDiskLabel(DiskLabel *lp) {
351
  int i;
352
 
353
  lp->d_magic = 0;
354
  lp->d_type = 0;
355
  lp->d_subtype = 0;
356
  for (i = 0; i < NTYPENAME; i++) {
357
    lp->d_typename[i] = 0;
358
  }
359
  for (i = 0; i < NPACKNAME; i++) {
360
    lp->d_packname[i] = 0;
361
  }
362
  lp->d_secsize = 0;
363
  lp->d_nsectors = 0;
364
  lp->d_ntracks = 0;
365
  lp->d_ncylinders = 0;
366
  lp->d_secpercyl = 0;
367
  lp->d_secperunit = 0;
368
  lp->d_sparespertrack = 0;
369
  lp->d_sparespercyl = 0;
370
  lp->d_acylinders = 0;
371
  lp->d_rpm = 0;
372
  lp->d_interleave = 0;
373
  lp->d_trackskew = 0;
374
  lp->d_cylskew = 0;
375
  lp->d_headswitch = 0;
376
  lp->d_trkseek = 0;
377
  lp->d_flags = 0;
378
  for (i = 0; i < NDDATA; i++) {
379
    lp->d_drivedata[i] = 0;
380
  }
381
  for (i = 0; i < NSPARE; i++) {
382
    lp->d_spare[i] = 0;
383
  }
384
  lp->d_magic2 = 0;
385
  lp->d_checksum = 0;
386
  lp->d_npartitions = 0;
387
  lp->d_bbsize = 0;
388
  lp->d_sbsize = 0;
389
  for (i = 0; i < MAXPARTS; i++) {
390
    lp->d_parts[i].p_size = 0;
391
    lp->d_parts[i].p_offset = 0;
392
    lp->d_parts[i].p_fsize = 0;
393
    lp->d_parts[i].p_fstype = 0;
394
    lp->d_parts[i].p_frag = 0;
395
    lp->d_parts[i].p_cpg = 0;
396
  }
397
  for (i = 0; i < PADSIZE; i++) {
398
    lp->d_pad[i] = 0;
399
  }
400
}
401
 
402
 
403
void fillDiskLabelDefault1(DiskLabel *lp) {
404
  /* the default disklabel for a non-partitioned disk */
405
  lp->d_magic = DSKMAGIC;
406
  strcpy(lp->d_typename, "ECO32 SD-100M");
407
  lp->d_secsize = 512;
408
  lp->d_nsectors = 128;
409
  lp->d_ntracks = 16;
410
  lp->d_ncylinders = 100;
411
  lp->d_secpercyl = 2048;
412
  lp->d_secperunit = 204800;
413
  lp->d_sparespertrack = 0;
414
  lp->d_sparespercyl = 0;
415
  lp->d_acylinders = 0;
416
  lp->d_rpm = 3600;
417
  lp->d_interleave = 1;
418
  lp->d_trackskew = 0;
419
  lp->d_cylskew = 0;
420
  lp->d_headswitch = 0;
421
  lp->d_trkseek = 0;
422
  lp->d_flags = 0;
423
  lp->d_magic2 = DSKMAGIC;
424
  lp->d_checksum = 0;
425
  lp->d_npartitions = 16;
426
  lp->d_bbsize = 8192;
427
  lp->d_sbsize = 8192;
428
  /*-------------------------------*/
429
  lp->d_parts[0].p_size = 172032;
430
  lp->d_parts[0].p_offset = 0;
431
  lp->d_parts[0].p_fsize = 1024;
432
  lp->d_parts[0].p_fstype = 7;
433
  lp->d_parts[0].p_frag = 8;
434
  /*-------------------------------*/
435
  lp->d_parts[1].p_size = 32768;
436
  lp->d_parts[1].p_offset = 172032;
437
  lp->d_parts[1].p_fsize = 0;
438
  lp->d_parts[1].p_fstype = 1;
439
  lp->d_parts[1].p_frag = 0;
440
  /*-------------------------------*/
441
  lp->d_parts[2].p_size = 204800;
442
  lp->d_parts[2].p_offset = 0;
443
  lp->d_parts[2].p_fsize = 0;
444
  lp->d_parts[2].p_fstype = 0;
445
  lp->d_parts[2].p_frag = 0;
446
  /*-------------------------------*/
447
  lp->d_checksum = chksum(lp, lp->d_npartitions);
448
}
449
 
450
 
451
void fillDiskLabelDefault2(DiskLabel *lp) {
452
  /* the default disklabel for a partitioned disk */
453
  lp->d_magic = DSKMAGIC;
454
  strcpy(lp->d_typename, "ECO32 SD-100M");
455
  lp->d_secsize = 512;
456
  lp->d_nsectors = 128;
457
  lp->d_ntracks = 16;
458
  lp->d_ncylinders = 100;
459
  lp->d_secpercyl = 2048;
460
  lp->d_secperunit = 204800;
461
  lp->d_sparespertrack = 0;
462
  lp->d_sparespercyl = 0;
463
  lp->d_acylinders = 0;
464
  lp->d_rpm = 3600;
465
  lp->d_interleave = 1;
466
  lp->d_trackskew = 0;
467
  lp->d_cylskew = 0;
468
  lp->d_headswitch = 0;
469
  lp->d_trkseek = 0;
470
  lp->d_flags = 0;
471
  lp->d_magic2 = DSKMAGIC;
472
  lp->d_checksum = 0;
473
  lp->d_npartitions = 16;
474
  lp->d_bbsize = 8192;
475
  lp->d_sbsize = 8192;
476
  /*-------------------------------*/
477
  lp->d_parts[0].p_size = 106496;
478
  lp->d_parts[0].p_offset = 81920;
479
  lp->d_parts[0].p_fsize = 1024;
480
  lp->d_parts[0].p_fstype = 7;
481
  lp->d_parts[0].p_frag = 8;
482
  /*-------------------------------*/
483
  lp->d_parts[1].p_size = 16384;
484
  lp->d_parts[1].p_offset = 188416;
485
  lp->d_parts[1].p_fsize = 0;
486
  lp->d_parts[1].p_fstype = 1;
487
  lp->d_parts[1].p_frag = 0;
488
  /*-------------------------------*/
489
  lp->d_parts[2].p_size = 122880;
490
  lp->d_parts[2].p_offset = 81920;
491
  lp->d_parts[2].p_fsize = 0;
492
  lp->d_parts[2].p_fstype = 0;
493
  lp->d_parts[2].p_frag = 0;
494
  /*-------------------------------*/
495
  lp->d_parts[3].p_size = 204800;
496
  lp->d_parts[3].p_offset = 0;
497
  lp->d_parts[3].p_fsize = 0;
498
  lp->d_parts[3].p_fstype = 0;
499
  lp->d_parts[3].p_frag = 0;
500
  /*-------------------------------*/
501
  lp->d_checksum = chksum(lp, lp->d_npartitions);
502
}
503
 
504
 
505
void fillDiskLabelFromFile(DiskLabel *lp, char *fileName) {
506
  error("configuration file not supported yet");
507
}
508
 
509
 
510
/**************************************************************/
511
 
512
 
513
int checkEndian(DiskLabel *lp) {
514
  int endian;
515
  uint32_t magic;
516
  uint16_t numParts;
517
  uint16_t sum;
518
 
519
  magic = lp->d_magic;
520
  if (magic != lp->d_magic2) {
521
    printf("Warning: magic numbers differ!\n");
522
    return -1;
523
  }
524
  if (magic == DSKMAGIC) {
525
    /* little endian */
526
    endian = 1;
527
  } else {
528
    /* assume big endian */
529
    endian = 0;
530
    /* and check */
531
    conv4FromEcoToX86((unsigned char *) &magic);
532
    if (magic != DSKMAGIC) {
533
      /* neither little endian nor big endian */
534
      printf("Warning: wrong magic number!\n");
535
      return -2;
536
    }
537
  }
538
  numParts = lp->d_npartitions;
539
  if (endian == 0) {
540
    conv2FromEcoToX86((unsigned char *) &numParts);
541
  }
542
  sum = chksum(lp, (int) numParts);
543
  if (sum != 0) {
544
    printf("Warning: wrong checksum!\n");
545
    return -3;
546
  }
547
  return endian;
548
}
549
 
550
 
551
/**************************************************************/
552
 
553
 
554
void usage(char *myself) {
555
  printf("Usage:\n");
556
  printf("    %s -c  <disk> <partition or '*'>\n", myself);
557
  printf("    %s -t  <disk> <partition or '*'>\n", myself);
558
  printf("    %s -rb <disk> <partition or '*'>\n", myself);
559
  printf("    %s -rl <disk> <partition or '*'>\n", myself);
560
  printf("    %s -wb <disk> <partition or '*'> [<config file>]\n", myself);
561
  printf("    %s -wl <disk> <partition or '*'> [<config file>]\n", myself);
562
  printf("c: check, t: toggle endianness\n");
563
  printf("r: read, w: write disklabel\n");
564
  printf("b: big, l: little endian\n");
565
}
566
 
567
 
568
int main(int argc, char *argv[]) {
569
  int optionCheck;
570
  int optionToggle;
571
  int optionRead;
572
  int optionBig;
573
  char *diskName;
574
  int part;
575
  char *endptr;
576
  unsigned char partTable[SSIZE];
577
  unsigned char *ptptr;
578
  unsigned long partType;
579
  DiskLabel dl;
580
  int endian;
581
 
582
  if (argc != 4 && argc != 5) {
583
    usage(argv[0]);
584
    exit(1);
585
  }
586
  if (strcmp(argv[1], "-c") != 0 &&
587
      strcmp(argv[1], "-t") != 0 &&
588
      strcmp(argv[1], "-rb") != 0 &&
589
      strcmp(argv[1], "-rl") != 0 &&
590
      strcmp(argv[1], "-wb") != 0 &&
591
      strcmp(argv[1], "-wl") != 0) {
592
    usage(argv[0]);
593
    exit(1);
594
  }
595
  if (strcmp(argv[1], "-c") == 0) {
596
    optionCheck = 1;
597
    optionToggle = 0;
598
    optionRead = 0;
599
    optionBig = 0;
600
  } else
601
  if (strcmp(argv[1], "-t") == 0) {
602
    optionCheck = 1;
603
    optionToggle = 1;
604
    optionRead = 0;
605
    optionBig = 0;
606
  } else {
607
    optionCheck = 0;
608
    optionToggle = 0;
609
    optionRead = (argv[1][1] == 'r');
610
    optionBig = (argv[1][2] == 'b');
611
  }
612
  diskName = argv[2];
613
  diskFile = fopen(diskName, "r+b");
614
  if (diskFile == NULL) {
615
    error("cannot open disk image '%s'", diskName);
616
  }
617
  if (strcmp(argv[3], "*") == 0) {
618
    /* whole disk contains one single slice */
619
    sliceStart = 0;
620
    fseek(diskFile, 0, SEEK_END);
621
    sliceSize = ftell(diskFile) / SSIZE;
622
  } else {
623
    /* argv[3] is partition number of NetBSD slice */
624
    part = strtoul(argv[3], &endptr, 10);
625
    if (*endptr != '\0' || part < 0 || part > 15) {
626
      error("illegal partition number '%s'", argv[3]);
627
    }
628
    fseek(diskFile, 1 * SSIZE, SEEK_SET);
629
    if (fread(partTable, 1, SSIZE, diskFile) != SSIZE) {
630
      error("cannot read partition table of disk '%s'", diskName);
631
    }
632
    ptptr = partTable + part * 32;
633
    partType = read4FromEco(ptptr + 0);
634
    if ((partType & 0x7FFFFFFF) != 0x000000A9) {
635
      error("partition %d of disk '%s' is not a NetBSD slice",
636
            part, diskName);
637
    }
638
    sliceStart = read4FromEco(ptptr + 4);
639
    sliceSize = read4FromEco(ptptr + 8);
640
  }
641
  printf("Slice size is %lu (0x%lX) sectors of %d bytes each.\n",
642
         sliceSize, sliceSize, SSIZE);
643
  if (optionCheck) {
644
    /* check endianness */
645
    readSector(1, (unsigned char *) &dl);
646
    endian = checkEndian(&dl);
647
    if (endian < 0) {
648
      error("the endiannes of the disklabel could not be determined");
649
    }
650
    printf("The disklabel appears to be %s-endian.\n",
651
           endian == 0 ? "big" : "little");
652
    if (optionToggle) {
653
      /* toggle endianness */
654
      if (endian == 0) {
655
        /* big -> little */
656
        dlFromEcoToX86(&dl);
657
      } else {
658
        /* little -> big */
659
        dlFromX86ToEco(&dl);
660
      }
661
      endian = checkEndian(&dl);
662
      if (endian < 0) {
663
        error("this should never happen");
664
      }
665
      printf("The disklabel has been converted to %s-endian.\n",
666
             endian == 0 ? "big" : "little");
667
      writeSector(1, (unsigned char *) &dl);
668
    }
669
  } else
670
  if (optionRead) {
671
    /* read and show disklabel */
672
    readSector(1, (unsigned char *) &dl);
673
    if (optionBig) {
674
      dlFromEcoToX86(&dl);
675
    }
676
    showDiskLabel(&dl);
677
  } else {
678
    /* write disklabel */
679
    initDiskLabel(&dl);
680
    if (argc == 4) {
681
      fillDiskLabelDefault2(&dl);
682
    } else {
683
      fillDiskLabelFromFile(&dl, argv[4]);
684
    }
685
    if (optionBig) {
686
      dlFromX86ToEco(&dl);
687
    }
688
    writeSector(1, (unsigned char *) &dl);
689
  }
690
  fclose(diskFile);
691
  return 0;
692
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.