/* * Creates an image */ void create_image(void* image, int size) { initrd = image; vol_header = (IFSVolume*)image; memset(vol_header, 0, size); vol_header->file_block_size = 1024; vol_header->block_pool_size = (0xFFFF * sizeof(IFSBlock)); placement = sizeof(IFSVolume) + (0xFFFF * sizeof(IFSBlock)) ; block_pool = (image + sizeof(IFSVolume)); for(int i = 0; i < 0xFFFF; i++) block_pool[i].state = BLOCK_NONEXISTENT; vol_header->root_directory = 0; IFSFileEntry* rootdir = ifs_create_file_entry(); rootdir->data_index = 1; IFSBlock* root = ifs_block_alloc(); memset(initrd + ifs_get_address(1), 0xFF, 1024); /* * Yes Courtney, even though you completely f****d me over * in just about every respect, I immortalized you in the IFS * magic number. Not that you will ever see this. Maybe because * I still love you, maybe because, well I have no f*****g clue.... * * Magic number: 0xCB0A0D0D (Big endian) */ vol_header->mag0 = 0xCB; vol_header->mag1 = 0x0A; vol_header->mag2 = 0x0D; vol_header->mag3 = 0x0D; }
static int ifs_symlink(struct device *dev, const char *from, const char *to) { int d_block = ifs_block_alloc(dev, 1024); struct ifs_entry dir; dir.mode = 0444; dir.file_type = IFS_LINK; dir.data_index = d_block; dir.file_size = 1024; dir.uid = getuid(); dir.gid = getgid(); strcpy(dir.file_name, basename(from)); int e = ifs_insert_entry(dev, from, &dir); device_write(dev, to, (strlen(to) + 1) % 1024, ifs_get_address(dev, d_block)); return 0; }
static int ifs_creat(struct device *dev, const char *path, mode_t mode) { int d_block = ifs_block_alloc(dev, 1024); struct ifs_entry dir; dir.mode = mode; dir.file_type = IFS_DIRECTORY; dir.data_index = d_block; dir.file_size = 0; dir.uid = getuid(); dir.gid = getgid(); strcpy(dir.file_name, basename(path)); int e = ifs_insert_entry(dev, path, &dir); int32_t files[256]; memset(files, 0xFF, 1024); device_write(dev, files, 1024, ifs_get_address(dev, d_block)); }
static inline int ifs_insert_entry(struct device *dev, const char *path, struct ifs_entry *entry) { int e_block = ifs_block_alloc(dev, 1024); entry->block_index = e_block; int parent = ifs_get_parent(dev, path); struct ifs_entry p_ent; device_read(dev, &p_ent, sizeof(struct ifs_entry), ifs_get_address(dev, parent)); int32_t *files = (int32_t *)kalloc(1024); device_read(dev, files, 1024, ifs_get_address(dev, p_ent.data_index)); int i = 0; while (files[i] != -1) i++; files[i] = e_block; device_write(dev, files, 1024, ifs_get_address(dev, p_ent.data_index)); device_write(dev, entry, sizeof(struct ifs_entry), ifs_get_address(dev, e_block)); kfree(files); return e_block; }