mirror of
https://github.com/JannisHeydemann/BoredOS.git
synced 2026-05-30 02:16:58 +00:00
feature(install): add system installer and FAT32 formatting utility
This commit is contained in:
66
src/userland/cli/mkfs_fat.c
Normal file
66
src/userland/cli/mkfs_fat.c
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user