]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - lib/libdisk/write_disk.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / lib / libdisk / write_disk.c
1 /*
2  * ----------------------------------------------------------------------------
3  * "THE BEER-WARE LICENSE" (Revision 42):
4  * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
5  * can do whatever you want with this stuff. If we meet some day, and you think
6  * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
7  * ----------------------------------------------------------------------------
8  */
9
10 #include <sys/cdefs.h>
11 __FBSDID("$FreeBSD$");
12
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <unistd.h>
16 #include <fcntl.h>
17 #include <string.h>
18 #include <sys/types.h>
19 #include <sys/stat.h>
20 #include <sys/ioctl.h>
21 #include <sys/disklabel.h>
22 #include <paths.h>
23 #include "libdisk.h"
24
25 void
26 Fill_Disklabel(struct disklabel *dl, const struct disk *new,
27     const struct chunk *c1)
28 {
29         struct chunk *c2;
30         int j;
31
32         memset(dl, 0, sizeof *dl);
33
34         for (c2 = c1->part; c2; c2 = c2->next) {
35                 if (c2->type == unused)
36                         continue;
37                 if (!strcmp(c2->name, "X"))
38                         continue;
39                 j = c2->name[strlen(c2->name) - 1] - 'a';
40                 if (j < 0 || j >= MAXPARTITIONS || j == RAW_PART)
41                         continue;
42                 dl->d_partitions[j].p_size = c2->size;
43                 dl->d_partitions[j].p_offset = c2->offset;
44                 dl->d_partitions[j].p_fstype = c2->subtype;
45         }
46
47         dl->d_bbsize = BBSIZE;
48         /*
49          * Add in defaults for superblock size, interleave, and rpms
50          */
51         dl->d_sbsize = 0;
52
53         strcpy(dl->d_typename, c1->name);
54
55         dl->d_secsize = 512;
56         dl->d_secperunit = new->chunks->size;
57 #ifndef __ia64__
58         dl->d_ncylinders = new->bios_cyl;
59         dl->d_ntracks = new->bios_hd;
60         dl->d_nsectors = new->bios_sect;
61 #endif
62         dl->d_secpercyl = dl->d_ntracks * dl->d_nsectors;
63
64         dl->d_npartitions = MAXPARTITIONS;
65
66         dl->d_type = new->name[0] == 's' || new->name[0] == 'd' ||
67             new->name[0] == 'o' ? DTYPE_SCSI : DTYPE_ESDI;
68         dl->d_partitions[RAW_PART].p_size = c1->size;
69         dl->d_partitions[RAW_PART].p_offset = c1->offset;
70         dl->d_rpm = 3600;
71         dl->d_interleave = 1;
72
73         dl->d_magic = DISKMAGIC;
74         dl->d_magic2 = DISKMAGIC;
75         dl->d_checksum = dkcksum(dl);
76 }