[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] fdisk: Bugfix
From: Nico Mayer <nico.mayer@xxxxxxxxxxxxxxxx>
! fdisk: In der Headerdatei partition.h werden zwei globale Variablen definiert (device_name und device_numheads). Dies kann zu einem Fehler beim Compilieren führen. Die beiden gobalen Variablen sollten sattdessen in partition.c definiert werden.
---
src/modules/c/fdisk/partition.c | 48 ++++++++++++++++++---------------
src/modules/c/fdisk/partition.h | 17 ++++++------
2 files changed, 36 insertions(+), 29 deletions(-)
diff --git a/src/modules/c/fdisk/partition.c b/src/modules/c/fdisk/partition.c
index 0ee0645a..9bc06418 100644
--- a/src/modules/c/fdisk/partition.c
+++ b/src/modules/c/fdisk/partition.c
@@ -39,6 +39,12 @@
#include "partition.h"
#include "typeids.h"
+/// Ein Zeiger auf argv[1] oder besser gesagt den Laufwerksnamen
+char* device_name;
+
+/// Anzahl der Heads
+unsigned long device_numheads;
+
/// Kopie des MBR
unsigned char mbr[512];
@@ -53,10 +59,10 @@ void uncompress_chs(uint8_t* compressed, unsigned int* cylinder,
unsigned int* head, unsigned int* sector)
{
*head = compressed[0];
-
+
*cylinder = (compressed[1] & 0xC0) << 2;
*cylinder += compressed[2];
-
+
*sector = compressed[1] & 0x3F;
}
void compress_chs(uint8_t* compressed, unsigned int cylinder,
@@ -74,12 +80,12 @@ void compress_chs(uint8_t* compressed, unsigned int cylinder,
if (sector < 1) {
sector = 1;
}
-
+
compressed[0] = head;
-
+
compressed[1] = (cylinder & 0x300) >> 2;
compressed[1] += sector;
-
+
compressed[2] = cylinder & 0xFF;
}
unsigned int chs2lba(unsigned int cylinder, unsigned int head,
@@ -100,7 +106,7 @@ void lba2chs(unsigned int lba, unsigned int* cylinder, unsigned int* head,
int apply_changes()
{
// TODO extended/logical partitions unterstuetzen
-
+
// Datei/Laufwerk oeffnen
FILE* dev = fopen(device_name, "w");
if (dev == 0) {
@@ -108,7 +114,7 @@ int apply_changes()
"Aenderungen wurden nicht geschrieben!\n", device_name);
return -1;
}
-
+
// Die im RAM liegende Kopie des MBR aktualisieren, ohne jedoch den Code-
// Teil zu aendern
int i;
@@ -126,24 +132,24 @@ int apply_changes()
sizeof(struct partition_entry_t));
}
}
-
+
// Die Boot Signature nocheinmal setzen, um sicher zu gehen, dass diese
// auch wirklich korrekt ist
uint16_t* signature = (uint16_t*)(mbr + BOOT_SIGNATURE_POS);
*signature = BOOT_SIGNATURE;
-
+
// Neuen MBR schreiben, den Output Buffer leeren und die Datei schliessen
fwrite(mbr, 1, 512, dev);
fflush(dev);
fclose(dev);
-
+
return 0;
}
void delete_partition(struct partition_t* p)
{
// TODO extended/logical partitions unterstuetzen
-
+
memset(&(p->data), 0, sizeof(struct partition_entry_t));
p->number = 0;
p->exists = 0;
@@ -159,10 +165,10 @@ static void create_new_mbr_partition_table(void)
int read_partitions(char* filename)
{
// TODO extended/logical partitions unterstuetzen
-
+
// Dateinamen speichern
device_name = filename;
-
+
// Laufwerk/Datei oeffnen und MBR lesen
FILE* dev = fopen(filename, "r");
if (dev == 0) {
@@ -170,7 +176,7 @@ int read_partitions(char* filename)
return -1;
}
fread(mbr, 1, 512, dev);
-
+
// Boot Signature ueberpruefen
if (*(uint16_t*)(&mbr[BOOT_SIGNATURE_POS]) != BOOT_SIGNATURE) {
printf("Ungueltige Boot Signatur!\nfdisk wird eine neue Partitions"
@@ -178,7 +184,7 @@ int read_partitions(char* filename)
"beachtet werden.\n");
create_new_mbr_partition_table();
}
-
+
// Die Partitionstabelle analysieren und in die internen Strukturen
// kopieren
int i;
@@ -190,7 +196,7 @@ int read_partitions(char* filename)
if (mbr_partitions[i].data.type) {
mbr_partitions[i].number = i + 1;
mbr_partitions[i].exists = 1;
-
+
// Handelt es sich um eine extended Partition?
if (mbr_partitions[i].data.type == TYPE_EXTENDED_PARTITION_1 ||
mbr_partitions[i].data.type == TYPE_EXTENDED_PARTITION_2 ||
@@ -209,10 +215,10 @@ int read_partitions(char* filename)
mbr_partitions[i].type = PARTITION_TYPE_PRIMARY;
}
}
-
+
// Datei schliessen
fclose(dev);
-
+
return 0;
}
@@ -220,19 +226,19 @@ void create_partition(struct partition_t* p, unsigned int number,
unsigned int start_lba, unsigned int end_lba)
{
// TODO extended/logical partitions unterstuetzen
-
+
// Die LBA Daten ins CHS Format konvertieren
unsigned int start_cyl, start_head, start_sec;
lba2chs(start_lba, &start_cyl, &start_head, &start_sec);
unsigned int end_cyl, end_head, end_sec;
lba2chs(end_lba, &end_cyl, &end_head, &end_sec);
-
+
// Daraus die "komprimierten" CHS Eintraege erstellen
uint8_t start_chs[3];
compress_chs(start_chs, start_cyl, start_head, start_sec);
uint8_t end_chs[3];
compress_chs(end_chs, end_cyl, end_head, end_sec);
-
+
// Die Strukturen entsprechend anpassen
p->exists = 1;
p->number = number;
diff --git a/src/modules/c/fdisk/partition.h b/src/modules/c/fdisk/partition.h
index 8955983f..e02868a1 100644
--- a/src/modules/c/fdisk/partition.h
+++ b/src/modules/c/fdisk/partition.h
@@ -55,13 +55,8 @@
#define PARTITION_TYPE_EXTENDED 1
#define PARTITION_TYPE_LOGICAL 2
-/// Ein Zeiger auf argv[1] oder besser gesagt den Laufwerksnamen
-char* device_name;
-
-/// Anzahl der Heads
-unsigned long device_numheads;
-/**
+/**
* Ein einzelner Eintrag der Partitionstabelle, wie er auch auf der Festplatte
* vorkommt.
*/
@@ -81,7 +76,7 @@ struct partition_t
int exists; ///< 1, wenn die Partition existiert; 0 wenn nicht
unsigned int number; ///< Nummer der Partition, beginnend mit 1
int type; ///< 0 = primary, 1 = extended, 2 = logical
-
+
struct partition_entry_t data; ///< Die eigentlichen Daten
};
@@ -116,10 +111,16 @@ void delete_partition(struct partition_t* p);
void create_partition(struct partition_t* p, unsigned int number,
unsigned int start_lba, unsigned int end_lba);
-/// Kopie des MBR
+/// Kopie des MBR
extern unsigned char mbr[512];
/// Array fuer die Primary Partitions
extern struct partition_t mbr_partitions[4];
+/// Ein Zeiger auf argv[1] oder besser gesagt den Laufwerksnamen
+extern char* device_name;
+
+/// Anzahl der Heads
+extern unsigned long device_numheads;
+
#endif
--
2.26.2