int main(int argc, char *argv[]) { // 局部变量 char buf[SECSIZE]; // FAT表表头标记 uchar fatStartContent[8] = {0xf8,0xff,0xff,0x0f,0xff,0xff,0xff,0xff}; struct direntry dire; uint dirClusNum; // 为文件分配的簇号 uint wClusNum; // 根目录簇号 uint fileSize; // 文件大小 uint cc, fd; // cc一次读取文件的字节数,打开文件的fd int rootWSize = 0; // 已向根目录写入的字节数 int fileWSize = 0; // 已向文件中写入的字节数 char filename[FNSIZE]; // 文件名 int i; static_assert(sizeof(int) == 4, "Integers must be 4 bytes!"); if(argc < 2){ fprintf(stderr, "Usage: mkfs fs.img files...\n"); exit(1); } initDat(); // 是否有需要断言 // ? fsfd = open(argv[1], O_RDWR|O_CREAT|O_TRUNC, 0666); if(fsfd < 0){ perror(argv[1]); exit(1); } printf("DBR : %d, retain sectors: %d, FAT sector: %d, 2 FATs, data sectors: %d, clusters: %d", nDBR, nRetain, nFAT, nData, nDataClus); // 清零fs for(i = 0; i < FSSIZE; i++) szero(i); // 向第0扇区写入DBR initDBR(); memset(buf, 0, sizeof(buf)); memmove(buf, &fatDBR, sizeof(fatDBR)); wsect(0, buf); // 写入FAT表头标记 rsect4bytes(fatFstSec, 0, fatStartContent); rsect4bytes(fatFstSec, 1, fatStartContent + 4); // 写入根目录 dire = mkFCB(T_DIR, "/", sizeof(DIR)*argc, &dirClusNum); dirClusNum = appendBuf(dirClusNum, &dire, sizeof(DIR), rootWSize); rootWSize += sizeof(DIR); wClusNum = dirClusNum; dire = mkFCB(T_DIR, ".", sizeof(DIR)*argc, &dirClusNum); wClusNum = appendBuf(wClusNum, &dire, sizeof(DIR), rootWSize); rootWSize += sizeof(DIR); dire = mkFCB(T_DIR, "..", 0, &dirClusNum); wClusNum = appendBuf(wClusNum, &dire, sizeof(DIR), rootWSize); rootWSize += sizeof(DIR); // 写入其他文件 for(i = 2; i < argc; i++){ fileWSize = 0; assert(index(argv[i], '/') == 0); fileSize = retFileSize(argv[i]); if((fd = open(argv[i], 0)) < 0){ perror(argv[i]); exit(1); } if(argv[i][0] == '_') ++argv[i]; // 写到目录区 strncpy(filename, argv[i], FNSIZE); dire = mkFCB(T_FILE, filename, fileSize, &dirClusNum); wClusNum = appendBuf(wClusNum, &dire, sizeof(DIR), rootWSize); rootWSize += sizeof(DIR); // 写入文件 while((cc = read(fd, buf, sizeof(buf))) > 0) { dirClusNum = appendBuf(dirClusNum, buf, cc, fileWSize); fileWSize += cc; } close(fd); } // 向第1扇区写入FSI initFSI(); memset(buf, 0, sizeof(buf)); memmove(buf, &fsi, sizeof(fsi)); wsect(1, buf); // 向备份FAT中写入相同的内容 for(i = fatFstSec; i < fatFstSec + nFAT; i++) { rsect(i, buf); wsect((i+nFAT), buf); } // // fix size of root inode dir // rinode(rootino, &din); // off = xint(din.size); // off = ((off/BSIZE) + 1) * BSIZE; // din.size = xint(off); // winode(rootino, &din); // balloc(freeblock); exit(0); }
void appendStruct(const T& s) { appendBuf(&s, sizeof(T)); }