Add the DragonFly cvs id and perform general cleanups on cvs/rcs/sccs ids. Most
[dragonfly.git] / lib / libdisk / change.c
1 /*
2  * ----------------------------------------------------------------------------
3  * "THE BEER-WARE LICENSE" (Revision 42):
4  * <phk@login.dknet.dk> 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  * $FreeBSD: src/lib/libdisk/change.c,v 1.14.2.5 2002/10/24 13:03:44 nyan Exp $
10  * $DragonFly: src/lib/libdisk/Attic/change.c,v 1.2 2003/06/17 04:26:49 dillon Exp $
11  *
12  */
13
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <unistd.h>
17 #include <fcntl.h>
18 #include <string.h>
19 #include <sys/types.h>
20 #include "libdisk.h"
21
22 void
23 Set_Bios_Geom(struct disk *disk, u_long cyl, u_long hd, u_long sect)
24 {
25         disk->bios_cyl = cyl;
26         disk->bios_hd = hd;
27         disk->bios_sect = sect;
28 }
29
30 void
31 Sanitize_Bios_Geom(struct disk *disk)
32 {
33         int sane;
34
35         sane = 1;
36
37 #ifdef PC98
38         if (disk->bios_cyl >= 65536)
39 #else
40         if (disk->bios_cyl > 1024)
41 #endif
42                 sane = 0;
43         if (disk->bios_hd > 16)
44                 sane = 0;
45 #ifdef PC98
46         if (disk->bios_sect >= 256)
47 #else
48         if (disk->bios_sect > 63)
49 #endif
50                 sane = 0;
51         if (disk->bios_cyl*disk->bios_hd*disk->bios_sect != disk->chunks->size)
52                 sane = 0;
53         if (sane)
54                 return;
55
56         /* First try something that IDE can handle */
57         disk->bios_sect = 63;
58         disk->bios_hd = 16;
59         disk->bios_cyl = disk->chunks->size / (disk->bios_sect*disk->bios_hd);
60
61 #ifdef PC98
62         if (disk->bios_cyl < 65536)
63 #else
64         if (disk->bios_cyl < 1024)
65 #endif
66                 return;
67
68         /* Hmm, try harder... */
69 #ifdef PC98
70         /* Assume standard SCSI parameter */
71         disk->bios_sect = 128;
72         disk->bios_hd = 8;
73 #else
74         disk->bios_hd = 255;
75 #endif
76         disk->bios_cyl = disk->chunks->size / (disk->bios_sect*disk->bios_hd);
77
78         return;
79 }
80
81 void
82 All_FreeBSD(struct disk *d, int force_all)
83 {
84         struct chunk *c;
85
86     again:
87         for (c = d->chunks->part; c; c = c->next)
88                 if (c->type != unused) {
89                         Delete_Chunk(d, c);
90                         goto again;
91                 }
92         c = d->chunks;
93         if (force_all) {
94                 Sanitize_Bios_Geom(d);
95 #ifdef PC98
96                 Create_Chunk(d, c->offset, c->size, freebsd, 0x494,
97                     CHUNK_FORCE_ALL, "FreeBSD");
98 #else
99                 Create_Chunk(d, c->offset, c->size, freebsd, 0xa5,
100                     CHUNK_FORCE_ALL);
101 #endif
102         } else {
103 #ifdef PC98
104                 Create_Chunk(d, c->offset, c->size, freebsd, 0x494, 0,
105                     "FreeBSD");
106 #else
107                 Create_Chunk(d, c->offset, c->size, freebsd, 0xa5, 0);
108 #endif
109         }
110 }