feature(install): add system installer and FAT32 formatting utility

This commit is contained in:
boreddevnl
2026-05-08 21:03:51 +02:00
parent fd18369bd7
commit 91edd3bc78
5 changed files with 1191 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
// Copyright (c) 2023-2026 Chris (boreddevnl)
// This software is released under the GNU General Public License v3.0. See LICENSE file for details.
// This header needs to maintain in any file it is present in, as per the GPL license terms.
#include "../libc/syscall.h"
#include "../libc/stdlib.h"
#include "../libc/string.h"
#include "../libc/stdio.h"
static int sc_strcmp(const char *a, const char *b) {
while (*a && *a == *b) { a++; b++; }
return (unsigned char)*a - (unsigned char)*b;
}
int main(int argc, char **argv) {
const char *devname = NULL;
const char *label = "BOREDOS";
int fat_type = 32;
for (int i = 1; i < argc; i++) {
if (sc_strcmp(argv[i], "-F") == 0 && i + 1 < argc) {
fat_type = 0;
const char *s = argv[++i];
while (*s >= '0' && *s <= '9') fat_type = fat_type * 10 + (*s++ - '0');
} else if (sc_strcmp(argv[i], "-n") == 0 && i + 1 < argc) {
label = argv[++i];
} else if (sc_strcmp(argv[i], "-h") == 0 || sc_strcmp(argv[i], "--help") == 0) {
printf("mkfs.fat [OPTIONS] /dev/DEVICE\n");
printf(" -F 32 FAT type (32 only)\n");
printf(" -n LABEL Volume label (max 11 chars, default: BOREDOS)\n");
return 0;
} else if (argv[i][0] != '-') {
devname = argv[i];
if (devname[0]=='/' && devname[1]=='d' && devname[2]=='e' && devname[3]=='v' && devname[4]=='/')
devname += 5;
}
}
if (!devname) {
printf("Usage: mkfs.fat -F 32 [-n LABEL] /dev/DEVICE\n");
return 1;
}
if (fat_type != 32) {
printf("[ERROR] Only FAT32 (-F 32) is supported.\n");
return 1;
}
disk_info_t d;
int found = 0;
int n = sys_disk_get_count();
for (int i = 0; i < n; i++) {
if (sys_disk_get_info(i, &d) != 0) continue;
if (sc_strcmp(d.devname, devname) == 0) { found = 1; break; }
}
if (!found) { printf("[ERROR] Device not found: /dev/%s\n", devname); return 1; }
if (!d.is_partition) { printf("[ERROR] /dev/%s is a whole disk, not a partition.\n", devname); return 1; }
if (d.total_sectors < 65536) {
printf("[ERROR] Partition too small (< 32 MB) for FAT32.\n");
return 1;
}
printf("Formatting /dev/%s as FAT32 (label: %s)...\n", devname, label);
int ret = sys_disk_mkfs_fat32(devname, label);
if (ret != 0) { printf("[ERROR] Format failed.\n"); return 1; }
printf("Done.\n");
return 0;
}