#include #include #include #include #include #include #include #include #include "main.h" #include "disk.h" #include "config.h" int dirent_add(char * block, __u32 inum, char * name) { struct ext2_dir_entry_2 * dirent; int myreclen; int orig_rec_len; myreclen = EXT2_DIR_REC_LEN(strlen(name)); for (dirent = (struct ext2_dir_entry_2 *)block; (void *)dirent < ((void *)block)+blocksize; ((void *)dirent) += dirent->rec_len) { if (dirent->rec_len - dirent->name_len >= myreclen) { orig_rec_len = dirent->rec_len; dirent->rec_len = EXT2_DIR_REC_LEN(dirent->name_len); orig_rec_len -= dirent->rec_len; ((void *)dirent) += dirent->rec_len; dirent->inode = inum; dirent->rec_len = orig_rec_len; dirent->name_len = strlen(name); dirent->file_type = 0; memcpy(dirent->name, name, strlen(name)); return 1; } } return 0; } int dirent_del(char * block, __u32 inum, __u32 lost_found_ino) { struct ext2_dir_entry_2 * dirent, * ldirent; for (ldirent = NULL, dirent = (struct ext2_dir_entry_2 *)block; (void *)dirent < ((void *)block)+blocksize; ldirent = dirent, ((void *)dirent) += dirent->rec_len) if (dirent->inode == inum) { if (!ldirent) { fprintf(stderr, "Internal error 32762:6448\n"); exit(-1); } if (dirent->name_len == 2 && !memcmp(dirent->name, "..", 2)) dirent->inode = lost_found_ino; else ldirent->rec_len += dirent->rec_len; return 1; } return 0; }