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

Subversion Repositories eco32

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

Go to most recent revision | 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
  printf("bbsize          : 0x%08X\n", lp->d_bbsize);
323
  printf("sbsize          : 0x%08X\n", lp->d_sbsize);
324
  printf("npartitions     : 0x%04X\n", lp->d_npartitions);
325
  numParts = lp->d_npartitions;
326
  if (numParts < 0 || numParts > MAXPARTS) {
327
    printf("Warning: number of partitions out of range!\n");
328
    numParts = MAXPARTS;
329
  }
330
  for (i = 0; i < numParts; i++) {
331
    if (lp->d_parts[i].p_size == 0) {
332
      continue;
333
    }
334
    printf("  partition %c:\n", 'a' + i);
335
    printf("    size        : 0x%08X\n", lp->d_parts[i].p_size);
336
    printf("    offset      : 0x%08X\n", lp->d_parts[i].p_offset);
337
    printf("    fsize       : 0x%08X\n", lp->d_parts[i].p_fsize);
338
    printf("    fstype      : 0x%02X\n", lp->d_parts[i].p_fstype);
339
    printf("    frag        : 0x%02X\n", lp->d_parts[i].p_frag);
340
    printf("    cpg         : 0x%04X\n", lp->d_parts[i].p_cpg);
341
  }
342
}
343
 
344
 
345
/**************************************************************/
346
 
347
 
348
void initDiskLabel(DiskLabel *lp) {
349
  int i;
350
 
351
  lp->d_magic = 0;
352
  lp->d_type = 0;
353
  lp->d_subtype = 0;
354
  for (i = 0; i < NTYPENAME; i++) {
355
    lp->d_typename[i] = 0;
356
  }
357
  for (i = 0; i < NPACKNAME; i++) {
358
    lp->d_packname[i] = 0;
359
  }
360
  lp->d_secsize = 0;
361
  lp->d_nsectors = 0;
362
  lp->d_ntracks = 0;
363
  lp->d_ncylinders = 0;
364
  lp->d_secpercyl = 0;
365
  lp->d_secperunit = 0;
366
  lp->d_sparespertrack = 0;
367
  lp->d_sparespercyl = 0;
368
  lp->d_acylinders = 0;
369
  lp->d_rpm = 0;
370
  lp->d_interleave = 0;
371
  lp->d_trackskew = 0;
372
  lp->d_cylskew = 0;
373
  lp->d_headswitch = 0;
374
  lp->d_trkseek = 0;
375
  lp->d_flags = 0;
376
  for (i = 0; i < NDDATA; i++) {
377
    lp->d_drivedata[i] = 0;
378
  }
379
  for (i = 0; i < NSPARE; i++) {
380
    lp->d_spare[i] = 0;
381
  }
382
  lp->d_magic2 = 0;
383
  lp->d_checksum = 0;
384
  lp->d_npartitions = 0;
385
  lp->d_bbsize = 0;
386
  lp->d_sbsize = 0;
387
  for (i = 0; i < MAXPARTS; i++) {
388
    lp->d_parts[i].p_size = 0;
389
    lp->d_parts[i].p_offset = 0;
390
    lp->d_parts[i].p_fsize = 0;
391
    lp->d_parts[i].p_fstype = 0;
392
    lp->d_parts[i].p_frag = 0;
393
    lp->d_parts[i].p_cpg = 0;
394
  }
395
  for (i = 0; i < PADSIZE; i++) {
396
    lp->d_pad[i] = 0;
397
  }
398
}
399
 
400
 
401
void fillDiskLabelDefault1(DiskLabel *lp) {
402
  /* the default disklabel for a non-partitioned disk */
403
  lp->d_magic = DSKMAGIC;
404
  strcpy(lp->d_typename, "ECO32 SD-100M");
405
  lp->d_secsize = 512;
406
  lp->d_nsectors = 128;
407
  lp->d_ntracks = 16;
408
  lp->d_ncylinders = 100;
409
  lp->d_secpercyl = 2048;
410
  lp->d_secperunit = 204800;
411
  lp->d_sparespertrack = 0;
412
  lp->d_sparespercyl = 0;
413
  lp->d_acylinders = 0;
414
  lp->d_rpm = 3600;
415
  lp->d_interleave = 1;
416
  lp->d_trackskew = 0;
417
  lp->d_cylskew = 0;
418
  lp->d_headswitch = 0;
419
  lp->d_trkseek = 0;
420
  lp->d_flags = 0;
421
  lp->d_magic2 = DSKMAGIC;
422
  lp->d_checksum = 0;
423
  lp->d_npartitions = 16;
424
  lp->d_bbsize = 8192;
425
  lp->d_sbsize = 8192;
426
  /*-------------------------------*/
427
  lp->d_parts[0].p_size = 172032;
428
  lp->d_parts[0].p_offset = 0;
429
  lp->d_parts[0].p_fsize = 1024;
430
  lp->d_parts[0].p_fstype = 7;
431
  lp->d_parts[0].p_frag = 8;
432
  /*-------------------------------*/
433
  lp->d_parts[1].p_size = 32768;
434
  lp->d_parts[1].p_offset = 172032;
435
  lp->d_parts[1].p_fsize = 0;
436
  lp->d_parts[1].p_fstype = 1;
437
  lp->d_parts[1].p_frag = 0;
438
  /*-------------------------------*/
439
  lp->d_parts[2].p_size = 204800;
440
  lp->d_parts[2].p_offset = 0;
441
  lp->d_parts[2].p_fsize = 0;
442
  lp->d_parts[2].p_fstype = 0;
443
  lp->d_parts[2].p_frag = 0;
444
  /*-------------------------------*/
445
  lp->d_checksum = chksum(lp, lp->d_npartitions);
446
}
447
 
448
 
449
void fillDiskLabelDefault2(DiskLabel *lp) {
450
  /* the default disklabel for a partitioned disk */
451
  lp->d_magic = DSKMAGIC;
452
  strcpy(lp->d_typename, "ECO32 SD-100M");
453
  lp->d_secsize = 512;
454
  lp->d_nsectors = 128;
455
  lp->d_ntracks = 16;
456
  lp->d_ncylinders = 100;
457
  lp->d_secpercyl = 2048;
458
  lp->d_secperunit = 204800;
459
  lp->d_sparespertrack = 0;
460
  lp->d_sparespercyl = 0;
461
  lp->d_acylinders = 0;
462
  lp->d_rpm = 3600;
463
  lp->d_interleave = 1;
464
  lp->d_trackskew = 0;
465
  lp->d_cylskew = 0;
466
  lp->d_headswitch = 0;
467
  lp->d_trkseek = 0;
468
  lp->d_flags = 0;
469
  lp->d_magic2 = DSKMAGIC;
470
  lp->d_checksum = 0;
471
  lp->d_npartitions = 16;
472
  lp->d_bbsize = 8192;
473
  lp->d_sbsize = 8192;
474
  /*-------------------------------*/
475
  lp->d_parts[0].p_size = 106496;
476
  lp->d_parts[0].p_offset = 81920;
477
  lp->d_parts[0].p_fsize = 1024;
478
  lp->d_parts[0].p_fstype = 7;
479
  lp->d_parts[0].p_frag = 8;
480
  /*-------------------------------*/
481
  lp->d_parts[1].p_size = 16384;
482
  lp->d_parts[1].p_offset = 188416;
483
  lp->d_parts[1].p_fsize = 0;
484
  lp->d_parts[1].p_fstype = 1;
485
  lp->d_parts[1].p_frag = 0;
486
  /*-------------------------------*/
487
  lp->d_parts[2].p_size = 122880;
488
  lp->d_parts[2].p_offset = 81920;
489
  lp->d_parts[2].p_fsize = 0;
490
  lp->d_parts[2].p_fstype = 0;
491
  lp->d_parts[2].p_frag = 0;
492
  /*-------------------------------*/
493
  lp->d_parts[3].p_size = 204800;
494
  lp->d_parts[3].p_offset = 0;
495
  lp->d_parts[3].p_fsize = 0;
496
  lp->d_parts[3].p_fstype = 0;
497
  lp->d_parts[3].p_frag = 0;
498
  /*-------------------------------*/
499
  lp->d_checksum = chksum(lp, lp->d_npartitions);
500
}
501
 
502
 
503
void fillDiskLabelFromFile(DiskLabel *lp, char *fileName) {
504
  error("configuration file not supported yet");
505
}
506
 
507
 
508
/**************************************************************/
509
 
510
 
511
int checkEndian(DiskLabel *lp) {
512
  int endian;
513
  uint32_t magic;
514
  uint16_t numParts;
515
  uint16_t sum;
516
 
517
  magic = lp->d_magic;
518
  if (magic != lp->d_magic2) {
519
    printf("Warning: magic numbers differ!\n");
520
    return -1;
521
  }
522
  if (magic == DSKMAGIC) {
523
    /* little endian */
524
    endian = 1;
525
  } else {
526
    /* assume big endian */
527
    endian = 0;
528
    /* and check */
529
    conv4FromEcoToX86((unsigned char *) &magic);
530
    if (magic != DSKMAGIC) {
531
      /* neither little endian nor big endian */
532
      printf("Warning: wrong magic number!\n");
533
      return -2;
534
    }
535
  }
536
  numParts = lp->d_npartitions;
537
  if (endian == 0) {
538
    conv2FromEcoToX86((unsigned char *) &numParts);
539
  }
540
  sum = chksum(lp, (int) numParts);
541
  if (sum != 0) {
542
    printf("Warning: wrong checksum!\n");
543
    return -3;
544
  }
545
  return endian;
546
}
547
 
548
 
549
/**************************************************************/
550
 
551
 
552
void usage(char *myself) {
553
  printf("Usage:\n");
554
  printf("    %s -c  <disk> <partition or '*'>\n", myself);
555
  printf("    %s -t  <disk> <partition or '*'>\n", myself);
556
  printf("    %s -rb <disk> <partition or '*'>\n", myself);
557
  printf("    %s -rl <disk> <partition or '*'>\n", myself);
558
  printf("    %s -wb <disk> <partition or '*'> [<config file>]\n", myself);
559
  printf("    %s -wl <disk> <partition or '*'> [<config file>]\n", myself);
560
  printf("c: check, t: toggle endianness\n");
561
  printf("r: read, w: write disklabel\n");
562
  printf("b: big, l: little endian\n");
563
}
564
 
565
 
566
int main(int argc, char *argv[]) {
567
  int optionCheck;
568
  int optionToggle;
569
  int optionRead;
570
  int optionBig;
571
  char *diskName;
572
  int part;
573
  char *endptr;
574
  unsigned char partTable[SSIZE];
575
  unsigned char *ptptr;
576
  unsigned long partType;
577
  DiskLabel dl;
578
  int endian;
579
 
580
  if (argc != 4 && argc != 5) {
581
    usage(argv[0]);
582
    exit(1);
583
  }
584
  if (strcmp(argv[1], "-c") != 0 &&
585
      strcmp(argv[1], "-t") != 0 &&
586
      strcmp(argv[1], "-rb") != 0 &&
587
      strcmp(argv[1], "-rl") != 0 &&
588
      strcmp(argv[1], "-wb") != 0 &&
589
      strcmp(argv[1], "-wl") != 0) {
590
    usage(argv[0]);
591
    exit(1);
592
  }
593
  if (strcmp(argv[1], "-c") == 0) {
594
    optionCheck = 1;
595
    optionToggle = 0;
596
    optionRead = 0;
597
    optionBig = 0;
598
  } else
599
  if (strcmp(argv[1], "-t") == 0) {
600
    optionCheck = 1;
601
    optionToggle = 1;
602
    optionRead = 0;
603
    optionBig = 0;
604
  } else {
605
    optionCheck = 0;
606
    optionToggle = 0;
607
    optionRead = (argv[1][1] == 'r');
608
    optionBig = (argv[1][2] == 'b');
609
  }
610
  diskName = argv[2];
611
  diskFile = fopen(diskName, "r+b");
612
  if (diskFile == NULL) {
613
    error("cannot open disk image '%s'", diskName);
614
  }
615
  if (strcmp(argv[3], "*") == 0) {
616
    /* whole disk contains one single slice */
617
    sliceStart = 0;
618
    fseek(diskFile, 0, SEEK_END);
619
    sliceSize = ftell(diskFile) / SSIZE;
620
  } else {
621
    /* argv[3] is partition number of NetBSD slice */
622
    part = strtoul(argv[3], &endptr, 10);
623
    if (*endptr != '\0' || part < 0 || part > 15) {
624
      error("illegal partition number '%s'", argv[3]);
625
    }
626
    fseek(diskFile, 1 * SSIZE, SEEK_SET);
627
    if (fread(partTable, 1, SSIZE, diskFile) != SSIZE) {
628
      error("cannot read partition table of disk '%s'", diskName);
629
    }
630
    ptptr = partTable + part * 32;
631
    partType = read4FromEco(ptptr + 0);
632
    if ((partType & 0x7FFFFFFF) != 0x000000A9) {
633
      error("partition %d of disk '%s' is not a NetBSD slice",
634
            part, diskName);
635
    }
636
    sliceStart = read4FromEco(ptptr + 4);
637
    sliceSize = read4FromEco(ptptr + 8);
638
  }
639
  printf("Slice size is %lu (0x%lX) sectors of %d bytes each.\n",
640
         sliceSize, sliceSize, SSIZE);
641
  if (optionCheck) {
642
    /* check endianness */
643
    readSector(1, (unsigned char *) &dl);
644
    endian = checkEndian(&dl);
645
    if (endian < 0) {
646
      error("the endiannes of the disklabel could not be determined");
647
    }
648
    printf("The disklabel appears to be %s-endian.\n",
649
           endian == 0 ? "big" : "little");
650
    if (optionToggle) {
651
      /* toggle endianness */
652
      if (endian == 0) {
653
        /* big -> little */
654
        dlFromEcoToX86(&dl);
655
      } else {
656
        /* little -> big */
657
        dlFromX86ToEco(&dl);
658
      }
659
      endian = checkEndian(&dl);
660
      if (endian < 0) {
661
        error("this should never happen");
662
      }
663
      printf("The disklabel has been converted to %s-endian.\n",
664
             endian == 0 ? "big" : "little");
665
      writeSector(1, (unsigned char *) &dl);
666
    }
667
  } else
668
  if (optionRead) {
669
    /* read and show disklabel */
670
    readSector(1, (unsigned char *) &dl);
671
    if (optionBig) {
672
      dlFromEcoToX86(&dl);
673
    }
674
    showDiskLabel(&dl);
675
  } else {
676
    /* write disklabel */
677
    initDiskLabel(&dl);
678
    if (argc == 4) {
679
      fillDiskLabelDefault2(&dl);
680
    } else {
681
      fillDiskLabelFromFile(&dl, argv[4]);
682
    }
683
    if (optionBig) {
684
      dlFromX86ToEco(&dl);
685
    }
686
    writeSector(1, (unsigned char *) &dl);
687
  }
688
  fclose(diskFile);
689
  return 0;
690
}

powered by: WebSVN 2.1.0

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